今天在MySQL 5.1同步到5.5时遇到一则卡库问题,在从库上show slave status \G,报错如下:
为何在主库上能执行,在从库上就会失败呢?
在从库上,show create table 查看表结构:
发现grp_status_cnt 列为无符号的整数类型。 查询一下grp_status_cnt的值:
27-38后得到的是负数。
官方手册中有一段话:对于无符号数,如果相减得到负数,mysql会自动转化为最大的正数。
在5.1上执行如下语句:
但是在5.5上执行的时候就会报错:
按照官方文档的解释,在5.1上,当相减得到负数,马上就被转化为18446744073709551615,而它超出了无符号整数的范围,所以被转化为最大的int类型的无符号数4294967295(但是在5.5上,这个转化报错,因此导致同步中断)。
回到生产数据库,在主库上,执行:
可以发现这种溢出的情况很多,它们其实都是从负数转化来的,这些数据从应用的角度来说,都是错误的。
解决从库卡库问题的办法很多,常用的有如下几种:
但是watch的时间间隔最小只能到1s,因此只适合跳过少数卡库的命令点。如果从库卡库累积的命令点非常多,此法就不可取了。
http://dev.mysql.com/doc/refman/5.1/en/numeric-types.html
http://dev.mysql.com/doc/refman/5.1/en/out-of-range-and-overflow.html
--------------------------------------分割线 --------------------------------------
--------------------------------------分割线 --------------------------------------