mysqldiff window 下安裝以及使用
在開發工程中 我們需要進行程式碼比對
這時我們一般使用 BCompare(程式碼對比)、或者直接利用git 命令 gitdiff 來檢視程式碼差異
那麼 mysql 在使用的過程中 如果開發環境 和生產環境 中的 mysql 表結構不一致的話 造成的後果是非常嚴重的!
那麼 有沒有類似於 git diff 命令這種工具呢?! mysqldiff 顧名思義 和 gitdiff 命令 好像
那麼下面筆者介紹在windos下怎麼安裝 :
本文介紹mysqldiff工具來比較資料表結構,並生成差異SQL語句。
mysqldiff
類似Linux下的diff命令,用來比較物件的定義是否相同,並顯示不同的地方。
如果要比較資料庫是否一致,可以用另外一個工具:mysqldbcompare
(點選檢視教程)。
以下是mysqldiff
的用法。
1 安裝
mysqldiff
是MySQL Utilities中的一個指令碼,預設的MySQL不包含這個工具集,所以需要獨立安裝。
Linux系統在下載頁面選擇對應發行版。
安裝成功之後可以使用命令:
cmd中 mysqldiff --version
2 語法
mysqldiff
的語法格式是:
$ mysqldiff --server1=user:[email protected]:port:socket --server2=user:[email protected] :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
的修改。
直接來例項:
localhost
線上伺服器
mysql 都建立test 庫
localhost 本地mysql 建表tba
CREATE TABLE `tba` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(25) NOT NULL,
`age` int(10) unsigned NOT NULL,
`addtime` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8;
insert into `tba`(name,age,addtime) values('fdipzone',18,1514089188);
生產環境mysql test庫 建表tbb
CREATE TABLE `tbb` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`age` int(10) NOT NULL,
`addtime` int(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `tbb`(name,age,addtime) values('fdipzone',19,1514089188);
下面 使用mysqldiff對比兩表差異
E:\mysqldiff>mysqldiff --server1=root:[email protected]:3306:scoket --server2=haiyong:[email protected]:3306:socket test.tba:test.tbb
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:[email protected] --server2=root:[email protected] --changes-for=server2 --show-reverse --difftype=sql study.test1:study.test2
使用--skip-table-options
,
如果需要生成SQL檔案,加上輸出就可以了:
mysqldiff --server1=root:[email protected] --server2=root:[email protected] --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
及其後面的條件。