以前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;

復制恢復正常