數據一致性校驗及數據同步,運維必看

    主從數據不一致對DBA來講是一個比較頭疼的事情,剛接觸MySQL時,遇到這種問題我通常採用從新還原備庫的方式恢復數據,這對我來講是個很痛苦的過程。今天就來介紹兩款pt工具,經過這兩款工具能夠針對數據不一致的狀況進行快速檢測和修復。

pt-table-checksumcss


    pt-table-checksum能夠在線校驗主從數據庫的一致性,他能夠在主庫上執行檢查語句,在線檢查MySQL複製的一致性,而後生成replace語句,經過複製傳遞到從庫,再更新master_crc的值。最後 經過檢測從服務器的this_crc和master_crc的值判斷主從數據是否一致。 果複製有延遲,在從庫的checksum會暫停直到遇上主庫的計算時間點。
注意事項:
1. 主從數據庫必須是同步狀態。
2. 表中要有主鍵或者惟一索引。
使用示例
1. 首先咱們先建立一個校驗用戶
mysql> grant select,insert,update,delete,create,drop,super,process,replication slave on *.* to 'syncuser'@'%' identified by 'Syncuser@123';
2. 經過pt-table-checksum命令對主從數據進行校驗。
[root@node1 ~]# pt-table-checksum -usyncuser -pSyncuser@123 --nocheck-replication-filters --no-check-binlog-format --databases=test --replicate=test.checksums --create-replicate-tableChecking if all tables can be checksummed ...Starting checksum ... TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE09-04T21:36:43 0 0 0 0 1 0 0.089 test.efs_sys_loginfo409-04T21:36:43 0 0 1006 0 1 0 0.089 test.groupby09-04T21:36:43 0 0 0 0 1 0 0.030 test.groupby109-04T21:36:43 0 1 1006 0 1 0 0.030 test.groupby209-04T21:36:43 0 0 7 0 1 0 0.030 test.student09-04T21:36:43 0 0 7 0 1 0 0.032 test.student109-04T21:36:43 0 1 0 8 1 0 0.034 test.t09-04T21:36:43 0 0 57344 0 4 0 0.328 test.t109-04T21:36:43 0 1 1 0 1 0 0.028 test.test09-04T21:36:43      0      0        8          0       1       0   0.036 test.tuser
3. 參數詳解
--nocheck-replication-filters:不檢查複製的過濾規則,好比replicate-ignore-db、replicate-wild-do-table。
--no-check-binlog-format:不檢查複製的binlog模式,若是binlog模式是row模式,須要啓用該參數。
--create-replicate-table:第一次進行checksum須要啓用該參數,會進行checksum表的建立,用於存放結果。
--replicate=test.checksums:存放checksum結果的表。
--databases:表示要檢查的庫。
--tables(-t):表示要檢查的表。
--replicate-check-only:表示只顯示不一樣步的表。
--recursion-method:正常狀況下工具會自動識別從庫,若是識別失敗,能夠用該參數 指定查找slave的方法,參數有四種,分別是processlist、hosts、dsn=DSN、no四種,用來決定查找slave的方式是經過show processlist、show slave hosts仍是經過dsn=DSN的方式。
採用dsn=DSN方式時須要先建立dsn表,建表語句以下:
CREATE TABLE `dsns` (`id` int(11) NOT NULL AUTO_INCREMENT,`parent_id` int(11) DEFAULT NULL,`dsn` varchar(255) NOT NULL,PRIMARY KEY (`id`));
而後插入主從複製關係:
insert into dsns(dsn) values('h=36.30.39.176,u=syncuser,p=Syncuser@123,P=3306');
這樣就能夠採用dsn方式了,--recursion-method dsn=D=test,t=dsns。
4. 結果分析
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE09-04T22:29:52 0 0 1 0 1 0 0.029 test.dsnsTS:完成檢查的時間ERRORS:錯誤和告警的數量。DIFFS:是否一致,0表明一致,1表明不一致。ROWS:表的行數DIFF_ROWSCHUNKS:劃分的塊的數目SKIPPED:跳過的塊的數目TIME:執行時長TABLE:表名


pt-table-syncnode


    咱們上面介紹了pt-table-checksum能夠檢查主從數據的一致性,接下來咱們就來講一下如何進行主從數據的同步。參考官方文檔時就已經暈了,寫出來以後不免有紕漏之處,還請讀者朋友多多批評指正。
    該工具採用replace into的方式同步數據,建議同步的表上要有主鍵或者惟一索引,不然replace into就和普通的insert語句同樣了,會致使主庫出現數據重複的狀況。若是表上沒有主鍵,變動須要再從庫執行命令,而且指定--no-check-slave。
    該工具能夠以兩種方式運行,當使用--replicate參數時,會使用由pt-table-checksum命令檢測的結果進行同步,不然它會自動檢測不一致而且修復。
    當你使用了--replicate時,說明已經經過checksum工具檢測出差別並保存在數據表裏了,須要肯定是否使--sync-to-master選項,若是使用該選項,則表示在使用pt-table-sync時僅接受一個DSN主機,而且是slave的DSN。工具會自動找出它的主庫,找出差別進行同步。
