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

一. 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)


可通过对比checksum值来判断表是否一致; 粒度比较粗, 不能具体知道哪些数据不一致. 其优点是速度较快, 可先用checksum判断表是否一致, 然后再用其他工具进一步检查数据内容.

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

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

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, 配置好源和目标的连接, 选好需要对比的表, 就可以开始对比了. 对比好后, 可选出数据不一致的内容, 然后生成相应的修复脚本

注意: 当发现一个数据不同的时候, 会停止运行, 需要点击Next Difference才能把脚本完全整理出来, 不太方便.
图形工具SQLyog效率非常高, 仅次于pt工具. 但有限制: 当主键大小写敏感的时候, 不能比较, 出现如下错误; 且该工具为图形界面, 不提供命令行支持, 所以认为其通用性低

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

选择需要对比的表:

开始对比:

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

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

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

用了几次之后, 会卡在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, 但实际上各方面几乎最差, 是笔者最不推荐的一个:

原理: 在给定的两台服务器上, 分别串行分组校验, 注意到是一台服务器校验完, 再到下一台服务器校验, 效率极其低下, 但效率最低; 而且只是2G的表, 对比过程中就莫名其妙的被kill掉, 而且不能指定检查某张表

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

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

时间: 2025-01-01 21:02:28

对比MySQL表数据内容方式汇总的相关文章

基于Solr DIH实现MySQL表数据全量索引和增量索引

实现MySQL表数据全量索引和增量索引,基于Solr DIH组件实现起来比较简单,只需要重复使用Solr的DIH(Data Import Handler)组件,对data-config.xml进行简单的修改即可.Solr DIH组件的实现类为org.apache.solr.handler.dataimport.DataImportHandler,在Solr的solrconfig.xml中配置两个handler,配置分别说明如下. 全量索引 solrconfig.xml配置如下: 1 <reque

Python增量循环删除MySQL表数据的方法_python

需求场景: 有一业务数据库,使用MySQL 5.5版本,每天会写入大量数据,需要不定期将多表中"指定时期前"的数据进行删除,在SQL SERVER中很容易实现,写几个WHILE循环就搞定,虽然MySQL中也存在类似功能,怎奈自己不精通,于是采用Python来实现 话不多少,上脚本: # coding: utf-8 import MySQLdb import time # delete config DELETE_DATETIME = '2016-08-31 23:59:59' DELE

Win7系统如何使用CMD命令导出MySQL表数据

  Win7系统如何使用CMD命令导出MySQL表数据         操作方法: 1.打开始菜单中运行命令提示符: 2.然后输入命令: 假设导出tomtopportal数据库下的t_article_base表数据到E:/xitongcheng.com.txt文件.执行命令如下: mysqldump -h localhost -u root -p tomtopportal t_article_base >e:xitongcheng.com.txt 3.命令行指示输入mysql的root用户密码(

mysql表的基础操作汇总(三)_Mysql

针对mysql表进行的基础操作,具体内容如下 1.创建表: 创建表的语法形式: CREATE TABLE table_name( 属性名 数据类型, 属性名 数据类型, ... 属性名 数据类型 ) 示例: CREATE TABLE t_dept( deptno int, dname varchar(20), loc varchar(20) 备注:在创建表之前,通常你需要使用 USE 库名:这样一条语句来选择一个库,在所选择的库中创建表.对于表名标识符,不能是mysql的关键字,如 CREATE

教你实现MySQL表数据迁移自动化

一.背景 之前我写过关于SQL Server的数据迁移自动化的文章:SQL Server 数据库迁移偏方,在上篇文章中设计了一张临时表,这个临时表记录搬迁的配置信息,用一个存储过程读取这张表进行数据的迁移,再由一个Job进行迭代调用这个存储过程. 在这次MySQL的实战中,我的数据库已经做了4个分片,分布在不同的4台机器上,每台机器上的数据量有1.7亿(1.7*4=6.8亿),占用空间260G(260*4=1040G),这次迁移的目的就是删除掉一些历史记录,减轻数据库压力,有人说这为什么不使用表

5种Android数据存储方式汇总_Android

本文介绍Android中的5种数据存储方式. 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据 下面将为大家一一详细介绍. 第一种:使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比

Solr DIH: 基于MySQL表数据建立索引

选择使用Solr,对数据库中数据进行索引,可以单独写程序将数据库中的数据导出并建立索引,这个过程可能对于数据处理的控制更灵活一些,但是却可能带来很大的工作量.选择使用Solr的DIH组件,可以很方便的对数据库表中数据进行索引,下面基于MySQL数据库实现建立索引. 首先,需要设计你的schema,最主要的工作是,将数据库表中字段映射为Lucene索引(Solr直接使用Lucene的索引格式和数据)的Field,从而将数据表中的一条记录映射为Lucene中的Document,然后进行索引.另外,在

Python增量循环删除MySQL表数据的例子

需求场景: 有一业务数据库,使用MySQL 5.5版本,每天会写入大量数据,需要不定期将多表中"指定时期前"的数据进行删除,在SQL SERVER中很容易实现,写几个WHILE循环就搞定,虽然MySQL中也存在类似功能,怎奈自己不精通,于是采用Python来实现 话不多少,上脚本: # coding: utf-8 import MySQLdb import time # delete config DELETE_DATETIME = '2016-08-31 23:59:59' DELE

html中select语句读取mysql表中内容_php基础

<?  $record=0;  $db=@mysql_pconnect('localhost','root');  @mysql_select_db('1234',$db);  $strsql="select * from 1234_data";  $result=@mysql_query($strsql);  $data=@mysql_fetch_array($result);  $record=@mysql_num_rows($result);   echo "&l