「mysqldiff」-

mysqldiff,用于识别数据库对象之间的差异。它读取对象的定义,并使用类似diff的方法进行比较,以确定它们是否相同。该程序可以显示不同的对象的差异。

命令的语法及相关选项

mysqldiff [options] {db1[:db1] | {db1.obj1[:db2.obj2]} …

使用”db1:db2“的形式指出要比较的数据库;或者只用db1来表示比较两个同名数据库(就是说db1:db1可以简写成db1)。

可以通过仅指定–server1选项在单个服务器上针对两个不同名称的数据库执行比较。用户也可以通过指定–server2选项来连接到其他服务器,在这种情况下,db1表示server1名为db1的数据库和db2表示server2上名为db2的数据库。请看如下命令:

# mysqldiff –force –difftype=sql –server1=root@host1 –server2=root@host2 –difftype=sql db1.table1:dbx.table3

db1存在于由–server1指定的服务器上,dbx存在于由–server2指定的服务器上。

要比较一对特定的对象,使用db.obj格式将「对象名」添加到「数据库名」后面,例如:db1.obj1:db2.obj2比较两个对象;或者使用db1.obj1来比较同名数据库中同名称对象。
不允许将数据库名称对象名称混合使用,例如:db1.obj1:db2db1:db2.obj2是不允许的。

如果「库名」或者「对象名」有保留字或者特殊字符,需要使用反引号(`)引用,同时由于反引号在shell中有特殊的含义,所以整个部分还需要使用单引号(linux下),如下:

‘`weird“db.name`.`weird“table1`:`other:weird“db.name`.`weird“table2`’

命令支持的选项及含义

–changes-for=<direction>
用于指定比较的”方向“,默认值是server1。具体含义如下:

· –changes-for=server1: server1为”目标对象“,即server1是要被修改的。此时server2为”源对象“、“参照表”。

· –changes-for=server2: server2为”目标对象“,即server2是要被修改的。此时server1为”源对象“、“参照表”。

–character-set=<charset>
设置客户端端的字符集。默认值是从服务器变量character_set_client中读取的。

–difftype=<difftype>, -d<difftype>
设置输出的”差异报告“的格式。
默认情况下,默认值是unified(输出的结果类似diff的结果)。也可以使用–difftype=sql,使用该选项后输出内容为「差异的ALTER语句」(用于修改”目标对象“)。如果无法转换,将输出对象的差异以及警告。
difftype的取值如下(大小写不敏感):

· unified, u : 显示统一格式输出。这个是默认值。

· context, c : 显示上下文输出格式;

· differ, d : 以类似于diff的格式输出;

· sql, s: 输出用于修改表SQL语句;

–compact
通过减少diff结果中显示的控制线来减小输出内容。此选项应与unified或context一起使用。

–force
比较所有作为参数列出的对象。
默认情况下,在遇到第一个不同的地方(丢失的对象或对象不匹配)时,就会停止执行。该选项可以在遇到第一个不匹配时不停止,继续比较剩余对象,直到结束。

–quiet, -q
不要打印任何东西。只返回成功或失败的退出码。

–server1=<source>, –server2=<source>
这两个参数用于指定MySQL服务器的连接信息。

在MySQL中,如果要连接到指定的MySQL服务器,需要指定「连接参数(用户名、密码或套接字)」。MySQL Utilities提供了几种来提供这些信息的方法,如下(安全性由高到低):

· 使用.mylogin.cnf文件中的“登录路径(login-paths)”,格式:<login-path>[:<port>][:<socket>]

· 使用配置文件(未加密,不可见;且在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系统中要这么写:

`weird“db.name`.`weird“table1`:`other:weird“db.name`.`weird“table2`

需要的权限

工具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:

EVENT: e1

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:

CREATE TABLE `salaries` (

`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));

要生成一组将dbx.table3同步到db1.table1的SQL语句,Demo:

shell> mysqldiff –server1=root@host1 –server2=root@host2 \
–changes-for=server1 –difftype=sql \

db1.table1:dbx.table3
# server1 on host1: … connected.

# server2 on host2: … connected.

# Comparing db1.table1 to dbx.table3 [FAIL]

# Transformation statements:

ALTER TABLE db1.table1
ADD COLUMN notes char(30) AFTER a,

CHANGE COLUMN misc misc char(55);
Compare failed. One or more differences found.

要生成一组将db1.table1同步到dbx.table3的SQL语句,Demo:

shell> mysqldiff –server1=root@host1 –server2=root@host2 \
–changes-for=server2 –difftype=sql \

db1.table1:dbx.table3
# server1 on host1: … connected.

# server2 on host2: … connected.

# Comparing db1.table1 to dbx.table3 [FAIL]

# Transformation statements:

ALTER TABLE dbx.table3
DROP COLUMN notes,

CHANGE COLUMN misc misc char(30);
Compare failed. One or more differences found.

要同时生成用于同步dbx.table3和db1.table1的SQL,可以使用–show-reverse,但是“参照表”的SQL是被注释的,Demo:

shell> mysqldiff –server1=root@host1 –server2=root@host2 \
–show-reverse –difftype=sql \

db1.table1:dbx.table3
# server1 on host1: … connected.

# server2 on host2: … connected.

# Comparing db1.table1 to dbx.table3 [FAIL]

# Transformation statements:

# –destination=server1:

ALTER TABLE db1.table1
ADD COLUMN notes char(30) AFTER a,

CHANGE COLUMN misc misc char(55);
# –destination=server2:

# ALTER TABLE dbx.table3

# DROP COLUMN notes,

# CHANGE COLUMN misc misc char(30);

Compare failed. One or more differences found.

参考文献

更新日志

  • 04/04/2017 创建文章
  • 12/04/2017 文章内容修改