percona-toolkit工具使用介紹

1. pt-heartbeat

用於監控主從延遲的工具java

1.1 pt-heartbeat 原理

  1. 主庫建立一張heartbeat表,表中有個時間戳字段。主庫上pt-heartbeat的update線程會在指定時間間隔更新時間戳。
  2. 從庫上的pt-heartbeat的monitor線程會檢查複製的心跳記錄,這個記錄就是主庫修改的時間戳。而後和當前系統時間進行對比,得出時間上的差別,差別值就是延遲的時間大小。因爲heartbeat表中有server_id字段,在監控某個從庫的延遲時指定參考主庫的server_id便可。

1.2 pt-heartbeat 主要參數介紹

注意:須要指定的參數至少有 --stop,--update,--monitor,--check。
其中--update,--monitor和--check是互斥的,--daemonize和--check也是互斥。

`--ask-pass`:隱式輸入MySQL密碼

`--charset`:字符集設置

`--check`:檢查從的延遲,檢查一次就退出,除非指定了--recurse會遞歸的檢查全部的從服務器。

`--check-read-only`:若是從服務器開啓了只讀模式,該工具會跳過任何插入。

`--create-table`:在主上建立心跳監控的表,若是該表不存在。能夠本身創建,建議存儲引擎改爲memory。經過更新該表知道主從延遲的差距。

CREATE TABLE heartbeat (
  ts                    varchar(26) NOT NULL,
  server_id             int unsigned NOT NULL PRIMARY KEY,
  file                  varchar(255) DEFAULT NULL,    -- SHOW MASTER STATUS
  position              bigint unsigned DEFAULT NULL, -- SHOW MASTER STATUS
  relay_master_log_file varchar(255) DEFAULT NULL,    -- SHOW SLAVE STATUS
  exec_master_log_pos   bigint unsigned DEFAULT NULL  -- SHOW SLAVE STATUS
);
heratbeat表一直在更改ts和position,而ts是咱們檢查複製延遲的關鍵。

`--daemonize`:執行時,放入到後臺執行

`--user | -u`:鏈接數據庫的賬號

`--database | -D`:鏈接數據庫的名稱

`--host|-h`:鏈接的數據庫地址

`--password | -p`:鏈接數據庫的密碼

`--port | -P`:鏈接數據庫的端口

`--socket | -S`:鏈接數據庫的套接字文件

`--file 【--file=output.txt】`:打印--monitor最新的記錄到指定的文件,很好的防止滿屏幕都是數據的煩惱。

`--frames 【--frames=1m,2m,3m】`:在--monitor裏輸出的[]裏的記錄段,默認是1m,5m,15m。能夠指定1個,如:--frames=1s,多個用逗號隔開。可用單位有秒(s)、分鐘(m)、小時(h)、天(d)。

`--interval`:檢查、更新的間隔時間。默認是見是1s。最小的單位是0.01s,最大精度爲小數點後兩位,所以0.015將調整至0.02。

`--log`:開啓daemonized模式的全部日誌將會被打印到制定的文件中。

`--monitor`:持續監控從的延遲狀況。經過--interval指定的間隔時間,打印出從的延遲信息,經過--file則能夠把這些信息打印到指定的文件。

`--master-server-id`:指定主的server_id,若沒有指定則該工具會連到主上查找其server_id。

`--print-master-server-id`:在--monitor和--check 模式下,指定該參數則打印出主的server_id。

`--recurse`:多級複製的檢查深度。模式M-S-S...不是最後的一個從都須要開啓log_slave_updates,這樣才能檢查到。

`--recursion-method`:指定複製檢查的方式,默認爲processlist,hosts。

`--update`:更新主上的心跳錶。

`--replace`:使用--replace代替--update模式更新心跳錶裏的時間字段,這樣的好處是不用管表裏是否有行。

`--stop`:中止運行該工具(--daemonize),在/tmp/目錄下建立一個「pt-heartbeat-sentinel」 文件。後面想從新開啓則須要把該臨時文件刪除,才能開啓(--daemonize)。

`--table`:指定心跳錶名,默認heartbeat。

1.3 pt-heartbeat 實戰

1)主庫建立 heartbeat心跳錶,經過update執行更新時間戳,心跳錶指定創建在sbtest庫下。python

pt-heartbeat -S /tmp/mysql3306.sock --database sbtest --update --create-table --daemonize

2)主庫利用sysbench模擬數據操做mysql

sysbench /usr/share/sysbench/oltp_read_write.lua \
--mysql-socket=/tmp/mysql3306.sock \
--mysql-user=root \
--mysql-password=mysql \
--mysql-db=sbtest \
--db-driver=mysql \
--tables=10 \
--table-size=500000 \
--report-interval=10 \
--threads=128 \
--time=120 \
prepare|run|cleanup

