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

问题描述

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

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

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

系统环境

属性参数
MySQLMaster-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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值