原理:主庫定期更新 heartbeat 表時間戳 → 從庫復制該記錄 → 監控端對比從庫時間戳與系統時間,得出真實延遲(不依賴 Seconds_Behind_Master)。
CREATE TABLE heartbeat ( ts VARCHAR(26) NOT NULL, server_id INT UNSIGNED NOT NULL PRIMARY KEY, file VARCHAR(255) DEFAULT NULL, position BIGINT UNSIGNED DEFAULT NULL, relay_master_log_file VARCHAR(255) DEFAULT NULL, exec_master_log_pos BIGINT UNSIGNED DEFAULT NULL );
# 主庫:後台每 1 秒更新(--daemonize) pt-heartbeat -D test --update --user=root --password=zhang@123 -h192.168.3.135 --create-table --daemonize # 從庫:持續監控輸出延遲 pt-heartbeat -D test --monitor --user=root --password=zhang@123 -h192.168.3.92 # 輸出:0.00s [ 0.00s, 0.00s, 0.00s ] ... # 從庫:單次檢查退出 pt-heartbeat -D test --check --user=root --password=zhang@123 -h192.168.3.92 # 支持 PostgreSQL (--dbi-driver Pg)
通過啟停 SQL 線程,讓從庫落後主庫指定時間(--delay),檢查間隔 --interval(默認 1 分鐘)。
# 落後 1 分鐘,每 15 秒檢查,運行 10 分鐘 pt-slave-delay --user=root --password=zhang@123 --delay 1m --interval 15s --run-time 10m --host=192.168.3.92
pt-slave-find --user=root --password=zhang@123 --host=192.168.3.135
# 監控並跳過 1 個錯誤 pt-slave-restart --user=root --password=zhang@123 --host=192.168.3.92 --skip-count=1 # 只跳過錯誤碼 1062 (Duplicate Entry) pt-slave-restart --user=root --password=zhang@123 --host=192.168.3.92 --error-numbers=1062
原理:主庫對表分塊計算 checksum(REPLACE INTO checksums 表) → 復制到從庫 → 從庫計算同塊 checksum → 對比 this_crc vs master_crc。
# 首次運行需創建 checksums 表 (--create-replicate-table) pt-table-checksum --nocheck-replication-filters --databases=test --replicate=test.checksums --create-replicate-table --host=192.168.3.135 -uroot -pzhang@123 # 僅顯示不一致的表 (需先跑過全量校驗) pt-table-checksum --nocheck-replication-filters --databases=test --replicate=test.checksums --replicate-check-only --lock-wait-timeout=120 --host=192.168.3.135 -uroot -pzhang@123
關鍵表結構:checksums (db, tbl, chunk, this_crc, this_cnt, master_crc, master_cnt, ... PK(db,tbl,chunk))
原則:總在主庫執行修改,經復制流向從庫,不直接改從庫。執行前必備份,先用 --print/--dry-run 預覽。
# 同步單表 135->92 pt-table-sync --execute --user=root --password=zhang@123 h=192.168.3.135,D=test,t=aaa h=192.168.3.92 # 同步整庫 (從庫視角 --sync-to-master) pt-table-sync --execute --sync-to-master --user=root --password=zhang@123 h=192.168.3.92 --database test # 根據 checksum 結果同步 pt-table-sync --execute --replicate test.checksums --user=root --password=zhang@123 h=192.168.3.135 pt-table-sync --execute --replicate test.checksums --sync-to-master --user=root --password=zhang@123 h=192.168.3.92,D=test,t=aaa
# 打印死鎖詳情 pt-deadlock-logger --user=root --password=zhang@123 h=localhost --print # 存入表並打印 (表結構需預建) pt-deadlock-logger --user=root --password=zhang@123 h=localhost --print D=test,t=deadlocks
通過 SHOW ENGINE INNODB STATUS 提取最近外鍵錯誤。作者測試遇到 Perl 未初始化值報錯,建議升級版本或排查腳本。
# 每 10 秒采集 3 次並合並顯示 pt-mext -- mysqladmin ext -uroot -pzhang@123 -i10 -c3
# 分析慢查詢文件 pt-query-digest --user=root --password=zhang@123 /data/dbdata/localhost-slow.log # 審查模式:結果存入 query_review 表 (需預建表結構) pt-query-digest --user=root --password=zhang@123 --review h=localhost,D=test,t=query_review /data/dbdata/localhost-slow.log
pt-trend /data/dbdata/localhost-slow.log