问题描述
在 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)