mysql主從數據對比工具簡介

1 Checksum

1.1 checksum原理

checksum table的原理是對錶中的數據進行一行一行的較驗和計算,在執行checksum命令時,表會被加一個讀鎖(read lock),所以對於大表,這是一個很耗時的過程。html

讀鎖:又叫S鎖/共享鎖;當MySQL的一個進程爲某一表開啓讀鎖以後,其餘的進程包含自身都沒有權利去修改這表表的內容。可是全部的進程仍是能夠讀出表裏面的內容的。可是不能實現更新。python

1.2 語法

在數據庫中輸入checksum  table   庫.表;mysql

 說明:checksum沒法對錶結構,表屬性等進行檢查,只對表中的數據進行檢驗;git

2 mysqldiff

mysqldiff該工具是官方mysql-utilities工具集的一個腳本,能夠用來對比不一樣數據庫之間的表結構,或者同個數據庫間的表結構,並生成差別SQL語句。mysqldiff 是經過對象名稱(有表,索引,視圖,圖表缺省值,規則,觸發器,用戶,函數,存儲過程等)來進行比較的;github

2.1 mysqldiff安裝

#wget https://cdn.mysql.com/archives/mysql-utilities/mysql-utilities-1.6.5.tar.gz
#tar xf mysql-utilities-1.6.5.tar.gz
#cd mysql-utilities-1.6.5
#python setup.py build
#python setup.py install
#mysqldiff --version

2.2 語法  

語法示例:sql

#mysqldiff --server1=user:pass@host:port:socket --server2=user:pass@host:port:socket  db1.object1:db2.object1  db3:db4數據庫

這個語法有兩個用法:服務器

db1.object1:db2.object1:若是指定了具體表對象,那麼就會詳細對比兩個表的差別,包括表名、字段名、備註、索引、大小寫等全部的表相關的對象socket

db3:db4:若是隻指定數據庫,那麼就將兩個數據庫中互相缺乏的對象顯示出來,不比較對象裏面的差別。這裏的對象包括表、存儲過程、函數、觸發器等。函數

2.3 主要參數

  • --server1:配置server1的鏈接。
  • --server2:配置server2的鏈接。
  • --character-set:配置鏈接時用的字符集,若是不顯示配置默認使用character_set_client。
  • --width:配置顯示的寬度。
  • --skip-table-options:保持表的選項不變,即對比的差別裏面不包括表名、AUTO_INCREMENT(自增)、ENGINE(存儲引擎)、CHARSET(配置鏈接時用的字符集)等差別。
  • -v, --verbose:控制顯示多少信息。例如,- v =冗長,-vv=更詳細,-vvv=調試;
  • -d DIFFTYPE,--difftype=DIFFTYPE:差別的信息顯示的方式,有[unified|context|differ|sql],默認是unified。若是使用sql,那麼就直接生成差別的SQL,這樣很是方便。

輸出類型,也就是difftype選項值:

(1)unified (默認)顯示統一的格式輸出;

(2)context以上下文格式輸出;

(3)differ以differ-style 格式輸出;

(4)sql以生成轉換SQL語句輸出;

  • --changes-for=:修改對象。例如--changes-for=server2,那麼對比以sever1爲主,生成的差別的修改也是針對server2的對象的修改。
  • --show-reverse:在生成的差別修改裏面,同時會包含server2和server1的修改。

2.4 對比效果

注意:發現運行時須要用戶有spuer權限,不然沒法運行,後面的工具都是如此;

示例1:

1)表test1和test2對比,顯示test2的不一樣,以及對test2的sql修改

1 mysqldiff --server1=root:0@localhost --server2=root:0@localhost --changes-for=server2 --difftype=sql study.test1:study.test2

注意:以SQL輸出的限制有:

1.對於分區表,若是分區表有差別,將對全部的改變生產。 

2.ALTER TABLE 語句,顯示通過並省略分區差別。

3.事件重命名不支持。

4.不支持事務定義的條款。

5.不支持MySQL Cluster 的SQL擴展特性。

示例2:

(2)輸出類型對比,輸出類型,也就是difftype選項值:

1.unified (默認)顯示統一的格式輸出;

2.context以上下文格式輸出;

3.differ以differ-style 格式輸出;

4.sql以生成轉換SQL語句輸出;

1.輸出類型(默認)--difftype=unified;
mysqldiff --server1=root:0@localhost --server2=root:0@localhost --changes-for=server2   study.test1:study.test2 

2.輸出類型--difftype=context;
mysqldiff --server1=root:0@localhost --server2=root:0@localhost --changes-for=server2  --difftype=context    study.test1:study.test2

3.輸出類型--difftype=differ;
mysqldiff --server1=root:0@localhost --server2=root:0@localhost --changes-for=server2  --difftype=differ    study.test1:study.test2

4.輸出類型--difftype=sql;
mysqldiff --server1=root:0@localhost --server2=root:0@localhost --changes-for=server2  --difftype=sql    study.test1:study.test2

示例3:

若是須要生成SQL文件,加上輸出就能夠;

mysqldiff --server1=root:0@localhost --server2=root:0@localhost  --changes-for=server2 --difftype=sql study.test1:study.test2 > output.sql

3 mysqldbcompare

mysqldbcompare該工具是官方mysql-utilities工具集的一個腳本,能夠用來檢查不一樣數據庫之間的數據一致性,檢查內容包括數據庫字符集、表結構、數據內容,只要有一個不同,則檢查不經過。

數據庫中的對象包括:表、視圖、觸發器、存儲過程、函數和事件。每個對象類型計數可使用-vv選項顯示。

3.1 mysqldbcompare安裝

#wget https://cdn.mysql.com/archives/mysql-utilities/mysql-utilities-1.6.5.tar.gz
#tar xf mysql-utilities-1.6.5.tar.gz
#cd mysql-utilities-1.6.5
#python setup.py build
#python setup.py install
#mysqldiff --version 

說明:mysqldiff和mysqldbcompare都是mysql-utilities工具集的腳本,故只要一次安裝便可,兩個命令都有;

3.2 語法

語法示例:

#mysqldbcompare --server1=user:pass@host:port:socket --server2=user:pass@host:port:socket db1:db2

Mysqldbcompare和mysqldiff語法結構類似,能夠參照mysqldiff;

3.3 主要參數

  • --server1:MySQL服務器1配置。
  • --server2:MySQL服務器2配置。若是是同一服務器,--server2能夠省略。
  • db1:db2:要比較的兩個數據庫。若是比較不一樣服務器上的同名數據庫,能夠省略:db2。
  • --all:比較全部兩服務器上全部的同名數據庫。--exclude排除無需比較的數據庫。
  • --run-all-tests:運行完整比較,遇到第一次差別時不中止。
  • --changes-for=:修改對象。例如--changes-for=server2,那麼對比以sever1爲主,生成的差別的修改也是針對server2的對象的修改。
  • -d DIFFTYPE,--difftype=DIFFTYPE:差別的信息顯示的方式,有[unified|context|differ|sql],默認是unified。若是使用sql,那麼就直接生成差別的SQL。
  • -v, --verbose:控制顯示多少信息。例如,- v =冗長,-vv=更詳細,-vvv=調試;
  • --show-reverse:在生成的差別修改裏面,同時會包含server2和server1的修改。
  • --skip-table-options:保持表的選項不變,即對比的差別裏面不包括表名、AUTO_INCREMENT、ENGINE、CHARSET等差別。
  • --skip-diff:跳過對象定義比較檢查。所謂對象定義,就是CREATE語句()裏面的部分,--skip-table-options是()外面的部分。
  • --skip-object-compare:默認狀況下,先檢查兩個數據庫中相互缺失的對象,再對都存在對象間的差別。這個參數的做用就是,跳過第一步,不檢查相互缺失的對象。
  • --skip-checksum-table:數據一致性驗證時跳過CHECKSUM TABLE。
  • --skip-data-check:跳過數據一致性驗證。
  • --skip-row-count:跳過字段數量檢查。
  • --disable-binary-logging 若是服務器上啓用二進制日誌,不想比較日誌這步,可使用選項來禁用。

3.4  對比效果

示例1:

庫study和study1對比,顯示study1的不一樣,以及對study1的sql修改
mysqldbcompare --server1=root:0@localhost   --server2=root:0@localhost --changes-for=server2  --difftype=sql --run-all-tests study:study1

4 pt-table-checksum

pt-table-checksum其原理是在主庫執行基於statement的sql語句來生成主庫數據塊的checksum,把相同的sql語句傳遞到從庫執行,並在從庫上計算相同數據塊的checksum,最後,比較主從庫上相同數據塊的checksum值,由此判斷主從數據是否一致。檢測過程根據惟一索引將表按row切分爲塊(chunk),覺得單位計算,能夠避免鎖表。檢測時會自動判斷複製延遲、 master的負載, 超過閥值後會自動將檢測暫停,減少對線上服務的影響。

4.1 安裝

#yum -y install perl-DBI perl-devel perl-DBD-MySQL perl-IO-Socket-SSL.noarch  perl-Time-HiRes  perl perl-Digest-MD5 perl-TermReadKey  
#wget https://www.percona.com/downloads/percona-toolkit/3.0.11/binary/tarball/percona-toolkit-3.0.11_x86_64.tar.gz
#tar xf  percona-toolkit-3.0.11_x86_64.tar.gz
#cd  percona-toolkit-3.0.11
#perl Makefile.PL
#make
#make install

4.2 經常使用參數

  • --nocheck-replication-filters :不檢查複製過濾器,建議啓用。後面能夠用--databases來指定須要檢查的數據庫。
  • --no-check-binlog-format : 不檢查複製的binlog模式,要是binlog模式是ROW,則會報錯。
  • --replicate-check-only :只顯示不一樣步的信息。
  • --replicate= :把checksum的信息寫入到指定表中,建議直接寫到被檢查的數據庫當中。
  • --create-replicate-table 選項會自動建立 percona.checksums 表
  • --databases= :指定須要被檢查的數據庫,多個則用逗號隔開。
  • --tables= :指定須要被檢查的表,多個用逗號隔開
  • --empty-replicate-table:每一個表checksum開始前,清空它以前的檢測數據(不影響其它表的checksum數據),默認yes。固然若是使用--resume啓動檢測數據不會清空。當啓用--noempty-replicate-table即不清空時,不計算計算chunk,只計算。
  • --recursion-method:發現從庫的方式;
  • h= :Master的地址
  • u= :用戶名
  • p=:密碼
  • P= :端口

4.3 注意事項

1)第一次運行的時候須要加上--create-replicate-table參數,生成checksums表!!若是不加這個參數,那麼就須要在對應庫下手工添加這張表了,表結構SQL以下:

create database db5;
use db5;
CREATE TABLE checksums (
   db               char(64)       NOT NULL,
   tb1               char(64)        NOT NULL,
   chunk             int            NOT NULL,
   chunk_time        float           NULL,
   chunk_index       varchar(200)     NULL,
   lower_boundary    text            NULL,
   upper_boundary    text            NULL,
   this_crc            char(40)     NOT NULL,
   this_cnt           int          NOT NULL,
   master_crc         char(40)         NULL,
   master_cnt        int             NULL,
   ts               timestamp    NOT NULL,
   PRIMARY KEY (db, tb1, chunk),
   INDEX ts_db_tb1 (ts, db, tb1)
) ENGINE=InnoDB; 

2)受權

(1)根據測試,須要一個即能登陸主庫,也能登陸從庫的帳號;
(2)只能指定一個host,必須爲主庫的IP;
(3)在檢查時會向表加S鎖(讀鎖/共享鎖);
(4)運行以前須要從庫的同步IO和SQL進程是YES狀態(show slave status\G;)。

4.4 pt-table-checksum使用梳理

(1)對特定表一致性進行檢查
 pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=percona.checksums 
--create-replicate-table --databases=study --tables=test1 h=192.168.122.65,u=jin,p=123456,P=3306

 解釋:

TS :完成檢查的時間。
ERRORS :檢查時候發生錯誤和警告的數量。
DIFFS :0表示一致,1表示不一致。當指定--no-replicate-check時,會一直爲0,當指定--replicate-check-only會顯示不一樣的信息。
ROWS :表的行數。
CHUNKS :被劃分到表中的塊的數目。
SKIPPED :因爲錯誤或警告或過大,則跳過塊的數目。
TIME :執行的時間。
TABLE :被檢查的表名。

(2)對特定數據庫的一致性進行檢查
pt-table-checksum --nocheck-replication-filters --replicate=percona.checksums --no-check-binlog-format 
--databases=’study,study1’ h=192.168.122.65,u=jin,p=123456,P=3306

4.5 pt-table-sync用法梳理

 若是經過pt-table-checksum 檢查找到了不一致的數據表,那麼如何同步數據呢?即如何修復MySQL主從不一致的數據,讓他們保持一致性呢?

這時候能夠利用另一個工具pt-table-sync。

pt-table-sync: 高效的同步MySQL表之間的數據,他能夠作單向和雙向同步的表數據。他能夠同步單個表,也能夠同步整個庫。它不一樣步表結構、索引、或任何其餘模式對象。因此在修復一致性以前須要保證他們表存在。

(1)參數解釋:

  • --replicate= :指定經過pt-table-checksum獲得的表,這2個工具差很少都會一直用。
  • --databases= : 指定執行同步的數據庫。
  • --tables= :指定執行同步的表,多個用逗號隔開。
  • --sync-to-master :指定一個DSN,即從的IP,他會經過show processlist或show slave status 去自動的找主。
  • h= :服務器地址,命令裏有2個ip,第一次出現的是Master的地址,第2次是Slave的地址。
  • u= :賬號。
  • p= :密碼。
  • --print :打印,但不執行命令。
  • --execute :執行命令。

(2) 示例語句

pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=percona.checksums 
--databases=study --tables=test1 h=192.168.122.65,u=jin,p=123456,P=3306

pt-table-sync --replicate=percona.checksums h=192.168.122.65,u=jin,p=123456 h=192.168.122.67,u=jin,p=123456 --print --execute

建議:
修復數據的時候,最好仍是用--print打印出來的好,這樣就能夠知道那些數據有問題,能夠人爲的干預下。
否則直接執行了,出現問題以後更很差處理。總之仍是在處理以前作好數據的備份工做。

如上修復後,再次檢查,發現主從庫數據已經一致了!

pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=percona.checksums 
--databases=study --tables=test1 h=192.168.122.65,u=jin,p=123456,P=3306

問題說明:
在上面的操做中,在主庫裏添加pt-table-checksum檢查的權限(從庫能夠不受權)後,進行數據一致性檢查操做,會在操做的庫(實例中是study、study1)下產生一個checksums表!
這張checksums表是pt-table-checksum檢查過程當中產生的。這張表一旦產生了,默認是刪除不了的,而且這張表所在的庫也默認刪除不了,刪除後過一下子就又會出來。


參考連接:

https://www.cnblogs.com/kevingrace/p/6261091.html

https://github.com/seanlook/px-table-checksum

https://blog.csdn.net/lanwilliam/article/details/78664620

相關文章
相關標籤/搜索