一、背景
mysql版本为5.7.2,存储引擎使用InnoDB, 默认字符集使用utf8mb4。主从复制模式为多主一从,在多个主库写入数据并汇总到从库供web后台读取,并没有使用中间件和pt工具集对主从状态进行监控。
二、 报错场景复原
通过navicat远程连接在某一主库新建了一张表,建表语句如下:
DROP TABLE IF EXISTS tb_tmp_test;
CREATE TABLE tb_tmp_test
(
id int auto_increment primary key,
columnA int,
columnB int,
mark varchar(50)
);
查看主库和从库均建表成功。于是开始向主库表中插入数据。写入了近1万条数据后查看从库表数据,发现表为空。查看从库slave状态,发现报错:
Last_SQL_Errno : 1677
Last_SQL_Error : Column 3 of table 'db_test.tb_tmp_test' cannot be converted from type 'varchar(150(bytes))' to type 'varchar(200(bytes) utf8mb4)'
三、 错误原因排查
根据报错提示,是由于字符编码格式转化导致的报错,分别查看主库和从库的表结构:
主库:show create table tb_tmp_test;
CREATE TABLE `tb_tmp_test` (
`id` int(11) NOT NULL AUTO_INCREM