MySQL 5.1同步到5.5卡库问题一则

2015-01-21 12:22:43 · 作者: · 浏览: 6

今天在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


--------------------------------------分割线 --------------------------------------


--------------------------------------分割线 --------------------------------------