⽐较两个数据库有何差异⽣成更新的SQL语句脚本MySQL Utilities提供了⼀系列MySQL服务器和数据库的管理⼯具。
完全⽀持MySQL5.1及以上版本,也兼容MySQL5.0版本,不过有些特性不⽀持。
不⽀持MySQL4.0版本。
批量更新sql语句下⾯这些⼯具⼯作在数据库级别,可以⽤来管理⼀个或多个服务器的数据库。
1 mysqldbcompare
⽐较两个服务器或同个服务器上的数据库
⽐较定义⽂件和数据
产⽣差异报告
⽣成差异性的转换SQL语句
2 mysqldiff
⽐较数据表
⽐较表对象的定义
产⽣差异的报告
⽣成差异性的转换SQL语句
3 mysqldbcopy
服务器之间复制数据库
在同⼀台服务器上克隆数据库
⽀持重命名
4 mysqldbexport
从⼀个或多个数据库导出元数据和或数据
⽀持的格式: SQL, CSV, TAB, Grid, Vertical
5 mysqldbimport
从⼀个或多个⽂件导⼊元数据和数据
⽀持mysqldbexport各种格式
mysqldbcompare MySQL数据库⽐较⼯具
mysqldbcompare⽤于⽐较两个服务器或同个服务器上的数据库,有⽂件和数据,并⽣成差异性SQL语句。
要⽐较数据表,请⽤另外⼀个⼯具:mysqldiff()。
以下是mysqldbcompare的⽤法。
1 安装
mysqldbcompare是MySQL Utilities中的⼀个脚本,默认的MySQL不包含⼯具集,所以需要独⽴安装。
MySQL Utilities下载地址:。
Windows系统中需提前安装“Visual C++ Redistributable Packages for Visual Studio 2013”,下载地址:
。Linux系统在下载页⾯选择对应发⾏版。
2 语法
mysqldbcompare的语法如下:
$ mysqldbcompare --server1=user:pass@host:port:socket --server2=user:pass@host:port:socket db1:db2
以上参数中:
--server1:MySQL服务器1配置。
--server2:MySQL服务器2配置。如果是同⼀服务器,--server2可以省略。
db1:db2:要⽐较的两个数据库。如果⽐较不同服务器上的同名数据库,可以省略:db2。
--all:⽐较所有两服务器上所有的同名数据库。--exclude排除⽆需⽐较的数据库。
--run-all-tests:运⾏完整⽐较,遇到第⼀次差异时不停⽌。
-
-changes-for=:修改对象。例如--changes-for=server2,那么对⽐以sever1为主,⽣成的差异的修改也是针对server2的对象的修改。
-d DIFFTYPE,--difftype=DIFFTYPE:差异的信息显⽰的⽅式,有[unified|context|differ|sql],默认是unified。如果使⽤sql,那么就直接⽣成差异的SQL,这样⾮常⽅便。
--show-reverse:在⽣成的差异修改⾥⾯,同时会包含server2和server1的修改。
--skip-table-options:保持表的选项不变,即对⽐的差异⾥⾯不包括表名、AUTO_INCREMENT、ENGINE、CHARSET等差异。
--skip-diff:跳过对象定义⽐较检查。所谓对象定义,就是CREATE语句()⾥⾯的部分,--skip-table-options是()外⾯的部分。
--skip-object-compare:默认情况下,先检查两个数据库中相互缺失的对象,再对都存在对象间的差异。这个参数的作⽤就是,跳过第⼀步,不检查相互缺失的对象。
--skip-checksum-table:数据⼀致性验证时跳过CHECKSUM TABLE。
--skip-data-check:跳过数据⼀致性验证。
--skip-row-count:跳过字段数量检查。
3 ⽰例
⽐较两个数据库,并⽣成差异SQL:
$ mysqldbcompare --server1=root:root@localhost --server2=root:root@localhost db1:db2 --changes-for=server1 -a --difftype=sql
# WARNING: Objects in server1.db1 but not in server1.db2:
# TABLE: table2
#
# WARNING: Objects in server1.db2 but not in server1.tb1:
# TABLE: table3
#
# Defn Row Data
# Type Object Name Diff Count Check
#-------------------------------------------------------------------------
# TABLE t1 pass pass -
# - Compare table checksum FAIL
# - Find row differences FAIL
#
# Transformation for --changes-for=server1:
#
# Data differences found among rows:
UPDATE db1.t1 SET b = 'Test 123' WHERE a = '1';
UPDATE db1.t1 SET b = 'Test 789' WHERE a = '3';
DELETE FROM db1.t1 WHERE a = '4';
INSERT INTO db1.t1 (a, b) VALUES('5', 'New row - db2');
# Database consistency check failed.
#
# ...done
WARNING之后提⽰两个数据库表之间的差异,也就是⼀个数据库中有,另⼀个数据库没有的数据表。
之后就是差异的SQL语句了,把有#号注释的⾏删掉,就能直接在数据库中执⾏了。
说明:执⾏MySQL语句时可能会遇到这样错误:Error 1054 - Unknown column 'name' in 'aspect'
这是因为mysqldbcompare⽣成的ALTER语句中,⽤逗号,拼装了多条ADD、CHANGE等语句,如果这些语句还包含AFTER关键字,就会提⽰这个错误并中断执⾏MySQL语句。解决的办法就是:去除AFTER及其后⾯的条件。
参考链接:
1.
2.
-h192.168.11.2 -uroot -p'zq!aHHHDmgH4DIq!si'
-h192.168.8.73 -umoHsh -p'NAH43aHHHHjog9bGYQk'
mysqldbcompare --server1=root:root@localhost --server2=root:root@localhost db1:db2 --changes-for=server1 -a --difftype=sql
mysqldbcompare --server1=root:'zqHH4DIq!si'@192.168.11.232 --server2=moHsh:'NAHHg9bGYQk'@192.168.8.3 system232:system --run-all-tests --changes-for=server1 --difftype=sql
--changes-for=[server1|server2] 以difftype=sql为例,如果设置changes-for=server1,那么,⽣成的sql是update
server1.tables set * * * *
--run-all-test 检查所有,即使检测到第⼀个不⼀致的数据,仍然继续。
绝⼤部分情况下,我们需要检查特定的⼏个库,这是可以指定命令,⽐如:
mysqldbcompare --server1=root:root@127.0.0.1:3306 --server2=root:root@127.0.0.1:3307 --run-all-test --changes-for=server1 --difftype=sql test1:test2
其中,test1库是server1上的库,test2是server2上的库。这样,我们就只检查test1和test2这两个库。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论