MySQL从库的列类型不一致导致的复制异常问题-创新互联
官方文档:https://dev.mysql.com/doc/refman/5.6/en/replication-features-differing-tables.html
创新互联公司主营久治网站建设的网络公司,主营网站建设方案,重庆APP软件开发,久治h5微信小程序定制开发搭建,久治网站营销推广欢迎久治等地区企业咨询slave_type_conversions 这个参数在mysql5.5.3引入,目的是启用row格式的bin-log的时候,如果主从的column的数据类型不一致,会导致复制失败,mysql5.5.3之后支持,主库是int从库是bigint这种类型的复制,
这个参数的意义就是控制些类型转换容错性。
如果从库的字段类型范围比主库类型大,那么设置slave_type_conversions=ALL_NON_LOSSY后复制没有问题的。
如果从库类型比主库类型小,比如从int复制到tinyint,虽然可以通过设置slave_type_conversions=ALL_LOSSY,ALL_NON_LOSSY让主从不出问题,但是实际上会造成数据丢失的风险。
几种值的设置:
ALL_LOSSY:允许数据截断
ALL_NON_LOSSY:不允许数据截断,如果从库类型大于主库类型,是可以复制的,反过了,就不行了,从库报复制错误,复制终止。
ALL_LOSSY,ALL_NON_LOSSY:所有允许的转换都会执行,而不管是不是数据丢失。
空值(不设置):要求主从库的数据类型必须严格一致,否则都报错。
Mode | Effect |
ALL_LOSSY | In this mode, type conversions that would mean loss of information are permitted. This does not imply that non-lossy conversions are permitted, merely that only cases requiring either lossy conversions or no conversion at all are permitted; for example, enabling only this mode permits an INT column to be converted to TINYINT (a lossy conversion), but not a TINYINT column to an INT column (non-lossy). Attempting the latter conversion in this case would cause replication to stop with an error on the slave. |
ALL_NON_LOSSY | This mode permits conversions that do not require truncation or other special handling of the source value; that is, it permits conversions where the target type has a wider range than the source type.【确保从库的列类型更宽泛些也不会导致复制报错】 Setting this mode has no bearing on whether lossy conversions are permitted; this is controlled with the ALL_LOSSY mode. If only ALL_NON_LOSSY is set, but not ALL_LOSSY, then attempting a conversion that would result in the loss of data (such as INT to TINYINT, or CHAR(25) to VARCHAR(20)) causes the slave to stop with an error. |
ALL_LOSSY,ALL_NON_LOSSY | When this mode is set, all supported type conversions are permitted, whether or not they are lossy conversions. |
ALL_SIGNED | Treat promoted integer types as signed values (the default behavior). |
ALL_UNSIGNED | Treat promoted integer types as unsigned values. |
ALL_SIGNED,ALL_UNSIGNED | Treat promoted integer types as signed if possible, otherwise as unsigned. |
[empty] | When slave_type_conversions is not set, no attribute promotion or demotion is permitted; this means that all columns in the source and target tables must be of the same types. This mode is the default. |
生产环境一个案例:
从库是有个oracle系统去查数据的,原先从库的cp_shop_activity表示utf8mb4字符集,oracle不支持。因此在这个从库上手动修改了mode字段的字符类型为varchar(200) utf8,修改后的字段类型如下图:
但是没几天后,发现主从复制报错了,错误码1677。从库上记录的错误日志如下:
我们看下主库的mode字段是varchar(50),从库的mode字段是varchar(200)。
在从库设置:
stop slave;
set global slave_type_conversions=ALL_NON_LOSSY;
#默认slave_type_conversions为空,表示强制从库和主库的字段类型一致,不然就停止复制。设置为ALL_NON_LOSSY就稍微宽泛些同时确保不会造成类型转换的问题。
start slave;
show slave status\G
这样即可解决这个问题。
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
分享标题:MySQL从库的列类型不一致导致的复制异常问题-创新互联
本文来源:http://pwwzsj.com/article/copjig.html