之前的一篇文章中,我们遇到了主从同步的一个问题,错误代码: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的字符集,新增记录就报错了