Percona-Toolkit系列(29) --- pt-table-checksum

pt-table-checksum

pt-table-checksum:官方地址

說明

用途:驗證MySQL主從複製的表數據是否一致。

語法:

pt-table-checksum [OPTIONS] [DSN]

通過在主從服務器上執行checksum查詢,來對比checksump。如果不一致,則EXIT STATUS的值爲非0。如果檢測到表的數據不一致,可以通過pt-table-sync工具來同步表數據。

相比於老本的pt-table-checksum(1.0版本的Toolkit),新版本的pt-table-checksum更加簡單,沒有複雜的校驗。更專注於單個數據庫,單個表(也就是一次檢查一張表)。它一次只能運行一個表,因此在開始校驗和之前,它不會累積大量內存或執行大量工作。這使它可以在非常大的服務器上使用。我們在擁有數十萬個數據庫和表以及數萬億行的服務器上使用它。無論服務器有多大,pt-table-checksum同樣運行良好。

pt-table-checksum會自動檢測是否有從庫,如果有則會自動連接上去。

支持Percona XtraDB Cluster (PXC) 5.5.28-23.7及更新版本。

限制:

  • 在主從環境中,pt-table-checksum要求必須使用基於STATEMENTbinlog複製,即binlog_format=STATEMENT
  • schema和表結構在主從上必須一致,如果不一致複製將會斷開。

EXIT STATUS

不同的值代表不同的意思,如下:

FLAG              BIT VALUE  MEANING
================  =========  ==========================================
ERROR                     1  A non-fatal error occurred
ALREADY_RUNNING           2  --pid file exists and the PID is running
CAUGHT_SIGNAL             4  Caught SIGHUP, SIGINT, SIGPIPE, or SIGTERM
NO_SLAVES_FOUND           8  No replicas or cluster nodes were found
TABLE_DIFF               16  At least one diff was found
SKIP_CHUNK               32  At least one chunk was skipped
SKIP_TABLE               64  At least one table was skipped

pt-table-checksum執行

具體例子

檢查單節點

檢查monitor數據庫下的所有表,當然意義不大。

[root@BigData ~]# pt-table-checksum h=192.168.20.5,u=root,p=Sanshi_408,P=3306 --databases=monitor
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
08-01T14:01:10      0      0        8          0       1       0   0.042 monitor.B_HOST
08-01T14:01:10      0      0       23          0       1       0   0.071 monitor.B_MONITOR_ITEM
08-01T14:01:11      0      0        7          0       1       0   0.111 monitor.B_SEND_MAIL
08-01T14:01:11      0      0        1          0       1       0   0.088 monitor.B_SEND_MAIL_FREQ
08-01T14:01:11      0      0        7          0       1       0   0.083 monitor.B_TRIGGER_RULE
08-01T14:01:11      0      0       14          0       1       0   0.100 monitor.B_WARN_CONFIG
08-01T14:01:11      0      0       46          0       1       0   0.095 monitor.B_WARN_INFO
08-01T14:01:11      0      0       14          0       1       0   0.066 monitor.B_WARN_ITEM
08-01T14:01:11      0      0        3          0       1       0   0.034 monitor.B_WARN_LEVEL
08-01T14:01:11      0      0        1          0       1       0   0.028 monitor.B_WARN_NOTICE
08-01T14:01:11      0      0        0          0       1       0   0.034 monitor.DATA_GROUP
08-01T14:01:11      0      0        0          0       1       0   0.029 monitor.DATA_GROUP_HOST
08-01T14:01:11      0      0        8          0       1       0   0.036 monitor.DB_GROUP
08-01T14:01:11      0      0       17          0       1       0   0.050 monitor.DB_VERSIONS
08-01T14:01:12      0      0        0          0       1       0   0.062 monitor.FLASH_INFO
08-01T14:01:12      0      0        0          0       1       0   0.042 monitor.FLASH_MONITOR
08-01T14:01:12      0      0        0          0       1       0   0.027 monitor.IBCONF
08-01T14:01:12      0      0        1          0       1       0   0.055 monitor.LICENSE
08-01T14:01:12      0      0        0          0       1       0   0.028 monitor.MARIADB_CONFIG
08-01T14:01:12      0      0        0          0       1       0   0.060 monitor.MARIADB_CONFIG_TYPE
08-01T14:01:12      0      0        0          0       1       0   0.028 monitor.MARIADB_MONITOR_CONNECT
08-01T14:01:12      0      0        0          0       1       0   0.034 monitor.MARIADB_MONITOR_DML
08-01T14:01:12      0      0        0          0       1       0   0.034 monitor.MARIADB_MONITOR_SINGLE
08-01T14:01:12      0      0        0          0       1       0   0.035 monitor.MARIADB_MS_SINGLE
08-01T14:01:12      0      0        0          0       1       0   0.036 monitor.MARIADB_TRAFFIC_STATISTICS
08-01T14:01:12      0      0        2          0       1       0   0.045 monitor.MARIADB_TYPE

檢查主從

通過DSN連接從庫,首先在主庫中創建相關的表和數據庫。

