Error number: 1677; Symbol: ER_SLAVE_CONVERSION_FAILED; SQLSTATE: HY000
Message: Column %d of table '%s.%s' cannot be converted from type '%s' to type '%s'
这是MySQL官方文档里的提示,其实很直接,就是两边的表结构(Column定义)不一致导致的。那么我们碰到这个问题该如何解决呢?
突然,有报警来了说,主从复制中断,但是有报错。报错code就是1677。但是没有特别详细的报错信息:[ERROR] Slave SQL for channel '': Worker 2 failed executing transaction 'c7ce4eab-e267-11e9-a020-00163e01d452:221617008' at master log mysql-bin.000960, end_log_pos 385262704; , Error_code: 1677
从日志的报错信息,来看一点有用的信息都没有。还得自己去解析对应的binlog来查看。看了一个之后,后面的报错信息依然。于是去官方查了下相关的资料。发现一个参数“slave_type_conversions”,配置成“all_non_lossy”可以无损转化。于是配置上此参数后,继续重新启动主从复制。在配置此参数后,在日志中,终于有了有用的信息如下:[ERROR] Slave SQL for channel '': Worker 1 failed executing transaction 'c7ce4eab-e267-11e9-a020-00163e01d452:221617008' at master log mysql-bin.000960, end_log_pos 385262704; Column 37 of table 'xxx.xxxx' cannot be converted from type 'varchar(60(bytes))' to type 'tinyint(3) unsigned', Error_code: 1677
跟着日志一步一步解决,即可让主从复制恢复正常。此次故障的结果来说还算完美。
自己的一些看法:虽然故障解决了,但是还得去做主从数据一致性性的校验。数据量小的时候还算可以。但是数据量大就比较麻烦了。