今天新搭建了一个测试环境,要把原来的测试数据迁移过去,在迁移的时候发现有些数据插入失败了,经过排查原来是某些机器的存储过程漏了执行,导致某些表的字段没有新加上去,造成插入的时候提示没有这个字段,这次测试环境的迁移库有10个,表有1000+张,手动一张张检查十分不靠谱,这次分享主要介绍如何快速的检查MySQL两个实例间的元数据同步问题。
此次检查我使用的是mysqldiff,是mysql官方推荐的库对比工具,MySQL Utilities中的一个脚本。可以对比两个库中缺少的表,缺少的字段,字段类型,索引,存储引擎等,具体执行步骤如下:
安装MySQL Utilities
rpm -ivh mysql-connector-python-2.1.7-1.el7.x86_64.rpm mysql-connector-python-cext-2.1.7-1.el7.x86_64.rpm
rpm -ivh mysql-utilities-1.6.5-1.el7.noarch.rpm
检查mysqldiff版本
mysqldiff --version
192.168.81.134机器执行SQL
create database ruichang;
CREATE TABLE test ( id int(11) NOT NULL, name varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=SEQUOIADB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
CREATE TABLE test3 ( id int(11) NOT NULL, name varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=SEQUOIADB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
192.168.81.135机器执行SQL
create database ruichang;
CREATE TABLE test ( id int(11) NOT NULL, name varchar(255) COLLATE utf8mb4_bin DEFAULT NULL ) ENGINE=innodb DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
alter table test add index name_idx(name);
CREATE TABLE test2 ( id int(11) NOT NULL, name varchar(255) COLLATE utf8mb4_bin DEFAULT NULL ) ENGINE=innodb DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
alter table test add index name_idx(name);
CREATE TABLE test3 ( id int(11) NOT NULL, name varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=SEQUOIADB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
对比 192.168.81.134 与 192.168.81.135 的 ruichang 数据库下的表结构是否一致
mysqldiff --server1=root:root@192.168.81.134:3306 --server2=root:root@192.168.81.135:3306 --difftype=sql ruichang:ruichang --changes-for=server1 --force
参数:
--server1 与 --server2 填写需要对比的 MySQL实例的连接信息(格式:user:pass@host:port:socket)
--difftype 差异信息的显示方式,如果这里填写的是sql的话,那么就会直接生成差异的sql
--changes-for 例如这里填写 server1 的话,那么对比会以 server2 为主,生成差异的修改也是针对 server1 的对象修改
--force 如果发现表结构不同的情况,强制继续执行下去
执行结果:

结果解析:
检查到有一张 ruichang.test2 的表在 server2.ruichang 的库下没有在 server1.ruichang 的库下
ruichang.test 表对比失败,显示需要在 server1 下执行修改 ruichang.test 表(删除主键,创建 name_idx 索引,修改存储引擎)
ruichang.test3 表检查通过
安装包附件: