mysqldiff,用于识别数据库对象之间的差异。它读取对象的定义,并使用类似diff的方法进行比较,以确定它们是否相同。该程序可以显示不同的对象的差异。
命令的语法及相关选项
mysqldiff [options] {db1[:db1] | {db1.obj1[:db2.obj2]} …
要比较一对特定的对象,使用db.obj格式将「对象名」添加到「数据库名」后面,例如:db1.obj1:db2.obj2比较两个对象;或者使用db1.obj1来比较同名数据库中同名称对象。
不允许将数据库名称与对象名称混合使用,例如:db1.obj1:db2和db1:db2.obj2是不允许的。
如果「库名」或者「对象名」有保留字或者特殊字符,需要使用反引号(`)引用,同时由于反引号在shell中有特殊的含义,所以整个部分还需要使用单引号(linux下),如下:
命令支持的选项及含义
–changes-for=<direction>
用于指定比较的”方向“,默认值是server1。具体含义如下:
· –changes-for=server2: server2为”目标对象“,即server2是要被修改的。此时server1为”源对象“、“参照表”。
–character-set=<charset>
设置客户端端的字符集。默认值是从服务器变量character_set_client中读取的。
–difftype=<difftype>, -d<difftype>
设置输出的”差异报告“的格式。
默认情况下,默认值是unified(输出的结果类似diff的结果)。也可以使用–difftype=sql,使用该选项后输出内容为「差异的ALTER语句」(用于修改”目标对象“)。如果无法转换,将输出对象的差异以及警告。
difftype的取值如下(大小写不敏感):
· context, c : 显示上下文输出格式;
· differ, d : 以类似于diff的格式输出;
· sql, s: 输出用于修改表SQL语句;
–compact
通过减少diff结果中显示的控制线来减小输出内容。此选项应与unified或context一起使用。
–force
比较所有作为参数列出的对象。
默认情况下,在遇到第一个不同的地方(丢失的对象或对象不匹配)时,就会停止执行。该选项可以在遇到第一个不匹配时不停止,继续比较剩余对象,直到结束。
–quiet, -q
不要打印任何东西。只返回成功或失败的退出码。
–server1=<source>, –server2=<source>
这两个参数用于指定MySQL服务器的连接信息。
在MySQL中,如果要连接到指定的MySQL服务器,需要指定「连接参数(用户名、密码或套接字)」。MySQL Utilities提供了几种来提供这些信息的方法,如下(安全性由高到低):
· 使用配置文件(未加密,不可见;且在release-1.5.0后支持该功能),格式:<configuration-file-path>[:<section>]
· 直接在命令行里使用登录信息(不推荐),格式:<user>[:<passwd>]@<host>[:<port>][:<socket>]
–show-reverse
指定该选项后,如果–changes-for设置为server1,则还会为server2生成”差异报告“。
注意:”反向更改“被注释并标记为注释。
–skip-table-options
忽略所有表选项之间的差异(如AUTO_INCREMENT,ENGINE,CHARSET等)。
如果使用了–skip-table-options,但表选项存在差异,会产生警告并打印差异内容。
–ssl-ca/–ssl-cert/–ssl-key
这三个分别指定CA、CERT、KEY文件的位置。
–ssl
如果服务器连接需要使用SSL,需要这定这个选项。
–verbose, -v
指定要显示的信息量。多次使用此选项可以增加信息量。例如,-v,-vv,-vvv。
–width=<number>
更改测试报告的显示宽度。默认值为75个字符。
–help/–license/–version
显示帮助/许可证/版本信息。
SQL转换的已知限制(SQL TRANSFORMATION LIMITATIONS)
- 遇到具有分区差异的表时,会为所有其他更改生成ALTER TABLE语句,但会打印一个警告并忽略分区差异。
- 如果检测到源表中的表选项未更改或不存在于目标表中,则会为所有更改生成ALTER TABLE语句,但会打印警告并忽略表选项差异。
- 不支持重命名事件,这是因为mysqldiff按对象名比较的,所以如果对象名不同会被视为两个对象。在这种情况下会根据比较的方向,将事件的删除或者添加语句。
- 不支持事件的定义子句中的更改。
- 不支持特定于MySQL Cluster的SQL扩展。
- 对于不存在的表,无法生成响应的CREATE语句,只会产生一个警告;
- 极度不推荐直接在命令行里使用登录信息,推荐使用“登录路径”。当直接在命令行里使用登录信息时,如果密码的中包含了一些特殊字符会产生错误信息;
注意事项
所提供的连接参数(用户名、密码、主机等)必须具有正确的权限来访问所要比较的对象。
对于–difftype选项,大小写是不敏感的。此外,值可以使任何不重复的前缀值。
例如:–difftype=d指定了比较类型,如果前缀值匹配到了多个有效值,则会产生错误 。
为了使用「登录路径(login-path)」的认证机制,「MySQL的客户端工具」必须包含在PATH环境变量中。这允许mysqldiff使用my_print_defaults命令从「登录配置文件(.mylogin.cnf)」中读取「登录路径」中的值。
如果对象或者库名中使用了特殊字符、保留字,那么必须使用反引号(backticks(`))进行引用。另一方面,在SHELL中反引号又需要使用单引号或者双引号引用。例如:要比较「weird`db.name中的weird`table1」和「other:weird`db.name中的weird`table2」,在非Windows系统中要这么写:
需要的权限
工具mysqldiff是根据使用「mysql数据库(mysql是库名,就是那个内置库)」进行比较的,所以要确保在该库上具有SELECT权限;必须具有要比较对象的SELECT权限;
使用示例
比较employees和emp数据库示例
shell> mysqldiff –server1=root@localhost employees:emp1
# server1 on localhost: … connected.
WARNING: Objects in server1:employees but not in server2:emp1:
Compare failed. One or more differences found.
shell> mysqldiff –server1=root@localhost employees.t1:emp1.t1 employees.t3:emp1.t3
# server1 on localhost: … connected.
# Comparing employees.t1 to emp1.t1 [PASS]
# server1 on localhost: … connected.
# Comparing employees.t3 to emp1.t3 [PASS]
Success. All objects are the same.
shell> mysqldiff –server1=root@localhost employees.salaries:emp1.salaries –differ
# server1 on localhost: … connected.
# Comparing employees.salaries to emp1.salaries [FAIL]
# Object definitions are not the same:
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`),
KEY `emp_no` (`emp_no`)
– ) ENGINE=InnoDB DEFAULT CHARSET=latin1
? ^^^^^
+ ) ENGINE=MyISAM DEFAULT CHARSET=latin1
? ++ ^^^
Compare failed. One or more differences found.
生成转换报告的简单示例
表结构定义如下:
Host1: CREATE TABLE db1.table1 (num int, misc char(30));
Host2: CREATE TABLE dbx.table3 (num int, notes char(30), misc char(55));
db1.table1:dbx.table3
# server2 on host2: … connected.
# Comparing db1.table1 to dbx.table3 [FAIL]
# Transformation statements:
ALTER TABLE db1.table1
CHANGE COLUMN misc misc char(55);
db1.table1:dbx.table3
# server2 on host2: … connected.
# Comparing db1.table1 to dbx.table3 [FAIL]
# Transformation statements:
ALTER TABLE dbx.table3
CHANGE COLUMN misc misc char(30);
db1.table1:dbx.table3
# server2 on host2: … connected.
# Comparing db1.table1 to dbx.table3 [FAIL]
# Transformation statements:
# –destination=server1:
ALTER TABLE db1.table1
CHANGE COLUMN misc misc char(55);
# ALTER TABLE dbx.table3
# DROP COLUMN notes,
# CHANGE COLUMN misc misc char(30);
Compare failed. One or more differences found.
参考文献
- MySQL/mysqldiff官方手册
更新日志
- 04/04/2017 创建文章
- 12/04/2017 文章内容修改