La inconsistencia maestro-esclavo de MySQL conduce a la columna desconocida 'xxx' en la 'lista de campos'

Asistente de ahorro de flujo

El proyecto utiliza Mysql maestro-esclavo y separa la lectura y la escritura, pero ingresó un nombre de archivo incorrecto al configurar el archivo binlog de sincronización, lo que provocó que el contenido actualizado de la biblioteca maestra no se sincronizara con la biblioteca esclava y porque la estructura de la tabla era modificado durante el período, por lo que cuando la interfaz inicia una solicitud a la biblioteca esclava, la solicitud falla (columna desconocida 'xxx' en la 'lista de campos') porque la estructura de la tabla de la biblioteca esclava no puede corresponder a la instancia. Todas las interfaces anteriores implicaban operaciones de escritura y todas operaban en la biblioteca principal, por lo que no ocurrieron los problemas anteriores.
Solución: configure la relación maestro-esclavo y sincronice manualmente la biblioteca maestro-esclavo.

Análisis y posicionamiento de problemas.

El código del problema es el siguiente:

    @DS(DataSourceConstant.SLAVE)
    @Override
    public CouponEntity getById(Serializable id) {
    
    
        ValueOperations<String,CouponEntity> couponOps = redisTemplate.opsForValue();

        String key = COUPON_TEMPLATE_PREFIX+id;
        CouponEntity couponEntity = couponOps.get(key);
        if(couponEntity!=null){
    
    
            return couponEntity;
        }else{
    
     // 将模版查询好放入到redis缓存中
            System.out.println("查询");
            CouponEntity entity = this.baseMapper.selectById(id);
            System.out.println(entity);
            couponOps.set(key,entity);
            return entity;
        }
    }

El contenido de la función es una declaración de consulta general, pero hubo un problema en la prueba. Después de verificar cuidadosamente los campos de la base de datos, no se encontró ningún problema y no hubo problemas con otras interfaces antes. Es decir, no habrá ningún problema al llamar a couponDao directamente, pero sí al llamar a couponDao a través de este método, el código de prueba es el siguiente:

@RunWith(SpringRunner.class)
@SpringBootTest
public class CouponApplicationTests {
    
    

    @Autowired
    CouponService couponService;

    @Autowired
    CouponDao couponDao;

	// 这个测试会报错Unknown column 'xxx' in 'field list'
    @Test
    public void TestEhCache() {
    
    
        couponService.getById(9);
        couponService.getById(9);
    }

	// 下面这个测试正常,没有报错
    @Test
    public void Testmysql() {
    
    
        couponService.getBaseMapper().selectById(9);
        couponDao.selectById(9);
    }
}

Se puede analizar que no hay problema en el mapeo entre la instancia y los campos de la tabla de la base de datos, y las sentencias SQL solicitadas son las mismas, por lo que el posible problema es el error causado por los diferentes entornos de base de datos de los dos métodos.

Hay una anotación @DS en el código del problema, su función es cambiar la fuente de datos, cambiar a la biblioteca esclava y, si no se declara, pasará de forma predeterminada a la biblioteca maestra. Utilice Navicat para ver y encontrar que la estructura de la tabla de la biblioteca esclava y la biblioteca maestra son inconsistentes.
Utilice show esclavo status; para ver el estado de la biblioteca esclava.
Utilice show master status; para ver el estado de la biblioteca maestra.
Se descubre que el binglog (mysql-bin.xxxx) de los dos es inconsistente, es decir, la configuración de sincronización maestro-esclavo falla.
En este punto, solo necesita establecer la relación correcta de sincronización maestro-esclavo y sincronizar manualmente la biblioteca maestra y la biblioteca esclava.

Sincronizar manualmente las bases de datos maestra y esclava

El método de sincronización consiste en completar la sincronización reproduciendo el archivo SQL de respaldo y
se divide en los siguientes pasos:
1. Obtenga el archivo SQL de respaldo de la tabla que se sincronizará y ejecútelo en la máquina de base de datos principal.

# mysqldump -u<用户名> -p -h<主机地址> <数据库名> <表名> > <备份文件名>
mysqldump -uroot -p -hlocalhost greensource_sms sms_coupon_history > sms_coupon_history.bak.sql

2. Transfiera la copia de seguridad a la máquina de la biblioteca esclava
3. Conéctese a la biblioteca esclava mysql, use la fuente para reproducir sql

source /sms_coupon_history.bak.sql

Preste atención a la ruta del archivo
4. Establezca la relación maestro-esclavo correcta

change master to master_host = '主库主机', master_user = '同步用户名', master_port=端口, master_password='密码', master_log_file = '主库的mysql-bin.xxxxxxxx', master_log_pos=主库的position;
start slave;
show slave status;

Solo espere a que se ejecute el sql.

Supongo que te gusta

Origin blog.csdn.net/weixin_45654405/article/details/127351433
Recomendado
Clasificación