本文介绍 mysqldiff( dev.mysql 商业网/doc/mysql-utilities/1.5/en/mysqldiff.html) 工具来比较数据表结构,并生成差异SQL语句。
mysqldiff 类似 Linux 下的 diff 命令,用来比较对象的定义是否相同,并显示不同的地方。
如果要比较数据库是否一致,可以用另外一个工具:mysqldbcompare。
以下是 mysqldiff 的用法。
mysqldiff 是 MySQL Utilities 中的一个脚本,默认的 MySQL 不包含这个工具集,所以需要独立安装。
Linux系统在下载页面选择对应发行版。
mysqldiff 的语法格式是:
$ mysqldiff --server1=user:pass@host:port:socket --server2=user:pass@host:port:socket db1.object1:db2.object1 db3:db4
这个语法有两个用法:
接下来看一些主要的参数:
先创建两个表。
use study;
create table test1(
id int not null primary key,
a varchar(10) not null,
b varchar(10),
c varchar(10) comment 'c',
d int
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='test1';
create table test2(
id int not null,
a varchar(10),
b varchar(5),
c varchar(10),
D int
)ENGINE=myisam DEFAULT CHARSET=utf8 COMMENT='test2';
不使用 --skip-table-options
mysqldiff --server1=root:root@localhost --server2=root:root@localhost --changes-for=server2 --show-reverse --difftype=sql study.test1:study.test2

使用 --skip-table-options

如果需要生成 SQL 文件,加上输出就可以了:
mysqldiff --server1=root:root@localhost --server2=root:root@localhost --changes-for=server2 --show-reverse --difftype=sql study.test1:study.test2 > output.sql
说明:执行 MySQL 语句时可能会遇到这样错误:Error 1054 – Unknown column ‘name’ in ‘aspect’
这是因为 mysqldbcompare 生成的 ALTER 语句中,用逗号 , 拼装了多条 ADD、CHANGE 等语句,如果这些语句还包含 AFTER 关键字,就会提示这个错误并中断执行MySQL语句。解决的办法就是:去除 AFTER 及其后面的条件。
这可能是MySQL的一个Bug,详情参考: bugs.mysql 商业网/bug.php?id=34972 和 bugs.mysql 商业网/bug.php?id=60650。

