上周遇到次奇葩的同步錯誤,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>