天天看点

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>