create database percona;
CREATE TABLE `percona`.`dsns` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parent_id` int(11) DEFAULT NULL,
`dsn` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);

插入可以連接從庫的用戶名、密碼、端口等信息

use percona;
insert into dsns(dsn) values('h=192.168.20.,P=3306,u=repl,p=123');

DSNs記錄 dsn 列格式如 h=REPLICA_HOST,u=repl_user,p=repl_pass

檢查命令如下:顯示所有檢查信息,可以通過指定--replicate-check-only來只顯示數據不一致的表信息。

[root@BigData ~]# pt-table-checksum h=192.168.20.5,u=root,p=Sanshi_408,P=3306 --databases=monitor --recursion-method dsn=h=192.168.20.6,D=percona,t=dsns --no-check-binlog-format
Checking if all tables can be checksummed ...
Starting checksum ...
Replica 18c-dg is stopped.  Waiting.   ---slave進程關閉,無法檢查。需要手動啓動。
Replica 18c-dg is stopped.  Waiting.
Replica 18c-dg is stopped.  Waiting.
Replica 18c-dg is stopped.  Waiting.
Replica 18c-dg is stopped.  Waiting.
Replica 18c-dg is stopped.  Waiting.
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
08-01T14:19:40      0      0        8          0       1       0 178.474 monitor.B_HOST
08-01T14:19:41      0      0       23          0       1       0   1.148 monitor.B_MONITOR_ITEM
08-01T14:19:41      0      0        7          0       1       0   0.185 monitor.B_SEND_MAIL
08-01T14:19:41      0      0        1          0       1       0   0.105 monitor.B_SEND_MAIL_FREQ
08-01T14:19:41      0      0        7          0       1       0   0.082 monitor.B_TRIGGER_RULE
08-01T14:19:41      0      0       14          0       1       0   0.053 monitor.B_WARN_CONFIG
08-01T14:19:41      0      0       46          0       1       0   0.081 monitor.B_WARN_INFO
08-01T14:19:41      0      0       14          0       1       0   0.060 monitor.B_WARN_ITEM
08-01T14:19:41      0      0        3          0       1       0   0.058 monitor.B_WARN_LEVEL
08-01T14:19:41      0      0        1          0       1       0   0.055 monitor.B_WARN_NOTICE
08-01T14:19:42      0      0        0          0       1       0   0.062 monitor.DATA_GROUP
08-01T14:19:42      0      0        0          0       1       0   0.083 monitor.DATA_GROUP_HOST
08-01T14:19:42      0      0        8          0       1       0   0.044 monitor.DB_GROUP
08-01T14:19:42      0      0       17          0       1       0   0.051 monitor.DB_VERSIONS
08-01T14:19:42      0      0        0          0       1       0   0.060 monitor.FLASH_INFO
08-01T14:19:42      0      0        0          0       1       0   0.056 monitor.FLASH_MONITOR
08-01T14:19:42      0      0        0          0       1       0   0.048 monitor.IBCONF
08-01T14:19:42      0      0        1          0       1       0   0.056 monitor.LICENSE
08-01T14:19:42      0      0        0          0       1       0   0.061 monitor.MARIADB_CONFIG
08-01T14:19:42      0      0        0          0       1       0   0.047 monitor.MARIADB_CONFIG_TYPE
08-01T14:19:42      0      0        0          0       1       0   0.069 monitor.MARIADB_MONITOR_CONNECT
08-01T14:19:42      0      0        0          0       1       0   0.061 monitor.MARIADB_MONITOR_DML
08-01T14:19:42      0      0        0          0       1       0   0.043 monitor.MARIADB_MONITOR_SINGLE
08-01T14:19:42      0      0        0          0       1       0   0.045 monitor.MARIADB_MS_SINGLE
08-01T14:19:42      0      0        0          0       1       0   0.042 monitor.MARIADB_TRAFFIC_STATISTICS
08-01T14:19:42      0      0        2          0       1       0   0.041 monitor.MARIADB_TYP
...

列名說明:

  • TS:時間戳
  • ERRORS:錯誤、警告數量
  • DIFFS:主從不同的chunk數量。如果指定了--no-replicate-check那麼該列永遠爲0.如果指定了--replicate-check-only,那麼只顯示數據不一致的表。
  • ROWS:表的行數
  • CHUNKS:表分拆分成chunk的數量
  • SKIPPED:由於以下問題導致跳過的CHUNK數量
    * MySQL not using the --chunk-index
    * MySQL not using the full chunk index (--[no]check-plan)
    * Chunk size is greater than --chunk-size * --chunk-size-limit
    * Lock wait timeout exceeded (--retries)
    * Checksum query killed (--retries)
    
  • TIME:檢查該表所用時間
  • TABLE:表名

默認情況下,會創建一個percona.checksums表用於存儲檢查信息。除了可以通過查看輸出信息來驗證表的數據同步情況下,也可以通過查詢percona.checksums中數據來查看,如下:

SELECT db, tbl, SUM(this_cnt) AS total_rows, COUNT(*) AS chunks
FROM percona.checksums
WHERE (
 master_cnt <> this_cnt
 OR master_crc <> this_crc
 OR ISNULL(master_crc) <> ISNULL(this_crc))
GROUP BY db, tbl;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章