mysqldiff批量比對表結構差異


mysqldiff是mysql官方推薦的庫對比工具,MySQL Utilities中的一個腳本。可以比對兩個庫中缺少的表,相同的表缺少的字段。

1.下載mysqldiff

下載地址:http://downloads.mysql.com/archives/utilities/

2.下載mysql-connector(python),否則執行會報錯。因為這個插件是通過python連接器連接的。

下載地址:https://dev.mysql.com/downloads/connector/python/

3.安裝
通過tar.gz安裝和yum安裝mysql-utilities出現錯誤

export pythonpath=$pythonpath:/root/mysql-utilities-1.6.5/mysql/utilities/common/tools
試了也不行

安裝mysql5.6 yum源以rpm形式安裝的mysql-utilities不會報module找不到

解決
卸載原mysql-connector-python8.0版本
yum -y remove mysql-connector-python
並下載安裝mysql-connector-python-2.1.7

rpm -uvh https://cdn.mysql.com//downloads/connector-python/mysql-connector-python-2.1.7-1.el7.x86_64.rpm

mysqldbcompare --version
mysql utilities mysqldbcompare version 1.6.5
license type: gplv2
如果CENTOS版本較低,Python是2.6的是可以解決的,
但因為我的安裝環境是CentOS Linux release 7.5.1804 (Core) ,python版本2.7.5,嘗試過各種辦法安裝msyqldiff都是各種報錯,無法使用
最后考慮在docker中安裝,使用了CentOS6.10版本,可以成功使用mysqldiff工具了
docker run -itd centos:6 /bin/bash

# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8e85597eb102 centos:6 "/bin/bash" 2 months ago Up 2 months mysqldiff2

docker cp mysql-utilities-1.6.5-1.el6.noarch.rpm mysqldiff:/opt/mysqltools/

# docker exec -it mysqldiff2 /bin/bash

# yum install mysql-utilities-1.6.5-1.el7.noarch.rpm

# cat /etc/redhat-release
CentOS release 6.10 (Final)

# mysqldiff --version
MySQL Utilities mysqldiff version 1.6.5
License type: GPLv2


4.命令模板

mysqldiff --server1=user:pass@host:port:socket --server2=user:pass@host:port:socket db1.object1:db2.object1 db3:db4
這里講的是兩種用法。可以直接對比庫,db3:db4 ,也可以對比表 db1.table1:db2.table2
mysqldiff --server1=root:mysql5635@localhost:3306 --server2=root:mysql5635@localhost:3306 --changes-for=server2 \
--skip-table-options --show-reverse --difftype=sql test.test1:test.test2

--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的修改。
--force:完成所有的比較,不會在遇到一個差異之后退出
-vv:便於調試,輸出許多信息
-q:quiet模式,關閉多余的信息輸出

mysqldiff --server1=root:root456@10.20.30.122:3306 --server2=root:root456@10.40.50.122:3306 --changes-for=server2 --skip-table-options --show-reverse --difftype=sql elag:elag

# WARNING: Using a password on the command line interface can be insecure.
# server1 on localhost: ... connected.
# server2 on localhost: ... connected.
# Comparing elag.test1 to elag.test1 [FAIL]
# Transformation for --changes-for=server2:
#

ALTER TABLE `elag`.`test1`
DROP COLUMN D,
ADD PRIMARY KEY(`id`),
CHANGE COLUMN b b varchar(10) NULL,
ADD COLUMN d int(11) NULL AFTER c,
CHANGE COLUMN a a varchar(10) NOT NULL,
CHANGE COLUMN c c varchar(10) NULL COMMENT 'c';

#
# Transformation for reverse changes (--changes-for=server1):
#
# ALTER TABLE `elag`.`test1`
# DROP PRIMARY KEY,
# DROP COLUMN d,
# CHANGE COLUMN b b varchar(5) NULL,
# ADD COLUMN D int(11) NULL AFTER c,
# CHANGE COLUMN a a varchar(10) NULL,
# CHANGE COLUMN c c varchar(10) NULL;
#

# Compare failed. One or more differences found.

注意事項
1.mysqldiff工具比對兩台數據庫的時候,只要發現有異常就會停止繼續比對,如果要繼續比對,可以加參數--force
mysqldiff --server1=diff:diff900TEST@10.20.30.122:3306 --server2=diff:diff900TEST@10.40.50.122:3306 \
--changes-for=server2 --skip-table-options --difftype=sql --force elag:elag eclipse:eclipse

2.mysqldiff提供的建議修改SQL命令,drop index的操作比較危險,可以改成rename索引名稱
例如
ALTER TABLE `eclipse`.`device_scan_info`
DROP INDEX IDX_BILL_CODE,
DROP INDEX IDX_CREATE_TIME,
ADD INDEX IDX_DEVICE_SCAN_BILL_CODE (BILL_CODE),
ADD INDEX IDX_DEVICE_SCAN_CREATE_TIME (CREATE_TIME);

ALTER TABLE eclipse.device_scan_info rename INDEX IDX_BILL_CODE to IDX_DEVICE_SCAN_BILL_CODE,\
rename INDEX IDX_CREATE_TIME to IDX_DEVICE_SCAN_CREATE_TIME;

3.如果批量比較很多服務器,那么需要用到批量工具,建議用python fabric,或者SHELL腳本遍歷

4.修改的表中涉及到中文字符的,注意加參數--default-character-set=utf8
mysql --default-character-set=utf8 -e "ALTER TABLE elag.data_sync_log CHANGE COLUMN SERVER_HOST_CODE \
SERVER_HOST_CODE varchar(255) NULL COMMENT '測試編碼';"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM