我已经设置了两个复制从属服务器,一个在 CentOS(x86_64 5.1.37) 上,另一个在 Ubuntu LTS(x86_64 mysql 5.5.38) 上。除了表中的一列外,它们似乎都正确复制了大部分主数据库(CentOS i686,mysql 5.5.37)。
有问题的列被创建为int(11) DEFAULT NULL
,记录 Unix 纪元的时间戳,应该还未达到 2038 年。然而,当我尝试比较主服务器和从服务器中的数据时,我发现从服务器中最近复制的行已变为2147483647
或 INT32_MAX。顺便说一句,主服务器的情况并非如此。
二进制日志格式架构是否特定?我该如何解决这个问题?或者至少确保从属服务器上的数据库在切换到主服务器后不会再记录任何异常时间戳?
答案1
问题的根源很愚蠢。
我仔细检查了 MySQL 二进制日志,发现插入语句很可疑。
所讨论的列具有诸如 0x3134...30 之类的值作为时间戳值,它似乎是一个字符串值,而不是预期的整数。
顺着这个线索,我发现 PHP 端的参数绑定调用对该列使用了错误的类型签名。主服务器默默地接受了错误的类型并自行更正,而从服务器未能意识到类型问题,导致整数溢出。