使用 pt-table-checksum 檢查MySQL數據一致性

Step 1. pt-table-chum 原理mysql

pt-table-checksum用於在線檢測MySQL主從一致性,其原理是在主庫執行checksum查詢,而後與從庫進行結果的比對,從而得出是否一致性的報告.sql

pt-table-checksum checksum每張表,而後得出每一個從庫的一致性報告。pt-table-checksum 工具只關注數據的不一致,修復數據一致性須要用到 pt-table-sync 工具.數據庫

pt-table-checksum 鏈接指定的主庫,而後查找數據庫和表(若是指定了過濾條件,則按過濾條件查找)。它同一時間只checksum 一張表,因此不會消耗過多的內存和資源。對於大數據庫的數據庫來講,這是一個很是有用的設計,不管數據庫有多大,好比一個server中有幾百個數據庫和表,數萬億(trillions)的行,咱們都無需擔憂,pt-table-checksum均可以勝任。bash

能夠勝任的緣由是, pt-table-checksum 將每張表都拆分紅行塊(chunks of rows),默認是1000行。而後對每一個行塊使用單獨的REPLACE…SELECT 進行checksum 查詢。行塊(chunks of rows)大小隨着設定的–chunk-time 時間(默認0.5秒)動態調節。每次 checksum 查詢執行完畢後,下次checksum 查詢會根據上次執行的時間調整 行塊(chunks of rows)大小,也就是經過學習系統的負載狀況來調節行塊大小。  若是不設定 –chunk-time ,行塊大小則不會自動調整。這樣就不會造成一個大的checkum 查詢操做,確保了主從複製不會產生大的延遲或者負載服務器

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

pt-table-checksum 默認狀況下能夠應對絕大部分場景,官方說,即便上千個庫、上萬億的行,它依然能夠很好的工做,這源自於設計很簡單,一次檢查一個表,不須要太多的內存和多餘的操做;必要時,pt-table-checksum 會根據服務器負載動態改變 chunk 大小,減小從庫的延遲。學習

爲了減小對數據庫的干預,pt-table-checksum還會自動偵測並鏈接到從庫,固然若是失敗,能夠指定--recursion-method選項來告訴從庫在哪裏。它的易用性還體如今,複製如有延遲,在從庫 checksum 會暫停直到遇上主庫的計算時間點(也經過選項--設定一個可容忍的延遲最大值,超過這個值也認爲不一致。大數據

 

Step 2.安裝 pt-table-checksum設計

$ wget  https://www.percona.com/redir/downloads/percona-release/redhat/latest/percona-release-0.1-6.noarch.rpm

$ rpm -ivh percona-release-0.1-6.noarch.rpm

$ yum install percona-toolkit -y

至此pt-table-checksum 命令已安裝完成!code

 

Step 3.建立一個專門用於checksum的用戶,它須要有鏈接到從庫的權限

mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'checksum'@'%' IDENTIFIED BY 'checksum'; 
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'checksum'@'%' IDENTIFIED BY 'checksum';
Query OK, 0 rows affected (0.01 sec)

 

Step 4. 只檢查cnail一個庫數據是否一致,使用–databases參數

  • TS :完成檢查的時間戳。

  • ERRORS :檢查時候發生錯誤和警告的數量。

  • DIFFS :不一致的chunk數量。當指定 --no-replicate-check 即檢查完但不當即輸出結果時,會一直爲0;當指定 --replicate-check-only 即不檢查只從checksums表中計算crc32,且只顯示不一致的信息(畢竟輸出的大部分應該是一致的,容易形成干擾)。

  • ROWS :比對的錶行數。

  • CHUNKS :被劃分到表中的塊的數目。

  • SKIPPED :因爲錯誤或警告或過大,則跳過塊的數目。

  • TIME :執行的時間。

  • TABLE :被檢查的表名

$ pt-table-checksum  --user=checksum --password=checksum --host=192.168.1.120  --databases=anna --replicate=cnail.checksums --create-replicate-table  --no-check-binlog-format
Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
01-29T12:10:17      0      0        0          0       1       0   0.026 anna.tb1


Step 5.檢查全部庫是否一致

$ pt-table-checksum  --user=checksum --password=checksum --host=192.168.1.100   --replicate=cnail.checksums --create-replicate-table  --no-check-binlog-format

Checking if all tables can be checksummed ...
Starting checksum ...
Diffs cannot be detected because no slaves were found.  Please read the --recursion-method documentation for information.
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
01-29T15:50:55      0      0        0          0       1       0   0.011 anna.tb1
01-29T15:50:55      0      0        0          0       1       0   0.011 dong.tb1
01-29T15:50:55      0      0        0          0       1       0   0.010 mysql.columns_priv
01-29T15:50:55      0      0        2          0       1       0   0.011 mysql.db
01-29T15:50:55      0      0        0          0       1       0   0.012 mysql.event
01-29T15:50:55      0      0        0          0       1       0   0.012 mysql.func
01-29T15:50:55      0      0       40          0       1       0   0.013 mysql.help_category
01-29T15:50:55      0      0      614          0       1       0   0.011 mysql.help_keyword
01-29T15:50:55      0      0     1225          0       1       0   0.009 mysql.help_relation
01-29T15:50:55      0      0      585          0       1       0   0.011 mysql.help_topic
01-29T15:50:55      0      0        0          0       1       0   0.013 mysql.ndb_binlog_index
01-29T15:50:55      0      0        0          0       1       0   0.012 mysql.plugin
01-29T15:50:55      0      0        0          0       1       0   0.012 mysql.proc
01-29T15:50:55      0      0        0          0       1       0   0.011 mysql.procs_priv
01-29T15:50:55      0      0        2          0       1       0   0.010 mysql.proxies_priv
01-29T15:50:55      0      0        0          0       1       0   0.011 mysql.servers
01-29T15:50:55      0      0        0          0       1       0   0.012 mysql.tables_priv
01-29T15:50:55      0      0        0          0       1       0   0.013 mysql.time_zone
01-29T15:50:55      0      0        0          0       1       0   0.014 mysql.time_zone_leap_second
01-29T15:50:55      0      0        0          0       1       0   0.013 mysql.time_zone_name
01-29T15:50:55      0      0        0          0       1       0   0.014 mysql.time_zone_transition
01-29T15:50:55      0      0        0          0       1       0   0.012 mysql.time_zone_transition_type
01-29T15:50:55      0      0        9          0       1       0   0.015 mysql.user
01-29T15:50:55      0      0        4          0       1       0   0.010 percona.checksums
01-29T15:50:55      0      0        2          0       1       0   0.015 percona.tb1
01-29T15:50:55      0      0        0          0       1       0   0.012 percona.tb2
01-29T15:50:55      0      0        0          0       1       0   0.014 percona.tb3

 

Step 6. –replicate-check-only 參數,只輸出不一致的表的信息

$ pt-table-checksum  --user=checksum --password=checksum --host=192.168.1.120  --replicate=cnail.checksums --create-replicate-table  --no-check-binlog-format --max-load='Threads_connected=120'  --replicate-check-only
相關文章
相關標籤/搜索