天天看點

MySQL Error 1048 奇遇記

上周遇到次奇葩的同步錯誤,error 1048 , 看似是簡單的not null導緻,但是為什麼master可以執行,slave不行呢?為什麼5.1的slave可以,5.6的slave不行呢? 帶着很多疑問,準備來一窺究竟

這裡總結一下我遇到過的錯誤,分三種情況,雖然都是由于null引起,但是1048才是重點。

timestamp字段類型,為什麼master執行成功,同步到slave報錯?

int字段類型,5.1(master)<--- 5.6(slave),同步報錯?

int字段類型,5.6(master)<--- 5.6(slave),同步報錯?

接下來,開始進入主題

結論:master上explicit_defaults_for_timestamp=0,slave上explicit_defaults_for_timestamp=1,會出現這種錯誤。

解決方案:

保證master和slave explicit_defaults_for_timestamp 一緻。

前端過濾掉null。

解決方案

配置java或者修改java源碼,讓其不要更改mysql的sql_mode

臨時解決方案: insert ignore xxx;

sql_mode的規範。

來自case when的奇葩錯誤

結論

最終binlog并不是rbr,是以會報錯。

臨時解決方案: insert ignore xxx. 然後再用pt-table-checksum && pt-sync等修複。

禁止case when語句。

<a href="http://dev.mysql.com/doc/refman/5.6/en/error-messages-server.html#error_er_bad_null_error">mysql reference 5.6 error code</a>