以前statement复制下做表结构变更时,一般是一台一台的从库依次去做,最后做主库。

今天在一台从库上进行表结构变更时却遇到一个复制报错,
Last_Errno: 1677
Last_Error: Column 7 of table ‘user_0.user_00′ cannot be converted from type ‘varchar(10)’ to type ‘varbinary(30)’

原变更语句为
alter table user_00 modify `column7` varbinary(30) NOT NULL DEFAULT ”;

原表中此字段类型为
`column7` varbinary(10) NOT NULL DEFAULT ”

s 命令显示此从库为5.5格式,并且复制是row格式。

官网查询后,发现这并不是一个bug,

http://bugs.mysql.com/bug.php?id=59424

在5.5的row格式复制中,有参数
slave_type_conversions来控制复制中主从结构不一致的处理

取值见下表:

默认为”,即不支持主从字段类型不一致,
其它3种类型为:
all_lossy 支持有损转换,如int–>tinyint
all_non_lossy 支持无损转换,如char(20)–>varchar(25)
all_lossy,all_non_lossy 支持所有转换

此时手工在从库上执行:
stop slave;
set global slave_type_conversions=ALL_LOSSY;
start slave;

复制恢复正常