1,全庫比較各個表的不同,並輸出到文件
mysqldiff --server1=root:root@localhost --server2=root:root@localhost --difftype=sql aaa:bbb --changes-for=server1 --force > C:\output.sql
2,檢查是否有新表
mysqldiff --server1=root:root@localhost --server2=root:root@localhost --difftype=sql aaa:bbb --changes-for=server1
3,如果有新表,創建簡單的表結構,在運行1,2等步驟
注意:
Auto_increment的處理有點問題:
比較出來的腳本,執行后依然沒有自動增長
ALTER TABLE `aaa`.`tableb`
CHANGE COLUMN id id int(11) NOT NULL,
AUTO_INCREMENT=1;
用下面的才會自動增長
ALTER TABLE `aaa`.`tableb`
CHANGE COLUMN id id int(11) NOT NULL
AUTO_INCREMENT;
本文介紹mysqldiff工具來比較數據表結構,並生成差異SQL語句。
mysqldiff
類似Linux下的diff命令,用來比較對象的定義是否相同,並顯示不同的地方。
如果要比較數據庫是否一致,可以用另外一個工具:mysqldbcompare
(點擊查看教程)。
以下是mysqldiff
的用法。
1 安裝
mysqldiff
是MySQL Utilities中的一個腳本,默認的MySQL不包含這個工具集,所以需要獨立安裝。
- MySQL Utilities下載地址:http://downloads.mysql.com/archives/utilities/。
- Windows系統中需提前安裝“Visual C++ Redistributable Packages for Visual Studio 2013”,下載地址:https://www.microsoft.com/en-gb/download/details.aspx?id=40784。
Linux系統在下載頁面選擇對應發行版。
2 語法
mysqldiff
的語法格式是:
$ mysqldiff --server1=user:pass@host:port:socket --server2=user:pass@host:port:socket db1.object1:db2.object1 db3:db4
這個語法有兩個用法:
db1:db2
:如果只指定數據庫,那么就將兩個數據庫中互相缺少的對象顯示出來,不比較對象里面的差異。這里的對象包括表、存儲過程、函數、觸發器等。db1.object1:db2.object1
:如果指定了具體表對象,那么就會詳細對比兩個表的差異,包括表名、字段名、備注、索引、大小寫等所有的表相關的對象。
接下來看一些主要的參數:
--server1
:配置server1
的連接。--server2
:配置server2
的連接。--character-set
:配置連接時用的字符集,如果不顯示配置默認使用character_set_client
。--width
:配置顯示的寬度。--skip-table-options
:保持表的選項不變,即對比的差異里面不包括表名
、AUTO_INCREMENT
、ENGINE
、CHARSET
等差異。-
-
-d
-
DIFFTYPE
--difftype=DIFFTYPE
:差異的信息顯示的方式,有[unified|context|differ|sql]
,默認是unified
。如果使用sql,那么就直接生成差異的SQL,這樣非常方便。 -
--changes-for=
:修改對象。例如--changes-for=server2
,那么對比以sever1
為主,生成的差異的修改也是針對server2
的對象的修改。--show-reverse
:在生成的差異修改里面,同時會包含server2
和server1
的修改。
3 范例
先創建兩個表。
-
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,詳情參考:http://bugs.mysql.com/bug.php?id=34972 和 http://bugs.mysql.com/bug.php?id=60650。
參考資料: