percona-toolkit對MySQL的複製和監控類操作教程_Mysql

來源:互聯網
上載者:User

複製類工具
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 NULL -- 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 behind2012-05-20T16:34:50 STOP SLAVE until 2012-05-20T16:35:50 at master position mysql-bin.000032/43920542012-05-20T16:35:05 slave stopped at master position mysql-bin.000032/43971242012-05-20T16:35:20 slave stopped at master position mysql-bin.000032/44021942012-05-20T16:35:35 slave stopped at master position mysql-bin.000032/44072642012-05-20T16:35:50 no new binlog events2012-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,  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,  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 TABLE05-23T16:19:29 0  1    2  1 0 0.006 test.aaa05-23T16:19:29 0  0    1  1 0 0.017 test.bbb05-23T16:19:29 0  0    0  1 0 0.007 test.category_part05-23T16:19:31 0  0  233617  6 0 1.887 test.collect_data05-23T16:19:34 0  0  250346  5 0 2.709 test.effective_user05-23T16:19:34 0  1    1  1 0 0.008 test.heartbeat05-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.localdomainTABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARYtest.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

監控類工具
1. pt-deadlock-logger
功能介紹:
提取和記錄mysql死結的相關資訊
用法介紹:
pt-deadlock-logger [OPTION...] SOURCE_DSN
收集和儲存mysql上最近的死結資訊,可以直接列印死結資訊和儲存死結資訊到資料庫中,死結資訊包括髮生死結的伺服器、最近發生死結的時間、死結線程id、死結的事務id、發生死結時事務執行了多長時間等等非常多的資訊。詳情見下面的樣本。
使用樣本:
範例1:列印本地mysql的死結資訊

pt-deadlock-logger --user=root --password=zhang@123 h=localhost –print

範例2:將本地的mysql死結資訊記錄到資料庫的表中,也列印出來

pt-deadlock-logger --user=root --password=zhang@123 h=localhost --print D=test,t=deadlocks

2. pt-fk-error-logger
功能介紹:
提取和記錄mysql外鍵錯誤資訊
用法介紹:
pt-fk-error-logger [OPTION...] SOURCE_DSN
通過SHOW INNODB STATUS提取和儲存mysql資料庫最近發生的外鍵錯誤資訊。可以通過參數控制直接列印錯誤資訊或者將錯誤資訊儲存到資料庫的表中。
使用樣本:
我在伺服器上啟動並執行時候一直報如下錯誤:

Use of uninitialized value in concatenation (.) or string at /usr/bin/pt-fk-error-logger line 2045

我懷疑是這個程式有問題,回頭換一個版本試一下或者調試一下那個程式。
 
3. pt-mext
功能介紹:
並行查看SHOW GLOBAL STATUS的多個樣本的資訊。
用法介紹:
pt-mext [OPTIONS] -- COMMAND
原理:pt-mext執行你指定的COMMAND,並每次讀取一行結果,把空行分割的內容儲存到一個一個的臨時檔案中,最後結合這些臨時檔案並行查看結果。
使用樣本:
範例1:每隔10s執行一次SHOW GLOBAL STATUS,並將結果合并到一起查看

pt-mext -- mysqladmin ext -uroot -pzhang@123 -i10 -c3

 
4. pt-query-digest
功能介紹:
分析查詢執行日誌,併產生一個查詢報告,為MySQL、PostgreSQL、 memcached過濾、重放或者轉換語句。
用法介紹:
pt-query-digest [OPTION...] [FILE]
解析和分析mysql記錄檔
使用樣本:
範例1:分析本地的慢查詢檔案

pt-query-digest --user=root --password=zhang@123 /data/dbdata/localhost-slow.log

範例2:重新回顧滿查詢日誌,並將結果儲存到query_review中,注意query_review表的表結構必須先建好,表結構如下:

CREATE TABLE query_review (  checksum   BIGINT UNSIGNED NOT NULL PRIMARY KEY,  fingerprint TEXT NOT NULL,  sample    TEXT NOT NULL,  first_seen  DATETIME,  last_seen  DATETIME,  reviewed_by VARCHAR(20),  reviewed_on DATETIME,  comments   TEXT);

命令如下:

pt-query-digest --user=root --password=zhang@123 --review h=localhost,D=test,t=query_review /data/dbdata/localhost-slow.log

5. pt-trend
功能介紹:
居於一組時間序列的資料點做統計。
用法介紹:
pt-trend [OPTION...] [FILE ...]
讀取一個慢查詢日誌,並輸出統計資訊。也可以指定多個檔案。如果不指定檔案的話直接從標準輸入中讀取資訊。
使用樣本:
範例1:讀取本地慢查詢日誌並輸出統計資訊

pt-trend /data/dbdata/localhost-slow.log

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.