「MySQL」- cannot be converted from type x to type y

  CREATED BY JENKINSBOT

问题描述

在 MySQL 主从复制时,产生如下错误:

Column 0 of table 'database_name.table_name' cannot be converted from type 'int' to type 'bigint(20)'

根据提示是int类型无法转换为bigint类型,但是原因是什么?

系统环境

属性 参数
MySQL Master-Master Replication
SELECT @@version; 5.7.20-log
SELECT @@binlog_format; ROW
SELECT @@slave_type_conversions;  

问题原因

首先,数据库的SQL语句是执行成功后,才写入二进制日志中的。

# 在我们的场景中

这也是推测出来:当时主库的二进制日志还没有完全同步到从库,我们对从库的字段进行了修改,从int修改为bigint类型。并且数据库没有设置slave_type_conversions属性,因此主从之间不允许类型转换。二进制日志为ROW格式,而二进制日志中的字段为int类型,但是目标中为bigint类型。

另外我们开启了log_slave_updates属性,但是从库的binlog中并没有找到来自主库的记录。

解决办法

int转换为bigint是无损的,所以可以进行slave_type_conversions=ALL_NON_LOSSY设置。

或者不要在二进制日志同步期间进行这些操作。其实还是要懂数据库里的一些细节上的东西。

然而,事情向来不会这么简单。在「ERROR 1677: Column of table cannot be converted from type varchar(0) to type varchar(20)」一文中,作者通过执行REPAIR TABLE修复了该问题。

参考文献

5.2.4.2. Setting The Binary Log Format
16.1.6.3 Replication Slave Options and Variables/slave_type_conversions
Row-based replication: attribute promotion and demotion.
Type conversion modes (slave_type_conversions variable).
MySQL Row-Based Binary Logs
Is MySQL Replication Affected by a High-Latency Interconnect?
MySQL binary log – write operation
4.1.10.2 Replication of Columns Having Different Data Types
MySQL Row-Based Binary Logs
ERROR 1677: Column of table cannot be converted from type varchar(0) to type varchar(20)