在開發及偵錯的過程中,需要比對新舊程式碼的差異,我們可以使用git/svn等版本控制工具進行比對。而不同版本的資料庫表結構也存在差異,我們同樣需要比對差異及取得更新結構的sql語句。
相關mysql影片教學推薦:《mysql教學》
#例如同一套程式碼,在開發環境正常,在測試環境出現問題,這時除了檢查伺服器設置,還需要比對開發環境與測試環境的資料庫表結構是否有差異。找到差異後需要更新測試環境資料庫表結構直到開發與測試環境的資料庫表結構一致。
我們可以使用mysqldiff工具來實作比對資料庫表結構及取得更新結構的sql語句。
mysqldiff工具在mysql-utilities軟體包中,而執行mysql-utilities需要安裝相依性mysql-connector -python
mysql-connector-python 安裝
下載位址:https://dev.mysql.com /downloads/connector/python/
mysql-utilities 安裝
下載位址:https://downloads.mysql.com /archives/utilities/
因為本人使用的是mac系統,可以直接使用brew安裝即可。
brew install caskroom/cask/mysql-connector-pythonbrew install caskroom/cask/mysql-utilities
安裝以後執行檢視版本指令,如果能顯示版本表示安裝成功
mysqldiff --versionMySQL Utilities mysqldiff version 1.6.5 License type: GPLv2
指令:
#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的參數使用方法可參考官方文件:
https://dev.mysql.com/doc/mysql-utilities/1.5/en/mysqldiff.html
建立測試資料庫表及資料
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=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` 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_INCREMENT存在差異
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比對兩個資料庫表結構的方法,更多相關知識請關注php中文網。
相關推薦:
解說php 基於redis使用令牌桶演算法實作流量控制的相關內容
##
以上是透過mysql比對兩個資料庫表結構的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!