解决字符集不同引起的主从同步异常1677报错问题

2021-03-03 10:02:44 浏览数 (1)

之前的一篇文章中,我们遇到了主从同步的一个问题,错误代码:1236,详细请看 开启GTID主从同步出现1236错误问题

今天,突然发现测试环境的主从同步关系断开了,报错代码:1677

一、问题错误信息

Last_SQL_Errno: 1677

Last_SQL_Error: Column 0 of table ‘wjq.test_profile’ cannot be converted from type ‘varchar(1536(bytes))’ to type ‘varchar(2048(bytes) utf8mb4)’

二、分析原因

1、首先根据slave的同步状态解析一下binlog日志,看一下具体的报错信息时候所执行的语句(解析的是从库的relaylog),从binlog中发现,TABLE_CATALOG字段为VARSTRING(1536),

2、从库检查报错表的建表语句

字符集为utf8mb4

在主库查看表的建表语句

主库表的字符集为utf8

三、解决方法

代码语言:javascript复制
root@localhost [3308][(none)]>stop slave;
Query OK, 0 rows affected (0.00 sec)
 
root@localhost [3308][(none)]>alter table wjq.test_profile convert to character set utf8;          
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
root@localhost [3308][(none)]>start slave;
Query OK, 0 rows affected (0.00 sec)

四、小结

从上面的报错中,我们发现了主从同步报错的根本原因:

1.、在建表语句在没有显示的指定字符集的时候,会根据库的默认字符集建表,所以主库的表test_profile的字符集是utf8

2.、建表语句在没有指定字符集的时候,binlog里面也不会记录字符集格式,导致在从库新建表的时候根据库级别的字符集选择了utf8mb4的字符集,新增记录就报错了

0 人点赞