MySQL从库的列类型不一致导致的复制异常问题

官方文档:https://dev.mysql.com/doc/refman/5.6/en/replication-features-differing-tables.html

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

这样即可解决这个问题。

时间: 2024-08-10 11:00:57

MySQL从库的列类型不一致导致的复制异常问题的相关文章

mysql之数据表列类型和列约束一

mysql数据表在定义列时,需要确定列的数据类型,以及列的相关属性或是说约束,那么mysql的列类型大致可分为如下: 列类型可分为如下: 1.数值类型 又分为整数和小数 2.时间和日期类型 3.字符类型 稍微有C基础的同学应该不是很陌生,这里呢我不会讲解太多,稍微解释一下就行. 整数部分 整数部分要注意的地方就是字节以及有符号和无符号的区别 我们知晓1byte=8bit 那么2的8次方就是0-255之间 有进制转换的同学应该知道了,那么有符号和无符号是指他需要1位来标识正负数,所以要减去1位,自

MySQL学习笔记——2.列类型

1.tinyint 占一个字节,取值范围为-128~127 unsigned:无符号,即无负数(0~255) 常用于boolean类型/体重等数据的体现 2.int //整型 占四个字节 zerofill:零填充,无需指定unsigned 3.decimal(m,d) //浮点型 相对于float而言,其更为精确 m,d:总位数,小数所占位数 4.char(m) //定长型 m的取值范围为0~255 对于不够m长的数据会自动添加空格,虽有浪费,但速度更快 5.varchar(m) //变长型 m

MySQL支持的列类型

MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述.概述有意简化,更详细的说明应该考虑到有关特定列类型的附加信息,例如你能为其指定值的允许格式. 由MySQL支持的列类型列在下面.下列代码字母用于描述中: M 指出最大的显示尺寸.最大的合法的显示尺寸是 255 . D 适用于浮点类型并且指出跟随在十进制小数点后的数码的数量.最大可能的值是30,但是应该

框架中无效的列类型异常分析

org.springframework.jdbc.UncategorizedSQLException: Error setting null for parameter #5 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 无效的

MySQL服务 - MySQL列类型、SQL模式、数据字典

一.MySQL列类型的作用: 列类型可以简单理解为用来对用户往列种存储数据时做某种范围"限定",它可以定义数据的有效值(字符.数字等).所能占据的最大存储空间.字符长度(定长或变长).是否能够被索引.如何被索引及如何排序等.在关系型数据库系统中,为了实现数据的易于管理,必须为表字段(列)指定对应的列类型.MySQL的列类型可以分为4类:字符型.数值型.日期及时间型.自有类型. 1.字符型: 字符型限定值只能为字符,MySQL的字符类型如下: 类型 最大字符长度 名称及特性 char 2

MySql学习 (一) —— 基本数据库操作语句、三大列类型

在使用MySql的时候,基本都是用图形化工具,如navicat.最近发现连最基本的创建表的语法都快忘了... 所以,想要重新系统性的学习下MySql,为后面学习MySql的一些高级查询,MySql性能和SQL语句的优化等打个基础. 用博客来记录下学习的过程,方便以后查阅和加强记忆.有错误的地方还请指出! 一.MySql的基本操作命令 注: <>表示参数.[]表示可选项 连接数据库:mysql> mysql -u<username> -p<password>; 显示

MySQL数据库8(七)列类型

列类型 整数类型 tinyint 迷你整型,系统采用一个字节来保存的整型,一个字节=8byte,最大能表示的数据是0-255. smallint 小整型,系统采用两个字节来保存的整型,能表示0-65535之间的整型 mediumint 中整型,采用三个字节来保存数据 int 整型,(标准整型),采用四个字节来保存数据. bigint 大整型,采用八个字节来保存数据. 实际应用中,应该根据对应的数据范围来选定对应的整型类型,通常使用的比较多的是tinyint和int. 无符号标识设定 无符号,表示

Mysql列类型

数值型 整型: tinyint:微小的列类型,1个字节,默认有符号,存储范围:-128--127 可选属性:tingyint(M) unsigned zerofill M:宽度(在0填充(zerofill)时才有效),只是显示效果,不影响实际数据的存储范围;unsigned:无符号类型 注意:如果某列是zerofill,那么则是unsigned. smallint:2个字节 mediumint:3个字节 int:4个字节 bigint:8个字节 举例: 创建一个表: 1 create table

mysql 列类型以及属性特点

整形列: 一个字节有8个位,例如:int 类型的列存入数字1,00000000 00000000 00000000 00000001它就在最低位置上存入一个1,由此可见是极大的浪费资源,所以在建立列类型的时候,依实际情况而定. 整型列的可选属性有: unsigned 非负 zerofill 零填充 (M)M表示固定宽度,它主要用于学号编码等,可以用0填至固定宽度.注意:有零填充的列数据库默认为unsigned,即非负. 例如:存入当前列数字1,固定宽度设置5,则存入数据库的数据显示为00001