MySQL 5.0 中相同的表可能有不同的校验和,是否有任何原因,如果是这样,有什么方法可以解决这个问题吗?
我有两个复制的数据库,它们的校验和莫名其妙地不同。第一次发生这种情况时,在我能够正确复制它并提出这个问题之前它就消失了,现在同一周内发生了第二次。
当我手动检查表时,它们是完全相同的,即每一行的校验和都对应相同,表结构相同,并且它们运行在相同版本的 MySQL 上(
5.0.96-community-nt-log
),更重要的是数据库复制(Slave_IO_Running
和 Slave_SQL_Running
)报告正常运行。
校验和怎么可能不同?
数据库A:
MySQL [libertyintelligence]> select md5(concat(LS_MapAssetLinkId,LS_Map,LS_Asset,LS_X,LS_Y,LS_MinZoom,LS_MaxZoom,LS_ZOrder)) from ls_mapassetlink;
+----------------------------------+
| md5(...) |
+----------------------------------+
| c3c060c7c514ac3e410b50c0eb0f63f9 |
| a97a117c63f9a2472b96e517c303e42f |
| 946dacb76c8e2919d1ce791211da660c |
| 112a10fe77558beca686ec2c9281ce7d |
| 271b8de08f13252ff0e58ac20590c9ce |
| 837e88605f4a7b1e0f2a78d40bf8ce1f |
+----------------------------------+
6 rows in set (0.00 sec)
MySQL [libertyintelligence]> checksum table ls_mapassetlink;
+-------------------------------------+------------+
| Table | Checksum |
+-------------------------------------+------------+
| libertyintelligence.ls_mapassetlink | 1670286008 |
+-------------------------------------+------------+
1 row in set (0.00 sec)
数据库B:
MySQL [libertyintelligence]> select md5(concat(LS_MapAssetLinkId,LS_Map,LS_Asset,LS_X,LS_Y,LS_MinZoom,LS_MaxZoom,LS_ZOrder)) from ls_mapassetlink;
+----------------------------------+
| md5(...) |
+----------------------------------+
| c3c060c7c514ac3e410b50c0eb0f63f9 |
| a97a117c63f9a2472b96e517c303e42f |
| 946dacb76c8e2919d1ce791211da660c |
| 112a10fe77558beca686ec2c9281ce7d |
| 271b8de08f13252ff0e58ac20590c9ce |
| 837e88605f4a7b1e0f2a78d40bf8ce1f |
+----------------------------------+
6 rows in set (0.00 sec)
MySQL [libertyintelligence]> checksum table ls_mapassetlink;
+-------------------------------------+-----------+
| Table | Checksum |
+-------------------------------------+-----------+
| libertyintelligence.ls_mapassetlink | 123437249 |
+-------------------------------------+-----------+
或者具体来说,当数据显示表相同时,一个数据库将表校验和显示为 1670286008,而另一个数据库显示为 123437249。
我和我的同事都独立检查了这一点(独立连接到数据库,独立检查,等),并且都被难住了。我发现校验和可能不同的唯一原因是如果我使用不同的数据库版本,但这些也是相同的版本。
表架构 两个系统上的架构是相同的:
CREATE TABLE `ls_mapassetlink` (
`LS_MapAssetLinkId` bigint(20) unsigned NOT NULL auto_increment,
`LS_Map` bigint(20) unsigned NOT NULL,
`LS_Asset` bigint(20) unsigned NOT NULL,
`LS_X` double NOT NULL,
`LS_Y` double NOT NULL,
`LS_MinZoom` int(11) NOT NULL,
`LS_MaxZoom` int(11) NOT NULL,
`LS_ZOrder` int(11) NOT NULL,
PRIMARY KEY (`LS_MapAssetLinkId`),
KEY `INDEX_MapAssetLink_Map` (`LS_Map`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1
我发现解决这个问题的最佳解决方案是实现我的“校验和”。类似的东西
select md5(GROUP_CONCAT(CONCAT_WS(column1,column2))) from table
这个
我希望计算需要一些时间表有数百万行。