MySQL 中的校验和不同

问题描述 投票:0回答:1

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

更新在 DBA.stackexchange 上发现非常相似的问题

mysql database database-replication checksum
1个回答
0
投票

我发现解决这个问题的最佳解决方案是实现我的“校验和”。类似的东西

select md5(GROUP_CONCAT(CONCAT_WS(column1,column2))) from table

这个

  1. 连接所有列值
  2. 连接所有行
  3. 计算结果字符串的MD5

我希望计算需要一些时间表有数百万行。

© www.soinside.com 2019 - 2024. All rights reserved.