在開發及除錯的過程中,需要比對新舊**的差異,我們可以使用git/svn等版本控制工具進行比對。而不同版本的資料庫表結構也存在差異,我們同樣需要比對差異及獲取更新結構的sql語句。
例如同一套**,在開發環境正常,在測試環境出現問題,這時除了檢查伺服器設定,還需要比對開發環境與測試環境的資料庫表結構是否存在差異。找到差異後需要更新測試環境資料庫表結構直到開發與測試環境的資料庫表結構一致。
我們可以使用mysqldiff工具來實現比對資料庫表結構及獲取更新結構的sql語句。
1.mysqldiff安裝方法
mysqldiff工具在mysql-utilities軟體包中,而執行mysql-utilities需要安裝依賴mysql-connector-python
mysql-connector-python 安裝
**位址:
mysql-utilities 安裝
**位址:
因本人使用的是mac系統,可以直接使用brew安裝即可。
brew install caskroom/cask/mysql-connector-python
brew install caskroom/cask/mysql-utilities
安裝以後執行檢視版本命令,如果能顯示版本表示安裝成功
mysqldiff --version
mysql utilities mysqldiff version 1.6.5
license type: gplv2
2.mysqldiff使用方法
命令:mysqldiff --server1=root@host1 --server2=root@host2 --difftype=sql db1.table1:dbx.table3
引數說明:
--server1 指定資料庫1
--server2 指定資料庫2
比對可以針對單個資料庫,僅指定server1選項可以比較同乙個庫中的不同表結構。
--difftype 差異資訊的顯示方式
unified (default)
顯示統一格式輸出
context
顯示上下文格式輸出
differ
顯示不同樣式的格式輸出
sql
顯示sql轉換語句輸出
如果要獲取sql轉換語句,使用sql這種顯示方式顯示最適合。
--character-set 指定字符集
--changes-for 用於指定要轉換的物件,也就是生成差異的方向,預設是server1
--changes-for=server1 表示server1要轉為server2的結構,server2為主。
--changes-for=server2 表示server2要轉為server1的結構,server1為主。
--skip-table-options 忽略auto_increment, engine, charset的差異。
--version 檢視版本
更多mysqldiff的引數使用方法可參考官方文件:
3.例項
建立測試資料庫表及資料
create database testa;
create database testb;
use testa;
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);
use testb;
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);
執行差異比對,設定server1為主,server2要轉為server1資料庫表結構
mysqldiff --server1=ro程式設計客棧ot@localhost --server2=root@localhost --changes-for=server2 --difftype=sql testa.tba:testb.tbb;
# server1 on localhost: ... connected.
# server2 on localhost: ... connected.
# comparing testa.tba to testb.tbb [fail]
# transformation for --changes-for=server2:
#alter table `testb`.`t
change column addtime addtime int(10) unsigned not null,
change column age age int(10) unsigned not null,
change column name name varchar(25) not null,
rename to testa.tba
, auto_increment=1002;
# compare failed. one or more differences found.
執行mysqldiff返回的更新sql語句
mysql> alter table `testb`.`tbb`
-> change column addtime addtime int(10) unsigned not null,
-> change column age age int(10) unsigned not null,
-> change column name name varchar(25) not null;
query ok, 0 rows affected (0.03 sec)
再次執行mysqldiff進行比對,結構沒有差異,只有auto_incrwww.cppcns.comement存在差異
mysqldiff --server1=root@localhost --server2=root@localhost --changes-for=server2 --difftype=sql testa.tba:testb.tbb;
# server1 on localhost: ... connected.
# server2 on localhost: ... connected.
# comparing testa.tba to testb.tbb [fail]
# transformation for --changes-for=server2:
#alter table `testb`.`tbb`
rename to testa.tba
, auto_increment=1002;
# compare failed. one or more differences found.
設定忽略auto_increment再進行差異比對,比對通過
mysqldiff --server1=root@localhost --server2=root@localhost --changes-for=server2 --skip-table-options --difftype=sql testa.tba:testb.tbb;
# server1 on localhost: ... connected.
# server2 on localhost: ... connected.
# comparing testa.tba to testb.tbb [pass]
# success. all objects are the same.
本文標題: mysql如何比對兩個資料庫表結構的方法
本文位址:
mysql比對兩個資料庫表結構的方法
在開發及除錯的過程中,需要比對新舊 的差異,我們可以使用git svn等版本控制工具進行比對。而不同版本的資料庫表結構也存在差異,我們同樣需要比對差異及獲取更新結構的sql語句。例如同一套 在開發環境正常,在測試環境出現問題,這時除了檢查伺服器設定,還需要比對開發環境與測試環境的資料庫表結構是否存在...
MySQL 兩個資料庫表中合併資料
如果有 t1 和 t2 兩個資料庫 它們兩個對應的字段是相同的。如何將 t2 的資料插入到t1中去呢?insert into t1 select from t2 insert into domestic auction artron 2018 detail info 1 4 all select f...
對比兩個資料庫表結構
在專案做好後實施了以後,可能因為需求等原因需要公升級,這時候一般都是在測試系統改好後在更新到正式系統.儲存過程,檢視等可以直接通過全部刪除在建立進行更新,但是表因為正式系統裡已有資料所以無法通過該方式進行更新.只能更改表結構,而這時有可能因為更改的表結構比較多,而出現有的表忘了更新.該程式可以對比兩...