若是你沒有指定--sync-to-master參數,則DSN表明的是主庫,工具會自動它的從庫進行數據同步。
    若是不使用--replicate,則分爲如下幾種狀況:
當只有一個DSN信息時,而且指定了--sync-to-master,那麼DSN信息必須是從庫,不然會報錯。
當有多個DSN主機時,第一個DSN是源端數據庫,這時候並不區分主庫或者從庫,它會按照順序向後面的DSN主機同步數據。
使用示例:
1. 在上面的例子中,咱們已經經過pt-table-checksum檢測出主從的不一致的表,接下來我
們開始進行同步。下面的命令中指定了--replicate,而且未指定--sync-to-master,則-h表明主庫。
pt-table-sync h=36.30.39.117,P=3306,u=syncuser,p=Syncuser@123 --database=test --replicate='test.checksums' --execute
2. 同時指定--replicate和--sync-to-master,DSN只能有一個,且爲從庫。
pt-table-sync h=36.30.39.176,P=3306,u=syncuser,p=Syncuser@123 --database=test --tables=t1 --replicate='test.checksums' --sync-to-master --execute
3. 若是隻指定一個DSN,那麼必須使用--replicate或者--sync-to-master中的一個,不然報錯: At least one  DSN is required, and at least two are required unless --sync-to-master or --replicate is specified。 這裏咱們指定了--sync-to-master,那麼DSN信息就表明了從庫。
pt-table-sync h=36.30.39.176,u=syncuser,p=Syncuser@123,D=test,t=t1 --sync-to-master --execute
4. 當有多個DSN時,若是指定了--sync-to-master,那麼全部的主機均爲從庫。不然報錯:
Can't determine master of D=test,h=…..,p=...,t=t1,u=syncuser at /usr/bin/pt-table-sync line 10020.         
pt-table-sync h=36.30.39.176,u=syncuser,p=Syncuser@123,D=test,t=t1 h=36.30.39.213,u=syncuser,p=Syncuser@123,D=test,t=t1 --sync-to-master --execute
5. 多個DSN,不指定--sync-to-master和--replicate,若是須要修復從庫的數據須要指定
--no-check-slave。
pt-table-sync h=36.30.39.117,u=syncuser,p=Syncuser@123,D=test,t=t1 h=36.30.39.176,u=syncuser,p=Syncuser@123 h=36.30.39.213,u=syncuser,p=Syncuser@123 --no-check-slave –execute
參數詳解:
--ask-pass: 鏈接MySQL時提示輸入密碼。
--[no]bin-log: 指定是否記錄二進制日誌,若是是--no-bin-log至關於執行了set sql_log_bin=0.
--[no]check-slave: 檢測目標服務器是不是從庫。若是目標服務器是從庫的話,直接對其變動是不安全的,可是有時候必需要這麼作,因此此時須要指定參數--no-check-slave。
--chunk-size: 指定表分塊的chunk大小。
--dry-run: 分析同步的過程,並打印出信息退出,並不實際執行。
--execute: 指定工具執行變動操做,使表數據達成一致。
--print: 打印出工具須要執行哪些語句來變動表。
--wait: 若是存在主從延遲,從庫能夠等待多長時間追上主庫,等待的時間由該參數設置,超時會終止退出。
DSN選項:
DSN syntax is key=value[,key=value...] Allowable DSN keys: KEY MEANING === ============================================= A 指定字符集 D 同步的數據庫 P 端口 S Socket文件 h 要鏈接的host p 數據庫密碼 t 要同步的表 u 數據庫用戶
注意事項及建議
1. 當出現主從不一致時,咱們須要判斷哪一個庫的數據是正確的,大多數狀況咱們但願在主庫執行變動而且同步到從庫。
2. 建議要同步的表要有主鍵,避免出現數據重複的問題。
3. 執行變動命令前先經過--print或者--dry-run進行檢查。
4. 使用多個DSN選項時,按照數據同步方向填寫主機信息,若是有從庫須要配合--no-check-slave參數使用。
5. 該工具在進行校驗分析時會對錶執行for update操做,避免在業務高峯期進行。

本文分享自微信公衆號 - MySQL數據庫技術棧(Mysqltechnology)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。mysql

相關文章
相關標籤/搜索