2013年5月9日木曜日

Last_SQL_Errno: 1677 にであった

珍しいエラーでSQLスレッドが止まっていた。

mysql> SHOW SLAVE STATUS\G
..

               Last_SQL_Errno: 1677
               Last_SQL_Error: Column 0 of table 'd1.t1' cannot be converted from type 'int' to type 'bigint(20)'
..

なにこれ。初めて見た。
mysqlbinlogで止まっているリレーログのエントリを当たると、ROWフォーマットで記録されたUPDATEステートメントに遭遇。
binlog_format = MIXEDなので、ORDER BYなしのLIMIT使ったUPDATEでも投げたのかな。。


で、まあ、非決定性のクエリ投げるなよは置いておいて。
INT型をBIGINT型に変換できないとか言ってるけど、なんだよ変換って。。

原因はマスターとスレーブのテーブルで、データ型が違うカラムがあったからorz
STATEMENTベースのレプリケーションだと問題にならないけど、
ROWベースのレプリケーションだとこのエラーに遭遇する。

ちなみに、マスター側テーブルのカラムをVARCHAR(100)、
スレーブ側をVARCHAR(50)にしてもこのエラーにぶち当たった。

ただ、エラーメッセージにtype 'varchar(300) to type 'varchar(50)'って書いてあったんだけど、
UTF-8だから1文字3byteで、バイナリログにはバイト数で情報書いてるんだろうなとか思うだけ思って調べなかった。


教訓: バッチ用スレーブだからって無茶はいけない。

0 件のコメント :

コメントを投稿