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
要求必須使用基於STATEMENT
binlog複製,即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;