1. 程式人生 > 實用技巧 >資料一致性校驗及資料同步,運維必看

資料一致性校驗及資料同步,運維必看

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

pt-table-checksum


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 TABLE
09-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.groupby2
09-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:430080100.036test.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_ROWS:CHUNKS:劃分的塊的數目SKIPPED:跳過的塊的數目TIME:執行時長TABLE:表名


pt-table-sync


我們上面介紹了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中的一個,否則報錯:AtleastoneDSN 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'tdeterminemasterofD=test,h=…..,p=...,t=t1,u=syncuserat/usr/bin/pt-table-syncline10020.
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)。
如有侵權,請聯絡 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

來源:站長資訊中心