歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Percona Toolkit使用教程之復制類工具

Percona Toolkit使用教程之復制類工具

日期:2017/2/28 14:35:34   编辑:Linux教程

percona-toolkit使用教程之復制類工具

1. pt-heartbeat

功能介紹:

監控mysql復制延遲

用法介紹:

pt-heartbeat [OPTION...] [DSN] --update|--monitor|--check|--stop

測量復制落後主mysql或者主PostgreSQL多少時間,你可以使用這個腳本去更新主或者監控復制,具體用法見後面的示例.

原理:pt-heartbeat通過真實的復制數據來確認mysql和postgresql復制延遲,這個避免了對復制機制的依賴,從而能得出准確的落後復制時間,包含兩部分:第一部分在主上pt-heartbeat的--update線程會在指定的時間間隔更新一個時間戳,第二部分是pt-heartbeat的--monitor線程或者--check線程連接到從上檢查復制的心跳記錄(前面更新的時間戳),並和當前系統時間進行比較,得出時間的差異。

你可以手工創建heartbeat表或者添加--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 NUL-- SHOW SLAVE STATUS

);

使用示例:

范例1:創建一個後台進程定期更新主上的test庫的heartbeat表()默認是1s,可以--interval指定,執行後會成一個heartbeat表,test庫為我監控的同步庫:

pt-heartbeat -D test --update --user=root --password=zhang@123 -h192.168.3.135 --create-table –daemonize

范例2:監控復制在slave上的落後程度(會一直監控):

pt-heartbeat -D test --monitor --user=root --password=zhang@123 -h192.168.3.92

監控結果如下:

0.00s [ 0.00s, 0.00s, 0.00s ]

0.00s [ 0.00s, 0.00s, 0.00s ]

0.00s [ 0.00s, 0.00s, 0.00s ]

0.00s [ 0.00s, 0.00s, 0.00s ]

0.00s [ 0.00s, 0.00s, 0.00s ]

0.00s [ 0.00s, 0.00s, 0.00s ]

范例3:監控復制在slave上的落後程度(監控一次退出):

pt-heartbeat -D test --check --user=root --password=zhang@123 -h192.168.3.92

范例4:監控PostgreSQL需要添加--dbi-driver Pg:

pt-heartbeat -D test --check --user=root --password=zhang@123 -h192.168.3.92 --dbi-driver Pg

2. pt-slave-delay

功能介紹:

設置從服務器落後於主服務器指定時間。

用法介紹:

pt-slave-delay [OPTION...] SLAVE-HOST [MASTER-HOST]

原理:通過啟動和停止復制sql線程來設置從落後於主指定時間。默認是基於從上relay日志的二進制日志的位置來判斷,因此不需要連接到主服務器,如果IO進程不落後主服務器太多的話,這個檢查方式工作很好,如果網絡通暢的話,一般IO線程落後主通常都是毫秒級別。一般是通過--delay and --delay"+"--interval來控制。--interval是指定檢查是否啟動或者停止從上sql線程的頻繁度,默認的是1分鐘檢查一次。

使用示例:

范例1:使從落後主1分鐘,並每隔1分鐘檢測一次,運行10分鐘

pt-slave-delay --user=root --password=zhang@123 --delay 1m --run-time 10m --host=192.168.3.92

如果不加--run-time參數會一直執行。

范例2:使從落後主1分鐘,並每隔15秒鐘檢測一次,運行10分鐘

pt-slave-delay --user=root --password=zhang@123 --delay 1m --interval 15s --run-time 10m --host=192.168.3.92

運行結果如下:

2012-05-20T16:34:50 slave running 0 seconds behind

2012-05-20T16:34:50 STOP SLAVE until 2012-05-20T16:35:50 at master position mysql-bin.000032/4392054

2012-05-20T16:35:05 slave stopped at master position mysql-bin.000032/4397124

2012-05-20T16:35:20 slave stopped at master position mysql-bin.000032/4402194

2012-05-20T16:35:35 slave stopped at master position mysql-bin.000032/4407264

2012-05-20T16:35:50 no new binlog events

2012-05-20T16:36:05 START SLAVE until master 2012-05-20T16:35:05 mysql-bin.000032/4397124

3. pt-slave-find

功能介紹:

查找和打印mysql所有從服務器復制層級關系

用法介紹:

pt-slave-find [OPTION...] MASTER-HOST

原理:連接mysql主服務器並查找其所有的從,然後打印出所有從服務器的層級關系。

使用示例:

范例1:查找主服務器為192.168.3.135的mysql有所有從的層級關系:

pt-slave-find --user=root --password=zhang@123 --host=192.168.3.135

4. pt-slave-restart

功能介紹:

監視mysql復制錯誤,並嘗試重啟mysql復制當復制停止的時候

用法介紹:

pt-slave-restart [OPTION...] [DSN]

監視一個或者多個mysql復制錯誤,當從停止的時候嘗試重新啟動復制。你可以指定跳過的錯誤並運行從到指定的日志位置。

使用示例:

范例1:監視192.168.3.92的從,跳過1個錯誤

pt-slave-restart --user=root --password=zhang@123 --host=192.168.3.92 --skip-count=1

范例2:監視192.168.3.92的從,跳過錯誤代碼為1062的錯誤。

pt-slave-restart --user=root --password=zhang@123 --host=192.168.3.92 --error-numbers=1062

5. pt-table-checksum

功能介紹:

檢查mysql復制一致性

用法介紹:

pt-table-checksum [OPTION...] [DSN]

工作原理:pt-table-checksum在主上執行檢查語句在線檢查mysql復制的一致性,生成replace語句,然後通過復制傳遞到從,再通過update更新master_src的值。通過檢測從上this_src和master_src的值從而判斷復制是否一致。

注意:使用的時候選擇業務地峰的時候運行,因為運行的時候會造成表的部分記錄鎖定。使用--max-load來指定最大的負載情況,如果達到那個負載這個暫停運行。如果發現有不一致的數據,可以使用pt-table-sync工具來修復。

注意:和1.0版本不同,新版本的pt-table-checksum只需要在master上執行即可。

通過 –explain參數再結合二進制日志就可以看出腳本的工作原理,如我的test庫有一個名字為zhang的表,我們通過抓取二進制日志來查看腳本的原理:

REPLACE INTO `test`.`checksums` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary, this_cnt, this_crc) SELECT 'test', 'zhang', '1', NULL, NULL, NULL, COUNT(*) AS cnt, COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS('#', `id`, `name`, CONCAT(ISNULL(`name`)))) AS UNSIGNED)), 10, 16)), 0) AS crc FROM `test`.`zhang` /*checksum table*/;

UPDATE `test`.`checksums` SET chunk_time = '0.000563', master_crc = '31012777', master_cnt = '4' WHERE db = 'test' AND tbl = 'zhang' AND chunk = '1'

從這裡可以很明顯的看出原理了,前面已經說了,這裡就不贅述了。

使用示例:

范例1:比較test數據庫同步是否一致,結果顯示所有的表。

pt-table-checksum --nocheck-replication-filters --databases=test --replicate=test.checksums --create-replicate-table --host=192.168.3.135 --port 3306 -uroot -pzhang@123

參數說明:第一次運行的時候需要添加--create-replicate-table參數,如果不加這個就需要手工運行添加表結構的SQL,表結構SQL如下:

CREATE TABLE checksums (

db char(64) NOT NULL,

tb 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,

PRIMARY KEY (db, tbl, chunk),

INDEX ts_db_tbl (ts, db, tbl)

) ENGINE=InnoDB;

之所以使用--nocheck-replication-filters參數是因為我的my.cnf配置了replicate-ignore-db和replicate-wild-do-table等參數。另外需要特別注意執行的checksums所在的數據庫必須是同步的數據庫。我剛開始使用的時候摸索的很久,官網也沒有范例。呵呵!

結果如下:

TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE

05-23T16:19:29 0 1 2 1 0 0.006 test.aaa

05-23T16:19:29 0 0 1 1 0 0.017 test.bbb

05-23T16:19:29 0 0 0 1 0 0.007 test.category_part

05-23T16:19:31 0 0 233617 6 0 1.887 test.collect_data

05-23T16:19:34 0 0 250346 5 0 2.709 test.effective_user

05-23T16:19:34 0 1 1 1 0 0.008 test.heartbeat

05-23T16:19:39 0 0 1000000 11 0 5.353 test.oss_pvinfo2

從結果中,我們可以看到test.aaa和test.heartbeat表的DIFFS不為0,那麼就是這兩個表不同步了。

范例2:比較test數據庫同步是否一致,結果只顯示數據不一致的表(添加--replicate-check-only參數即可,這個值查看checksums數據不會重新對表進行比較,因此需要先運行上面的比較語句之後再運行這個語句,否則顯示不了最新的變化。)。

pt-table-checksum --nocheck-replication-filters --databases=test --replicate=test.checksums --replicate-check-only --lock-wait-timeout=120 --host=192.168.3.135 --port 3306 --user=root --password=zhang@123

結果如下:

Differences on localhost.localdomain

TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY

test.aaa 1 1 1

test.heartbeat 1 0 1

從結果可以看出,只顯示了兩個不同步的表。

6. pt-table-sync

功能介紹:

高效同步mysql表的數據

用法介紹:

pt-table-sync [OPTION...] DSN [DSN...]

原理:���是在主上執行數據的更改,再同步到從上,不會直接更改成從的數據,在主上執行更改是基於主上現在的數據,不會更改主上的數據。注意使用之前先備份你的數據,避免造成數據的丟失.執行execute之前最好先換成--print或--dry-run查看一下會變更哪些數據。

使用示例:

范例1:同步3.135的test庫的aaa表到192.168.3.92,在執行之前可以用--execute參數換成--print來查看會變更什麼東西,後面那個主機必須是master,否則會報錯推出。

pt-table-sync --execute --user=root --password=zhang@123 h=192.168.3.135,D=test,t=aaa h=192.168.3.92

范例2:將主的test數據庫同步到192.168.3.92,使從上具有一樣的數據。

pt-table-sync --execute --sync-to-master --user=root --password=zhang@123 h=192.168.3.92 --database test

范例3:只同步指定的表

pt-table-sync --execute --sync-to-master --user=root --password=zhang@123 h=192.168.3.92,D=test,t=aaa

范例4:根據pt-table-checksum的結果進行數據同步

pt-table-sync --execute --replicate test.checksums --user=root --password=zhang@123 h=192.168.3.135

范例5:根據pt-table-checksum使從的數據和主的數據一致

pt-table-sync --execute --replicate test.checksums --user=root --password=zhang@123 --sync-to-master h=192.168.3.92,D=test,t=aaa

Percona Toolkit 的詳細介紹:請點這裡
Percona Toolkit 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved