1. 程式人生 > >pt-table-checksum數據一致性使用參考

pt-table-checksum數據一致性使用參考

cli pass 找不到 innodb err create filter 用戶 mes

pt-table-checksum是檢查MySQL數據一致性的神器,配合pt-table-sync工具,簡直是堪稱完美,網上有很多關於這方面的文章,故這裏不做過多的介紹,
只列出具體操作步驟,以備使用時參考:

1.創建用於pt-table-checksum的用戶:
grant select,super,process,reload,show databases,replication client,replication slave on . to ‘ptchecksum‘@‘%‘ identified by ‘passtchecksum‘;
GRANT all on percona.* to ‘ptchecksum‘@‘%‘ identified by ‘passtchecksum‘;

2.創建pt-table-checksum使用的一些表信息:
CREATE DATABASE IF NOT EXISTS percona;
CREATE TABLE IF NOT EXISTS percona.checksums (
db CHAR(64) NOT NULL,
tbl CHAR(64) NOT NULL,
chunk INT NOT NULL,
chunk_time FLOAT NULL,
chunk_index VARCHAR(200) NULL,
lower_boundary TEXT NULL,
upper_boundary TEXT NULL,
this_crc CHAR(40) NOT NULL,

this_cnt INT NOT NULL,
master_crc CHAR(40) NULL,
master_cnt INT NULL,
ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (db,tbl,chunk),
INDEX ts_db_tbl(ts,db,tbl)
) ENGINE=InnoDB;

CREATE DATABASE IF NOT EXISTS 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)
);

3.如果環境為一主多從並且多個從庫時只想驗證指定從庫的一致時、主庫不能自動發現從庫、主從檢測連接用戶信息不一樣,都可以使用dsns指定備庫:
配置從庫的dsn信息:
insert into percona.dsns(dsn) values(‘h=192.168.56.102,P=3306,u=ptchecksum,p=passtchecksum‘);

其中第一個主機h=192.168.56.101為主庫的數據庫信息,第二個主機dsn=h=192.168.56.102為備庫的數據庫信息,多個數據庫使用逗號分開:
pt-table-checksum --replicate=percona.checksums --nocheck-replication-filters --no-check-binlog-format h=192.168.56.101,u=ptchecksum,p=‘passtchecksum‘,P=3306 --databases=app,app1 --recursion-method dsn=h=192.168.56.102,u=ptchecksum,p=‘passtchecksum‘,P=3306,D=percona,t=dsns

不指定dsn,默認檢查所有能發現的slave備庫:
pt-table-checksum --replicate=percona.checksums --nocheck-replication-filters --no-check-binlog-format h=192.168.56.101,u=ptchecksum,p=‘passtchecksum‘,P=3306 --databases=app,app1

輸出信息:
Checking if all tables can be checksummed ...
Starting checksum ...
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
12-24T10:15:30 0 1 3 1 0 0.033 app.name
12-24T10:15:30 0 1 1 1 0 0.044 app.t_name
12-24T10:15:33 0 0 426294 7 0 2.628 app1.t
12-24T10:15:34 0 0 199998 1 0 1.311 app1.t_adress
12-24T10:15:34 0 0 2965 1 0 0.364 app1.t_pd_sto_sku

說明:
TS:完成檢查的時間戳。
ERRORS:檢查時候發生錯誤和警告的數量。
DIFFS:不一致的chunk數量。當指定 --no-replicate-check 即檢查完但不立即輸出結果時,會一直為0;當指定 --replicate-check-only 即不檢查只從checksums表中計算crc32,且只顯示不一致的信息(畢竟輸出的大部分應該是一致的,容易造成幹擾)。
ROWS:比對的表行數;
CHUNKS:被劃分到表中的塊的數目,詳細的CHUNKS信息可以用表percona.checksums中查詢到;
SKIPPED:由於錯誤或警告或過大,則跳過塊的數目;
TIME:執行的時間;
TABLE:被檢查的表名;

如果不指定dsn時,默認會根據主庫的processlist中找到從庫復制進程,從而識別出有哪些從庫,然後進行pt-table-checksum,但是如果是多個slave庫是,其中一個slave數據不一致,
檢查不會給出具體的slave信息,因此此時可以使用dsn方式進行指定具體的slave庫進行檢查。另外如果數據庫使用的是非標準3306端口,會導致找不到從庫信息,
此時也建議使用dsn,dsn指定的是某個表,本例中使用percona.dsns,表行記錄是主庫的多個從庫的連接信息。

pt-table-checksum數據一致性使用參考