mysql如何比對(duì)兩個(gè)數(shù)據(jù)庫(kù)表結(jié)構(gòu)的方法
在開發(fā)及調(diào)試的過程中,需要比對(duì)新舊代碼的差異,我們可以使用git/svn等版本控制工具進(jìn)行比對(duì)。而不同版本的數(shù)據(jù)庫(kù)表結(jié)構(gòu)也存在差異,我們同樣需要比對(duì)差異及獲取更新結(jié)構(gòu)的sql語(yǔ)句。
例如同一套代碼,在開發(fā)環(huán)境正常,在測(cè)試環(huán)境出現(xiàn)問題,這時(shí)除了檢查服務(wù)器設(shè)置,還需要比對(duì)開發(fā)環(huán)境與測(cè)試環(huán)境的數(shù)據(jù)庫(kù)表結(jié)構(gòu)是否存在差異。找到差異后需要更新測(cè)試環(huán)境數(shù)據(jù)庫(kù)表結(jié)構(gòu)直到開發(fā)與測(cè)試環(huán)境的數(shù)據(jù)庫(kù)表結(jié)構(gòu)一致。
我們可以使用mysqldiff工具來實(shí)現(xiàn)比對(duì)數(shù)據(jù)庫(kù)表結(jié)構(gòu)及獲取更新結(jié)構(gòu)的sql語(yǔ)句。
1.mysqldiff安裝方法
mysqldiff工具在mysql-utilities軟件包中,而運(yùn)行mysql-utilities需要安裝依賴mysql-connector-python
mysql-connector-python 安裝
下載地址:https://dev.mysql.com/downloads/connector/python/
mysql-utilities 安裝
下載地址:https://downloads.mysql.com/archives/utilities/
因本人使用的是mac系統(tǒng),可以直接使用brew安裝即可。
brew install caskroom/cask/mysql-connector-python brew install caskroom/cask/mysql-utilities
安裝以后執(zhí)行查看版本命令,如果能顯示版本表示安裝成功
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
參數(shù)說明:
--server1 指定數(shù)據(jù)庫(kù)1
--server2 指定數(shù)據(jù)庫(kù)2
比對(duì)可以針對(duì)單個(gè)數(shù)據(jù)庫(kù),僅指定server1選項(xiàng)可以比較同一個(gè)庫(kù)中的不同表結(jié)構(gòu)。
--difftype 差異信息的顯示方式
unified (default)
顯示統(tǒng)一格式輸出
context
顯示上下文格式輸出
differ
顯示不同樣式的格式輸出
sql
顯示SQL轉(zhuǎn)換語(yǔ)句輸出
如果要獲取sql轉(zhuǎn)換語(yǔ)句,使用sql這種顯示方式顯示最適合。
--character-set 指定字符集
--changes-for 用于指定要轉(zhuǎn)換的對(duì)象,也就是生成差異的方向,默認(rèn)是server1
--changes-for=server1 表示server1要轉(zhuǎn)為server2的結(jié)構(gòu),server2為主。
--changes-for=server2 表示server2要轉(zhuǎn)為server1的結(jié)構(gòu),server1為主。
--skip-table-options 忽略AUTO_INCREMENT, ENGINE, CHARSET的差異。
--version 查看版本
更多mysqldiff的參數(shù)使用方法可參考官方文檔:
https://dev.mysql.com/doc/mysql-utilities/1.5/en/mysqldiff.html
3.實(shí)例
創(chuàng)建測(cè)試數(shù)據(jù)庫(kù)表及數(shù)據(jù)
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);
執(zhí)行差異比對(duì),設(shè)置server1為主,server2要轉(zhuǎn)為server1數(shù)據(jù)庫(kù)表結(jié)構(gòu)
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.
執(zhí)行mysqldiff返回的更新sql語(yǔ)句
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)
再次執(zhí)行mysqldiff進(jìn)行比對(duì),結(jié)構(gòu)沒有差異,只有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.
設(shè)置忽略AUTO_INCREMENT再進(jìn)行差異比對(duì),比對(duì)通過
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.
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- MySQL查詢數(shù)據(jù)庫(kù)所有表名以及表結(jié)構(gòu)其注釋(小白專用)
- mysql將數(shù)據(jù)庫(kù)中所有表結(jié)構(gòu)和數(shù)據(jù)導(dǎo)入到另一個(gè)庫(kù)的方法(親測(cè)有效)
- MySQL數(shù)據(jù)庫(kù)線上修改表結(jié)構(gòu)的方法
- 利用Python批量導(dǎo)出mysql數(shù)據(jù)庫(kù)表結(jié)構(gòu)的操作實(shí)例
- MYSQL數(shù)據(jù)庫(kù)表結(jié)構(gòu)優(yōu)化方法詳解
- 詳解 linux mysqldump 導(dǎo)出數(shù)據(jù)庫(kù)、數(shù)據(jù)、表結(jié)構(gòu)
- mysql如何將數(shù)據(jù)庫(kù)中的所有表結(jié)構(gòu)和數(shù)據(jù)導(dǎo)入到另一個(gè)庫(kù)
相關(guān)文章
完美轉(zhuǎn)換MySQL的字符集 解決查看utf8源文件中的亂碼問題
本人轉(zhuǎn)換過好多數(shù)據(jù)了,也用過了好多的辦法,個(gè)人感覺最好用的就是使用MySQL命令導(dǎo)出導(dǎo)入中將字符集轉(zhuǎn)換過去2011-11-11如何使用MySQL一個(gè)表中的字段更新另一個(gè)表中字段
這篇文章主要介紹了如何使用MySQL一個(gè)表中的字段更新另一個(gè)表中字段,需要的朋友可以參考下2018-11-11允許遠(yuǎn)程用戶訪問mysql服務(wù)sql語(yǔ)句
本節(jié)主要介紹了如何允許遠(yuǎn)程用戶訪問mysql服務(wù),本例授權(quán)192.168.14.1 主機(jī)的cakephp用戶訪問cakephp數(shù)據(jù)庫(kù)2014-07-07深入mysql "ON DUPLICATE KEY UPDATE" 語(yǔ)法的分析
本篇文章是對(duì)mysql "ON DUPLICATE KEY UPDATE"語(yǔ)法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06自學(xué)MySql內(nèi)置函數(shù)知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是關(guān)于MySql內(nèi)置函數(shù)的知識(shí)點(diǎn)總結(jié)內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。2020-01-01