prepare:準備數據,
run:執行壓測,
cleanup:清除數據

3)從庫進行監控web

pt-heartbeat -S /tmp/mysql3306.sock --master-server-id=1003306 --monitor --database sbtest 
1.00s [  0.02s,  0.00s,  0.00s ]
1.00s [  0.03s,  0.01s,  0.00s ]
0.86s [  0.05s,  0.01s,  0.00s ]
0.86s [  0.06s,  0.01s,  0.00s ]
0.96s [  0.08s,  0.02s,  0.01s ]
1.00s [  0.09s,  0.02s,  0.01s ]
0.88s [  0.11s,  0.02s,  0.01s ]
0.00s [  0.11s,  0.02s,  0.01s ]
1.01s [  0.13s,  0.03s,  0.01s ]
0.00s [  0.13s,  0.03s,  0.01s ]
0.00s [  0.13s,  0.03s,  0.01s ]
...

結果表示有延時1s左右,中括號中的數據分別表示1m,5m,15m的平均值

2. pt-slave-restart

pt-slave-restart是一個能夠跳過特定錯誤並自動重啓slave的工具。sql

2.1 pt-slave-restart 原理

pt-slave-restart監控一個或者多個MySQL複製slave,試圖跳過引發錯誤的語句。它以指數變化的睡眠時間職能地檢查slave。你能夠指定要跳過的錯誤而後運行slave一直到一個肯定的binlog位置。shell

pt-slave-restart一旦檢測到slave有錯誤就會打印一行。默認狀況下該打印行爲:時間戳鏈接信息relay_log_filerelay_log_pos,以及last_errno。你可使用--verbose選項添加更多信息,也可使用--quiet選項阻止全部輸出。數據庫

SLEEP
pt-slave-restart檢查slave的過程當中智能地sleep。當前的sleep時間是變化的。服務器

  • 初始sleep時間經過--sleep選項給出。
  • 若是檢測發現錯誤,它對半以前的sleep時間。
  • 若是檢測到沒有錯誤,它倍增以前的sleep時間。
  • 經過--min-sleep--max-sleep參數限定sleep時間的下界和上界。
  • 一旦檢測到錯誤,pt-slave-restart假定接下來極可能發生另外一個錯誤,所以它採用當前的sleep時間或者初始sleep時間,取決於哪一個值更小。

注意:
從Percona Toolkit 2.2.8版本起,pt-slave-restart開始支持由MySQL 5.6.5版本引入的GTID複製。重點牢記:多線程

當採用多線程複製(slave_parallel_workers > 0)時,pt-slave-restart不能跳過事務。pt-slave-restart不能肯定GTID事件是哪一個特定slave線程執行失敗的事務。
默認行爲是跳過來自master的下一個事務。寫能夠來自不一樣的服務器,每一個服務器都有它本身的UUID。參考–master-uuid選項。socket

2.2 pt-slave-restart 主要參數介紹

- ` --always `       :永不中止slave線程,手工中止也不行

- ` --ask-pass`      :替換`-p`命令,不顯示密碼輸入

- ` --error-numbers` :指定跳過哪些錯誤,可用`,`進行分隔

- ` --error-text`    :根據錯誤信息進行匹配跳過

- ` --log`           :輸出到文件

- ` --recurse`       :在主端執行,監控從端

- ` --runtime `     :工具執行多長時間後退出:默認秒, m=minute,h=hours,d=days

- ` --slave-user --slave-password` :從庫的帳號密碼,從主端運行時使用

- ` --skip-count `  :一次跳過錯誤的個數,膽大的能夠設置大些,不指定默認1個

 - `--master-uuid`   :級聯複製的時候,指定跳過上級或者上上級事務的錯誤

- ` --until-master`  :到達指定的master_log_pos,file位置後中止,格式:」file:pos「

 - `--until-relay`   :和上面同樣,但根據relay_log的位置來中止

- `--sleep`:默認值爲1,檢查slave間隔的初始sleep秒數。

2.3 pt-slave-restart 實戰

#1. 在master上建立表
create table z1(id int not null,uname varchar(32),primary key(id));

#2. 在slave上插入數據
set sql_log_bin=0;
set global read_only=off;
insert into z1(id,uname) values(3,'python');

#3. 在master上插入數據
insert into z1(id,uname) values(2,'mysql');
insert into z1(id,uname) values(3,'java');

#4. 在slave上查看複製狀態 
show slave status\G

...
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
...
               Last_SQL_Errno: 1062
               Last_SQL_Error: Could not execute Write_rows event on table test.z1; Duplicate entry '3' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log my3306_binlog.000071, end_log_pos 1214

#5. 在slave上使用pt-slave-restart跳過指定錯誤
pt-slave-restart --error-numbers=1062
2018-09-19T15:24:02  mysqldb2-relay-bin.000019        1088 1062 

#6. 在slave上查看複製狀態 
···
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
···

#說明覆制已經正常,跳過了錯誤事務。

#可是master與slave上的這張表數據不一致,因此這種修復方法只能算暫時的。

#以後還需進行修復

3. pt-table-checksum

pt-table-checksum工具用來檢查主從數據一致性。

3.1 pt-table-checksum 原理

pt-table-checksum用於校驗主從數據的一致性,該命令在主庫上執行校驗,而後對複製的一致性進行檢查,來對比主從之間的校驗值,並輸出對比結果。

3.2 pt-table-checksum 主要參數介紹

- `--[no]check-replication-filters`:是否檢查複製的過濾器,默認是yes,建議啓用不檢查模式。

- `--databases | -d`:指定須要被檢查的數據庫,多個庫之間能夠用逗號分隔。

- `--[no]check-binlog-format`:是否檢查binlog文件的格式,默認值yes。建議開啓不檢查。由於在默認的row格式下會出錯。

- `--replicate`:把checksum的信息寫入到指定表中。

- `--replicate-check-only`:只顯示不一樣步信息

3.3 pt-table-checksum 實戰

pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=test --tables=z1 h=192.168.56.100,u=wanbin,p=mysql,P=3306

Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
09-19T15:58:29      0      1        2          0       1       0   0.086 test.z1

#解釋:
`TS` :完成檢查的時間。
`ERRORS` :檢查時候發生錯誤和警告的數量。
`DIFFS`:0表示一致,1表示不一致。當指定--no-replicate-check時,會一直爲0,當指定--replicate-check-only會顯示不一樣的信息。
`ROWS` :表的行數。
`CHUNKS` :被劃分到表中的塊的數目。
`SKIPPED` :因爲錯誤或警告或過大,則跳過塊的數目。
`TIME` :執行的時間。
`TABLE` :被檢查的表名。

pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=test --replicate-check-only  h=192.168.56.100,u=wanbin,p=mysql,P=3306

Checking if all tables can be checksummed ...
Starting checksum ...
Differences on mysqldb2
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
test.z1 1 -1 1   


【注意】:
1)根據測試,須要一個即能登陸主庫,也能登陸從庫的帳號;
2)只能指定一個host,必須爲主庫的IP;
3)在檢查時會向表加S鎖;
4)運行以前須要從庫的同步IO和SQL進程是YES狀態。

4. pt-table-sync

pt-table-sync用來修復主從數據不一致

4.1 pt-table-sync 原理

pt-table-sync高效的同步MySQL表之間的數據,他能夠作單向和雙向同步的表數據。他能夠同步單個表,也能夠同步整個庫。它不一樣步表結構、索引、或任何其餘模式對象。因此在修復一致性以前須要保證他們表存在。

4.2 pt-table-sync 主要參數介紹

`--replicate` :指定經過pt-table-checksum獲得的表,這2個工具差很少都會一直用。
`--databases` : 指定執行同步的數據庫。
`--tables` :指定執行同步的表,多個用逗號隔開。
`--sync-to-master` :指定一個DSN,即從的IP,他會經過show processlist或show slave status 去自動的找主。
`h=` :服務器地址,命令裏有2個ip,第一次出現的是Master的地址,第2次是Slave的地址。
`u=` :賬號。
`p=` :密碼。
`--print` :打印,但不執行命令。
`--execute :執行命令。

4.3 pt-table-sync 實戰

#print修復命令

pt-table-sync --replicate=test.checksums h=192.168.56.100,u=wanbin,p=mysql,P=3306 h=192.168.56.200,u=wanbin,p=mysql,P=3306 --print

REPLACE INTO `test`.`z1`(`id`, `uname`) VALUES ('3', 'java') /*percona-toolkit src_db:test src_tbl:z1 src_dsn:P=3306,h=192.168.56.100,p=...,u=wanbin dst_db:test dst_tbl:z1 dst_dsn:P=3306,h=mysqldb2,p=...,u=wanbin lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:4374 user:root host:mysqldb1*/;


#execute修復命令
pt-table-sync --replicate=test.checksums h=192.168.56.100,u=wanbin,p=mysql,P=3306 h=192.168.56.200,u=wanbin,p=mysql,P=3306 --execute


#再使用pt-table-checksum


pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=test --tables=z1 h=192.168.56.100,u=wanbin,p=mysql,P=3306
Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
09-19T16:11:50      0      0        2          0       1       0   0.134 test.z1


【注意】:要是表中沒有惟一索引或則主鍵則會報錯:
Can't make changes on the master because no unique index exists at /usr/local/bin/pt-table-sync line 10591.
相關文章
相關標籤/搜索