用於監控主從延遲的工具java
注意:須要指定的參數至少有 --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)主庫建立 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的平均值
pt-slave-restart是一個能夠跳過特定錯誤並自動重啓slave的工具。sql
pt-slave-restart
監控一個或者多個MySQL複製slave,試圖跳過引發錯誤的語句。它以指數變化的睡眠時間職能地檢查slave。你能夠指定要跳過的錯誤而後運行slave一直到一個肯定的binlog位置。shell
pt-slave-restart
一旦檢測到slave有錯誤就會打印一行。默認狀況下該打印行爲:時間戳、鏈接信息、relay_log_file,relay_log_pos,以及last_errno。你可使用--verbose
選項添加更多信息,也可使用--quiet
選項阻止全部輸出。數據庫
SLEEP
pt-slave-restart
檢查slave的過程當中智能地sleep。當前的sleep時間是變化的。服務器
--sleep
選項給出。--min-sleep
和--max-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
- ` --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秒數。
#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上的這張表數據不一致,因此這種修復方法只能算暫時的。 #以後還需進行修復
pt-table-checksum
工具用來檢查主從數據一致性。
pt-table-checksum
用於校驗主從數據的一致性,該命令在主庫上執行校驗,而後對複製的一致性進行檢查,來對比主從之間的校驗值,並輸出對比結果。
- `--[no]check-replication-filters`:是否檢查複製的過濾器,默認是yes,建議啓用不檢查模式。 - `--databases | -d`:指定須要被檢查的數據庫,多個庫之間能夠用逗號分隔。 - `--[no]check-binlog-format`:是否檢查binlog文件的格式,默認值yes。建議開啓不檢查。由於在默認的row格式下會出錯。 - `--replicate`:把checksum的信息寫入到指定表中。 - `--replicate-check-only`:只顯示不一樣步信息
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狀態。
pt-table-sync
用來修復主從數據不一致
pt-table-sync
高效的同步MySQL表之間的數據,他能夠作單向和雙向同步的表數據。他能夠同步單個表,也能夠同步整個庫。它不一樣步表結構、索引、或任何其餘模式對象。因此在修復一致性以前須要保證他們表存在。
`--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 :執行命令。
#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.