对比MySQL表数据内容方式汇总

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 文章来源:http://120.76.165.139/WordPress-master/index.php/2017/02/17/mysql-data-comparison/
一. mysql自带的checksum命令: 可在不同服务器通过checksum值对比两张表是否一致, 加上EXTENDED参数表示逐行扫描, 结果更为可靠; 执行过程会给表加上System lock, 参考:https://dev.mysql.com/doc/refman/5.7/en/checksum-table.html

mysql> checksum table item_sku EXTENDED;
+---------------+------------+
| Table        | Checksum   |
+---------------+------------+
| test.item_sku | 3046185714 |
+---------------+------------+
1 row in set (15.53 sec)

mysql> select count(1) from item_sku;
+----------+
| count(1) |
+----------+
| 5912619  |
+----------+
1 row in set (3.04 sec)
a89266bc1603571803faebb468a0393184d4ab79
可通过对比checksum值来判断表是否一致; 粒度比较粗, 不能具体知道哪些数据不一致. 其优点是速度较快, 可先用checksum判断表是否一致, 然后再用其他工具进一步检查数据内容.

二. 常用pt工具能高效地检查主从一致性, 但前提是有主从关系
主: *.*.*.39
从: *.*.*.43

pt-table-checksum \
    -h*.*.*.39 \
    -uroot \
    -p123456 \
    --databases=test \
    --tables=item_sku \    
    --no-check-binlog-format \
--nocheck-replication-filters   

feaa40ddf3831a8f770cdf7f62e03d4e07b17d39

pt-table-sync \
    --replicate=percona.checksums \
    h=*.*.*.39,u=root,p=123456,D=test,t=item_sku \
    h=*.*.*.43,u=root,p=123456 \
    --charset=utf8 \
    --print

--print 即可生成修复脚本; 该工具效率比较高, 每次仅对chunk加读锁, 能生成修补数据的脚本.
pt工具足够强大不多说, 但以下情形不适合使用:
1)两台服务器无主从关系
2)有主从关系, 但只想检查主从数据差异, 不希望数据开始复制带来负面影响
3)有主从关系, 但有复制延迟或主库压力过大

三. 常见图形工具SQLyog提供了Data Comparison, 配置好源和目标的连接, 选好需要对比的表, 就可以开始对比了. 对比好后, 可选出数据不一致的内容, 然后生成相应的修复脚本
7928b3cd806211469a79e924fd19b62b7093c414
注意: 当发现一个数据不同的时候, 会停止运行, 需要点击Next Difference才能把脚本完全整理出来, 不太方便.
图形工具SQLyog效率非常高, 仅次于pt工具. 但有限制: 当主键大小写敏感的时候, 不能比较, 出现如下错误; 且该工具为图形界面, 不提供命令行支持, 所以认为其通用性低

1d026705fcaace0b42b703f4538d9e7fc20ca310


四. Red-gate提供了很多SQL Server的工具, 发现它的MySQL Data Compare也是可以对比的. 没有用过SQL Server会比较陌生, 地址:http://www.red-gate.com/products/mysql/mysql-data-compare/
选好想要对比的两个数据库:
5f06b219e77c3297cb9319e61f2a2499aa2521b9
选择需要对比的表:
3331b24a8640bd34f3a679892b10b047265f81ce
开始对比:
b5a3fd3083ddda06a8f83d9b8c5758d770c1a41a

在对比的同时, 去mysql观察其原理: 把表拉回本地, 程序内部对数据逐行对比, 对比过程会执行以下语句.

1a35268ab27137083356e78c66ba2da5af30a066

会看到相当多的时间耗在Writing to net, 可增大max_allowed_packet 值提高网络传输效率; 对比结束后, 可以看到如下结果
7ebb3c9b34abdb36c2c3ec3a964d386abbe13bba

然后点击Deployment Wizard就可以生成修复数据的脚本了

f92d383595b3118157016475d4503574bc5b2b62

4c4288ca34931106dd6e796acb8f27f9f8948f62

用了几次之后, 会卡在Planning Deployment几个小时才出结果; 毕竟是免费版本, 按官方步骤操作没发序列号过来. 官方称: The MySQL tools now benefit from a free edition for non-commercial use. We are, however, unable to provide support for this edition. 介绍该工具只为多掌握一种检查数据的方法, 仅供参考

五. mysqldbcompare来自mysql官方工具utilities, 但实际上各方面几乎最差, 是笔者最不推荐的一个:
5948fd80c1f8b82ac47eed1bb29440734723b616
原理: 在给定的两台服务器上, 分别串行分组校验, 注意到是一台服务器校验完, 再到下一台服务器校验, 效率极其低下, 但效率最低; 而且只是2G的表, 对比过程中就莫名其妙的被kill掉, 而且不能指定检查某张表

下面是5种对比表数据内容工具的总结:

0a176caa2129fb681eabc2fb4592d932c2a5574c

转自: http://120.76.165.139/WordPress-master/index.php/2017/02/17/mysql-data-comparison/

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7月前
|
关系型数据库 MySQL
Mysql truncate 清空表数据
Mysql truncate 清空表数据
54 0
|
11月前
|
存储 SQL JavaScript
阿里一面:MySQL 单表数据最大不要超过多少行?为什么?
阿里一面:MySQL 单表数据最大不要超过多少行?为什么?
|
6月前
|
存储 关系型数据库 MySQL
MySQL 中单表数据的最大行数应该控制在多少?
MySQL 中单表数据的最大行数应该控制在多少?
598 1
MySQL 中单表数据的最大行数应该控制在多少?
|
7月前
|
SQL
MySQL---表数据高效率查询(简述)
MySQL---表数据高效率查询(简述)
51 0
|
4月前
|
SQL 存储 关系型数据库
③【操作表数据】MySQL添加数据、修改数据、删除数据
③【操作表数据】MySQL添加数据、修改数据、删除数据
35 0
|
5月前
|
关系型数据库 MySQL
MYSQL 不允许在子查询的同时删除原表数据的解决方法 specify target table
MYSQL 不允许在子查询的同时删除原表数据的解决方法 specify target table
63 0
|
5月前
|
存储 关系型数据库 MySQL
数据库数据恢复—MySQL数据库误删除表数据的数据恢复案例
数据库数据恢复环境: 一台本地windows sever操作系统服务器,服务器上部署mysql数据库单实例,引擎类型为innodb,表内数据存储所使用表空间类型为独立表空间。无数据库备份,未开启binlog。 数据库故障&分析: 工作人员在执行Delete命令删除数据时未添加where子句进行筛选,导致全表数据被删除,删除后未对该表进行其他操作。
数据库数据恢复—MySQL数据库误删除表数据的数据恢复案例
|
9月前
|
关系型数据库 MySQL 索引
Mysql复制表结构与表数据
Mysql复制表结构与表数据
120 0
|
10月前
|
SQL 关系型数据库 MySQL
MySQL 删除表中的数据记录
前言 删除数据记录是数据操作中常见的操作,可以删除表中已经存在的数据记录。在MySQL中可以通过DELETE语句来删除数据记录,该SQL语句可以通过以下几种方式使用:删除特定数据记录、删除所有数据记录。
|
11月前
|
存储 SQL 关系型数据库
阿里一面:MySQL 单表数据最大不要超过多少行?为什么?这样回答满分!
阿里一面:MySQL 单表数据最大不要超过多少行?为什么?这样回答满分!