MySQL 主从数据 一致性校验工具
1 前言
如何验证MYSQL主从数据是否一致?
如果数据不一致,如何快速找出不一致的数据进行修补?
MYSQL有哪些常用的数据一致性校验工具?
本文会针对介绍几个MYSQL工具帮助我们更好地处理数据一致性问题。
2 mysqldiff工具(数据库对象级别比较工具)
1.编译安装mysql Utilities :
官方下载地址:https://dev.mysql.com/downloads/utilities/
cd /soft
tar -zxvf mysql-utilities-1.6.5.tar.gz
cd mysql-utilities-1.6.5
python ./setup.py build
python ./setup.py install
安装驱动程序 Connector/Python:
官方下载地址:https://downloads.mysql.com/archives/c-python/
cd /soft
rpm -ivh mysql-connector-python-2.1.7-1.el7.x86_64.rpm
2.mysqldiff工具的语法
$ mysqldiff --server1=user:pass@host:port:socket --server2=user:pass@host:port:socket db1.object1:db2.object1 db3:db4
接下来看一些主要的参数:
–server1:配置 server1 的连接。
–server2:配置 server2 的连接。
–character-set : 配置连接时用的字符集,如果不显示配置默认使用character_set_client。
–width:配置显示的宽度。
–skip-table-options : 保持表的选项不变,即对比的差异里面不包括表名 、AUTO_INCREMENT、ENGINE、CHARSET 等差异。
-d DIFFTYPE,–difftype=DIFFTYPE : 差异的信息显示的方式,有 [unified|context|differ|sql],默认是 unified。 如果使用 sql,那么就直接生成差异的SQL,这样非常方便。
–changes-for=:修改对象。例如–changes-for=server2,那么对比以 sever1 为主, 生成的差异的修改也是针对 server2 的对象的修改。
–show-reverse:在生成的差异修改里面,同时会包含 server2 和 server1 的修改。
3.常用示例
示例:
示例一:检查 server1,server2 上的某个表是否一致
mysqldiff --server1=root:root@192.168.1.151:3306 --server2=root:root@192.168.1.152:3306 orcldb.orcl_m5:orcldb.orcl_m5
示例二:检查 server1,server2 上的两个数据库是否一致
mysqldiff --server1=root:root@192.168.1.151:3306 --server2=root:root@192.168.1.152:3306 orcldb:orcldb
--changes-for 选项来控制对比方向。默认是以 server1。
示例三:检查 server1,server2 上的两个数据库中的某个表是否一致,同时显示差异修改,可以使用–show-reverse选项:
mysqldiff --server1=root:root@192.168.1.151:3306 --server2=root:root@192.168.1.152:3306 orcldb.orcl_m5:orcldb.orcl_yg --difftype=sql --show-reverse -vvv
3 mysqldbcompare工具(数据库库级别比较工具)
1.编译安装mysql Utilities :
官方下载地址:https://dev.mysql.com/downloads/utilities/
(编译操作同上)
安装驱动程序 Connector/Python:
官方下载地址:https://downloads.mysql.com/archives/c-python/
(编译操作同上)
2.mysqldbcompare工具的使用
mysqldbcompare 工具可以比较数据的差异(数据的值是否一致)。
mysqldbcompare 工具参数解释,可以参照官方文档。这里只解释几个常用的参数 :
–server1=user:passwprd@host 要对比的第一个库,指定用户、密码和主机。如果没有密码,密码可以忽略
–server2=user:password@host 要对比的第二个库,指定用户、密码和主机。如果没有密码,密码可以忽略
–difftype=[unified|context|differ|sql] unified 和 context、differ:会显示相差的具体的数据。sql:会生成的具体的 SQL。具体信息,如下:
–changes-for=[server1|server2] 以 difftype=sql 为例 , 如果设置 changes-for=server1,那么,生成的sql 是 update server1.tables set * * * *
–run-all-test 检查所有,即使检测到第一个不一致的数据,仍然继续。
–show-reverse:【反转显示】在生成的差异修改里面,同时包含 server2 和 server1 的修改。
可以通过–difftype选项来定义输出风格。
unified (default):统一的格式输出
context :上下文格式输出
differ :differ-style 格式输出
sql:SQL转换语句输出
最左边的db1对应于–server1 选项,最右边的 dbx 对应于–server2 选项。
–changes-for=server1:针对 server1,以 server2 为参照物(默认)
–changes-for=server2:针对 server2,以 server1 为参照物
3.常用示例
示例一:检查 server1,server2 上某个数据库是否一致(如果不指明数据库,需要加-a表示检查所有的数据库)
mysqldbcompare --server1=root:root@192.168.1.151:3306 --server2=root:root@192.168.1.152:3306 orcldb:orcldb
示例二:检查 server1,server2 上所有数据库是否一致
mysqldbcompare --server1=root:root@192.168.1.151:3306 --server2=root:root@192.168.1.152:3306 --run-all-test -a
示例三:检查 server1,server2 上所有数据库是否一致,列出差异,以及修改server1,以server2为参照物的SQL语句
mysqldbcompare --server1=root:root@192.168.1.151:3306 --server2=root:root@192.168.1.152:3306 --run-all-test --changes-for=server1 --difftype=sql -a
4 mysqlrplsync工具(主从复制 数据同步检查工具)
01.在主从之间检测数据的一致性,如下所示:
mysqlrplsync --master=root:root@192.168.1.151:3306 --slaves=root:root@192.168.1.152:3306
02.在从从之间检测数据的一致性,如下所示:
mysqlrplsync --slaves=root:root@192.168.1.152:3306,root:root@192.168.1.152:3306
03.对特定的数据库和表进行数据一致性检查,如下所示:
mysqlrplsync --master=root:root@192.168.1.151:3306 --slaves=root:root@192.168.1.152:3306 orcldb1 orcldb.orcl_m5
04.排除某些特定的数据库和表,进行数据一致性检查,如下所示:
mysqlrplsync --master=root:root@192.168.1.151:3306 --slaves=root:root@192.168.1.152:3306 --exclude=orcldb1,orcldb2.orclbak21
05.对有过滤的复制进行检查,如下所示:
mysqlrplsync --master=root:root@192.168.1.151:3306 --slaves=root:root@192.168.1.152:3306 --verbose
对于主需要有锁定表、进行校验和获取主状态信息的权限。 具体来说,需要有 SUPER 或 replication client, lock tables 和 select 权限。
缺点是:相对于mysqldbcompare工具,没法输出差异数据。
5 checksum工具(自带)
在主、从库上分别执行checksum语句,比较值是否相同。 仅适用于“表”之间的验证数据一致性。
mysql> checksum table orcldb.myorcl;
+------------------+------------+
| Table | Checksum |
+------------------+------------+
| orcldb.myorcl | 3772618113 |
+------------------+------------+