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