mysqldbcompare也是MySQL-Utilities工具集的一个脚本。mysqldbcompare从两个数据库比较对象和数据的不同。数据库中的对象包括:表、视图、触发器、存储过程、函数和事件。每一个对象类型计数可以使用-vv选项显示。通过一系列步骤检查进行测试,默认情况下,一旦测试失败就终止检测。可以指定--run-all-tests选项来进行所有的测试。
环境:CentOS6.5源码安装多个MySQL实例及复制搭建,之前做复制时Master实例的test库中的数据表没有复制到Slave实例

#使用Master中的test.test1的建表语句创建Slave中的test.test1,修改列c的说明,并插入数据
use test;
create table test1
(id int not null primary key,
a varchar(10) not null,
b varchar(10),
c varchar(10) comment 'cc',
d int
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='test1';
insert into test1 values(1,'a','b','c',1);

View Code

此时两表的定义和数据是不一致的。
比较检测的步骤
1、数据库定义的检查 检查对比的数据库是否存在

[root@VMUest ~]# mysqldbcompare --server1=mydba:mysql5635@192.168.85.129:3306 --server2=mydba:mysql5635@192.168.85.129:3307 --changes-for=server2 --show-reverse --difftype=sql test:test1
# WARNING: Using a password on the command line interface can be insecure.
# server1 on 192.168.85.129: ... connected.
# server2 on 192.168.85.129: ... connected.
ERROR: The database test1 does not exist.

View Code

2、检测数据库的对象 检查两者数据库中的对象是否丢失。可以使用--skip-object-compare选项跳过这步。

[root@VMUest ~]# mysqldbcompare --server1=mydba:mysql5635@192.168.85.129:3306 --server2=mydba:mysql5635@192.168.85.129:3307 --changes-for=server2 --show-reverse --difftype=sql test:test
# WARNING: Using a password on the command line interface can be insecure.
# server1 on 192.168.85.129: ... connected.
# server2 on 192.168.85.129: ... connected.
# Checking databases test on server1 and test on server2
#
ERROR: The list of objects differs among database test and test.

View Code

3、比较对象的定义 对对象的定义(CREATE语句)进行比较和显示不同。可以使用--skip-diff选项跳过这步。

[root@VMUest ~]# mysqldbcompare --server1=mydba:mysql5635@192.168.85.129:3306 --server2=mydba:mysql5635@192.168.85.129:3307 --changes-for=server2 --show-reverse --difftype=sql test:test --skip-object-compare
# WARNING: Using a password on the command line interface can be insecure.
# server1 on 192.168.85.129: ... connected.
# server2 on 192.168.85.129: ... connected.
# Checking databases test on server1 and test on server2
#
#                                                   Defn    Row     Data
# Type      Object Name                             Diff    Count   Check
# -------------------------------------------------------------------------
# TABLE     test1                                   FAIL    ERROR: The object definitions do not match.

View Code

4、检测表的行数 检查表是否有相同的行数,但这并不确保表的数据是一致性的。可以使用--skip-row-count选项跳过这步。

[root@VMUest ~]# mysqldbcompare --server1=mydba:mysql5635@192.168.85.129:3306 --server2=mydba:mysql5635@192.168.85.129:3307 --changes-for=server2 --show-reverse --difftype=sql test:test --skip-object-compare --skip-diff
# WARNING: Using a password on the command line interface can be insecure.
# server1 on 192.168.85.129: ... connected.
# server2 on 192.168.85.129: ... connected.
# Checking databases test on server1 and test on server2
#
#                                                   Defn    Row     Data
# Type      Object Name                             Diff    Count   Check
# -------------------------------------------------------------------------
# TABLE     test1                                   SKIP    FAIL    ERROR: Row counts are not the same among `test`.`test1` and `test`.`test1`.

View Code

5、检测表数据的一致性 检查行数同时检查数据是否一致,两表需要有主键或唯一索引。可以使用--skip-checksum-table选项跳过表校验,使用--skip-data-check选项跳过数据检查。

[root@VMUest ~]# mysqldbcompare --server1=mydba:mysql5635@192.168.85.129:3306 --server2=mydba:mysql5635@192.168.85.129:3307 --changes-for=server2 --show-reverse --difftype=sql test:test --skip-object-compare --skip-diff --skip-row-count
# WARNING: Using a password on the command line interface can be insecure.
# server1 on 192.168.85.129: ... connected.
# server2 on 192.168.85.129: ... connected.
# Checking databases test on server1 and test on server2
#
#                                                   Defn    Row     Data
# Type      Object Name                             Diff    Count   Check
# -------------------------------------------------------------------------
# TABLE     test1                                   SKIP    SKIP    -
#           - Compare table checksum                                FAIL
#           - Find row differences                                  FAIL
#
# Transformation for --changes-for=server2:
#DELETE FROM `test`.`test1` WHERE `id` = '1';#
# Transformation for reverse changes (--changes-for=server1):
#
# INSERT INTO `test`.`test1` (`id`, `a`, `b`, `c`, `d`) VALUES('1', 'a', 'b', 'c', '1');
## Database consistency check failed.
#
# ...done
#使用--skip-checksum-table选项跳过表校验
[root@VMUest ~]# mysqldbcompare --server1=mydba:mysql5635@192.168.85.129:3306 --server2=mydba:mysql5635@192.168.85.129:3307 --changes-for=server2 --show-reverse --difftype=sql test:test --skip-object-compare --skip-diff --skip-row-count --skip-checksum-table
# WARNING: Using a password on the command line interface can be insecure.
# server1 on 192.168.85.129: ... connected.
# server2 on 192.168.85.129: ... connected.
# Checking databases test on server1 and test on server2
#
#                                                   Defn    Row     Data
# Type      Object Name                             Diff    Count   Check
# -------------------------------------------------------------------------
# TABLE     test1                                   SKIP    SKIP    -
#           - Compare table checksum                                SKIP
#           - Find row differences                                  FAIL
#
# Transformation for --changes-for=server2:
#DELETE FROM `test`.`test1` WHERE `id` = '1';#
# Transformation for reverse changes (--changes-for=server1):
#
# INSERT INTO `test`.`test1` (`id`, `a`, `b`, `c`, `d`) VALUES('1', 'a', 'b', 'c', '1');
## Database consistency check failed.
#
# ...done
#使用--skip-data-check选项跳过数据检查
[root@VMUest ~]# mysqldbcompare --server1=mydba:mysql5635@192.168.85.129:3306 --server2=mydba:mysql5635@192.168.85.129:3307 --changes-for=server2 --show-reverse --difftype=sql test:test --skip-object-compare --skip-diff --skip-row-count --skip-checksum-table --skip-data-check
# WARNING: Using a password on the command line interface can be insecure.
# server1 on 192.168.85.129: ... connected.
# server2 on 192.168.85.129: ... connected.
# Checking databases test on server1 and test on server2
#
#                                                   Defn    Row     Data
# Type      Object Name                             Diff    Count   Check
# -------------------------------------------------------------------------
# TABLE     test1                                   SKIP    SKIP    SKIP   # Databases are consistent given skip options specified.
#
# ...done

View Code

指定--run-all-tests选项来进行所有的检测

[root@VMUest ~]# mysqldbcompare --server1=mydba:mysql5635@192.168.85.129:3306 --server2=mydba:mysql5635@192.168.85.129:3307 --changes-for=server2 --show-reverse --difftype=sql test:test --run-all-tests
# WARNING: Using a password on the command line interface can be insecure.
# server1 on 192.168.85.129: ... connected.
# server2 on 192.168.85.129: ... connected.
# Checking databases test on server1 and test on server2
#
# WARNING: Objects in server1.test but not in server2.test:
#        TABLE: test2
#
#                                                   Defn    Row     Data
# Type      Object Name                             Diff    Count   Check
# -------------------------------------------------------------------------
# TABLE     test1                                   FAIL    FAIL    -
#           - Compare table checksum                                FAIL
#           - Find row differences                                  FAIL
#
# Transformation for --changes-for=server2:
#ALTER TABLE `test`.`test1` CHANGE COLUMN c c varchar(10) NULL COMMENT 'c';#
# Transformation for reverse changes (--changes-for=server1):
#
# ALTER TABLE `test`.`test1`
#   CHANGE COLUMN c c varchar(10) NULL COMMENT 'cc';
## Row counts are not the same among `test`.`test1` and `test`.`test1`.
#
# Transformation for --changes-for=server2:
#DELETE FROM `test`.`test1` WHERE `id` = '1';#
# Transformation for reverse changes (--changes-for=server1):
#
# INSERT INTO `test`.`test1` (`id`, `a`, `b`, `c`, `d`) VALUES('1', 'a', 'b', 'c', '1');
## Database consistency check failed.
#
# ...done

View Code

检测做复制的sakila库

[root@VMUest ~]# mysqldbcompare --server1=mydba:mysql5635@192.168.85.129:3306 --server2=mydba:mysql5635@192.168.85.129:3307 --changes-for=server2 --show-reverse --difftype=sql sakila:sakila
# WARNING: Using a password on the command line interface can be insecure.
# server1 on 192.168.85.129: ... connected.
# server2 on 192.168.85.129: ... connected.
# Checking databases sakila on server1 and sakila on server2
#
#                                                   Defn    Row     Data
# Type      Object Name                             Diff    Count   Check
# -------------------------------------------------------------------------
# FUNCTION  get_customer_balance                    pass    -       -
# FUNCTION  inventory_held_by_customer              pass    -       -
# FUNCTION  inventory_in_stock                      pass    -       -
# PROCEDURE film_in_stock                           pass    -       -
# PROCEDURE film_not_in_stock                       pass    -       -
# PROCEDURE rewards_report                          pass    -       -
# TABLE     actor                                   pass    pass    -
#           - Compare table checksum                                pass
# TABLE     address                                 pass    pass    -
#           - Compare table checksum                                pass
# TABLE     category                                pass    pass    -
#           - Compare table checksum                                pass
# TABLE     city                                    pass    pass    -
#           - Compare table checksum                                pass
# TABLE     country                                 pass    pass    -
#           - Compare table checksum                                pass
# TABLE     customer                                pass    pass    -
#           - Compare table checksum                                pass
# TABLE     film                                    pass    pass    -
#           - Compare table checksum                                pass
# TABLE     film_actor                              pass    pass    -
#           - Compare table checksum                                pass
# TABLE     film_category                           pass    pass    -
#           - Compare table checksum                                pass
# TABLE     film_text                               pass    pass    -
#           - Compare table checksum                                pass
# TABLE     inventory                               pass    pass    -
#           - Compare table checksum                                pass
# TABLE     language                                pass    pass    -
#           - Compare table checksum                                pass
# TABLE     payment                                 pass    pass    -
#           - Compare table checksum                                pass
# TABLE     rental                                  pass    pass    -
#           - Compare table checksum                                pass
# TABLE     staff                                   pass    pass    -
#           - Compare table checksum                                pass
# TABLE     store                                   pass    pass    -
#           - Compare table checksum                                pass
# TRIGGER   customer_create_date                    pass    -       -
# TRIGGER   del_film                                pass    -       -
# TRIGGER   ins_film                                pass    -       -
# TRIGGER   payment_date                            pass    -       -
# TRIGGER   rental_date                             pass    -       -
# TRIGGER   upd_film                                pass    -       -
# VIEW      actor_info                              pass    -       -
# VIEW      customer_list                           pass    -       -
# VIEW      film_list                               pass    -       -
# VIEW      nicer_but_slower_film_list              pass    -       -
# VIEW      sales_by_film_category                  pass    -       -
# VIEW      sales_by_store                          pass    -       -
# VIEW      staff_list                              pass    -       -      # Databases are consistent.
#
# ...done

View Code

感觉mysqldbcompare的--run-all-tests选项包括了mysqldiff。mysqldiff如果指定数据库对(db1:db2),将对比数据库下的对象(不会检查对象的定义);如果指定具体对象(db1.obj1:db2.obj2),将对比其定义。
跳过复制错误
在前面对比数据的第5步做Find row differences操作时,会将下面语句写到二进制日志(实际是对比的双方都会有这样的操作,可开启log_bin查看)

现在已经知道主从的test库不一致,下面测试如何跳过复制错误。在主库删除表test2

mysql> drop table test2;
Query OK, 0 rows affectedmysql> SHOW BINLOG EVENTS in 'mysql-bin.000002' from 16061;
+------------------+-------+------------+-----------+-------------+----------------------------------------------------------+
| Log_name         | Pos   | Event_type | Server_id | End_log_pos | Info                                                     |
+------------------+-------+------------+-----------+-------------+----------------------------------------------------------+
| mysql-bin.000002 | 16061 | Query      |         6 |       16179 | use `test`; DROP TABLE `test2` /* generated by server */ |
+------------------+-------+------------+-----------+-------------+----------------------------------------------------------+
1 row in set

View Code

在从库查看复制状态

mysql> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 127.0.0.1Master_User: replMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000002Read_Master_Log_Pos: 16179Relay_Log_File: mysql-relay-bin.000005Relay_Log_Pos: 16224Relay_Master_Log_File: mysql-bin.000002Slave_IO_Running: YesSlave_SQL_Running: NoReplicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:Last_Errno: 1051Last_Error: Error 'Unknown table 'test.test2'' on query. Default database: 'test'. Query: 'DROP TABLE `test2` /* generated by server */'Skip_Counter: 0Exec_Master_Log_Pos: 16061Relay_Log_Space: 16678Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error:Last_SQL_Errno: 1051Last_SQL_Error: Error 'Unknown table 'test.test2'' on query. Default database: 'test'. Query: 'DROP TABLE `test2` /* generated by server */'Replicate_Ignore_Server_Ids:Master_Server_Id: 6Master_UUID: 02a05b2c-0557-11e7-bb02-000c29493a20Master_Info_File: /usr/local/mysql3307/log/master.infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State:Master_Retry_Count: 86400Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp: 170315 14:21:55Master_SSL_Crl:Master_SSL_Crlpath:Retrieved_Gtid_Set:Executed_Gtid_Set:Auto_Position: 0
1 row in set (0.00 sec)

View Code

报错Unknown table,使用下面语句跳过一个事务

mysql> stop slave;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql> start slave;

View Code

重新查看复制状态

mysql> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 127.0.0.1Master_User: replMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000002Read_Master_Log_Pos: 16179Relay_Log_File: mysql-relay-bin.000006Relay_Log_Pos: 283Relay_Master_Log_File: mysql-bin.000002Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:Last_Errno: 0Last_Error:Skip_Counter: 0Exec_Master_Log_Pos: 16179Relay_Log_Space: 16678Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error:Last_SQL_Errno: 0Last_SQL_Error:Replicate_Ignore_Server_Ids:Master_Server_Id: 6Master_UUID: 02a05b2c-0557-11e7-bb02-000c29493a20Master_Info_File: /usr/local/mysql3307/log/master.infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update itMaster_Retry_Count: 86400Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp:Master_SSL_Crl:Master_SSL_Crlpath:Retrieved_Gtid_Set:Executed_Gtid_Set:Auto_Position: 0
1 row in set (0.00 sec)

View Code

对于这种需求明确的通过跳过出错事务就能将主从保持一致。

转载于:https://www.cnblogs.com/ShanFish/p/6553619.html

MySQL-Utilities:mysqldbcompare及跳过复制错误相关推荐

  1. mysql 跳过checksum_MySQL-Utilities:mysqldbcompare及跳过复制错误

    mysqldbcompare也是MySQL-Utilities工具集的一个脚本.mysqldbcompare从两个数据库比较对象和数据的不同.数据库中的对象包括:表.视图.触发器.存储过程.函数和事件 ...

  2. 跳过复制错误——slave_skip_errors、slave_exec_mode

    这一篇写写复制错误处理相关的另两个参数slave_skip_errors.slave_exec_mode,基本环境参考<复制错误处理--sql_slave_skip_counter> 一. ...

  3. mysql replicate_do_db_replicate-do-db参数引起的MySQL复制错误及处理办法

    replicate-do-db配置在MySQL从库的my.cnf文件中,可以指定只复制哪个库的数据.但是这个参数有个问题就是主库如果在其他的schema环境下操作,其binlog不会被从库应用,从而出 ...

  4. mysql主从切换gtid不一致_GTID 复制、主从不一致跳过操作、快速切换master

    1. 部署 GTID 全局事务标识  mysql 5.6 加入 1.1 准备 配置文件 ## gtid repl config need server_id=52 #开启gtid gtid_mode= ...

  5. mysql删除不存在行数据报错_MySQL学习笔记11复制错误处理(二)删除不存在的行的问题...

    (1)问题情况 在master上删除某个数据表的某一行,而该行在slave上并不存在,则slave上的复制过程会出错. MySQL的log文件中发现如下错误信息: 2017-08-15T04:52:1 ...

  6. mysql rpl_MySQL管理工具MySQL Utilities — mysqlrplcheck(44)

    mysqlrplcheck  工具是用来检查复制的先决条件的.这些检查的设计或者说是测试,是用来确保复制的健康.测试的内容有: 在主上是否启用了二进制? 是否有排除某些二进制(如有*_do_db 或 ...

  7. 我的MYSQL学习心得(十七) 复制

    最近把大学时候的ORACLE教程书本翻出来看,真的是感触良多 以前在学校的时候,每次ORACLE测验和考试都是不合格的,期末的时候靠补考才勉强过关 大家看到下图的封面应该知道大学教我们ORACLE课程 ...

  8. mysql主从复制gtid_详解MySQL主从复制实战 - 基于GTID的复制

    基于GTID的复制 简介 基于GTID的复制是MySQL 5.6后新增的复制方式. GTID (global transaction identifier) 即全局事务ID, 保证了在每个在主库上提交 ...

  9. mysql 服务无法启动 没有报告任何错误_My SQL学习之路(一)

    首先安装参照下方链接 猴子:超级详细的mysql数据库安装指南​zhuanlan.zhihu.com 里面图形化Navicat工具界面很好用,可以帮您创建mysql数据库实例,就不用以下的配置文件这些 ...

  10. MySQL管理工具MySQL Utilities — 如何连接MySQL服务器

    连接参数 连接到一个服务器,必须指定连接参数,如用户名,主机名称,密码,端口号,socket.MySQL Utilities提供了三种提供这些参数的方法,这些方法都需要通过命令行指定. 使用.mylo ...

最新文章

  1. 2019中国大学生程序设计竞赛(CCPC)-网络选拔赛-第七题Shuffle Card
  2. Numpy-随机生成以及矩阵的运算
  3. Cortex‐M3-存储器保护单元(MPU)
  4. 方差公式初三_初中数学,一元二次方程的解法:公式法、因式分解法和十字相乘法基础练习...
  5. android搜索框布局文件,android搜索框列表布局,流程及主要步骤思维导图
  6. td中文字间距_怎么做?文字编排创意的小心思
  7. oracle12能卸干净吗,oracle卸载干净【设置方案】
  8. 聊聊加拿大的工作和生活
  9. treemap倒叙_java对map进行排序(对日期倒叙)
  10. [球体积交]Girlfriend 2021牛客多校第2场 F
  11. google cloud api 安装
  12. vs2015+openCV(x64)出现运行时”无法查找或打开 PDB 文件”问题
  13. 智慧园区数据可视化大屏的优势分析
  14. CSS——web字体与CSS字体图标
  15. python毕业设计能做什么工作_用python可以做什么毕业设计项目|融资公司的主要业务...
  16. Win7 设置防火墙开放特定端口
  17. 磁盘阵列和存储服务器的区别
  18. 机械革命深海幽灵z2学习电脑系统史
  19. 青海湖 游走遇见一路风景
  20. 计算机科学与技术的未来发展前景

热门文章

  1. github之处理“忒修斯之船”问题
  2. 群晖搭建discuz论坛
  3. 适合糖友增强饱腹感的一些主食
  4. rebase和merge区别
  5. ESP32 开发笔记(三)源码示例 10_IIC_ADXL345 使用IIC总线实现读取ADXL345角度加速度传感器
  6. 使用Power BI时常见的几个问题(持续更新)
  7. python爬虫——爬取小说
  8. turtle库画超立方体 难度1
  9. 直播平台多人连麦技术介绍
  10. Pulsar的Proxy支持和SNI路由 - 修改...