mysql主從同步(3)-percona-toolkit工具(數據一致性監測、延遲監控)使用梳理

轉自:http://www.cnblogs.com/kevingrace/p/6261091.htmlhtml

 

在mysql工做中接觸最多的就是mysql replicationmysql

mysql在複製方面仍是會有一些常規問題:ios

好比主庫宕機或者從庫宕機有可能會致使複製中斷,一般須要進行人爲修復,sql

或者不少時候須要把一個從庫提高爲主庫,但對從庫和主庫的數據一致性不能保證同樣。數據庫

這種狀況下就須要使用percona-toolkit工具的pt-table-checksum組件來檢查主從數據的一致性;若是發現不一致的數據,能夠經過pt-table-sync修復;安全

還能夠經過pt-heartbeat監控主從複製延遲。固然若是數據量小,slave只是當作一個備份使用,那麼出現數據不一致徹底能夠重作,或者經過其餘方法解決。若是數據量很是大,重作就是很是蛋碎的一件事情了。好比說,線上數據庫作了主從同步環境,數據庫在進行了遷移後,須要對mysql遷移(Replication)後的數據一致性進行校驗,但又不能對生產環境使用形成影響,pt-table-checksum成爲了絕佳也是惟一的檢查工具。bash

 

percona-toolkit介紹
percona-toolkit是一組高級命令行工具的集合,用來執行各類經過手工執行很是複雜和麻煩的mysql和系統任務,這些任務包括:
   1)檢查master和slave數據的一致性
   2)有效地對記錄進行歸檔
   3)查找重複的索引
   4)對服務器信息進行彙總
   5)分析來自日誌和tcpdump的查詢
   6)當系統出問題的時候收集重要的系統信息
percona-toolkit源自Maatkit和Aspersa工具,這兩個工具是管理mysql的最有名的工具。不過,如今Maatkit工具已經不維護了,因此之後推薦仍是使用percona-toolkit工具!
這些工具主要包括開發、性能、配置、監控、複製、系統、實用六大類,做爲一個優秀的DBA,裏面有的工具很是有用,若是能掌握並加以靈活應用,將能極大的提升工做效率。服務器

percona-toolkit工具中最主要的三個組件分別是:
   1)pt-table-checksum 負責監測mysql主從數據一致性
   2)pt-table-sync 負責當主從數據不一致時修復數據,讓它們保存數據的一致性
   3)pt-heartbeat 負責監控mysql主從同步延遲
下面就對這三個組件的使用作一記錄,固然percona-toolkit工具也有不少其餘組件,後面會一一說明。網絡

percona-toolkit工具安裝(建議主庫和從庫服務器上都安裝)
軟件下載並在主庫服務器上安裝 [百度雲盤下載地址:https://pan.baidu.com/s/1bp1OOgf   (提取密碼:y462)]
[root@master-server src]# wget https://www.percona.com/downloads/percona-toolkit/2.2.7/RPM/percona-toolkit-2.2.7-1.noarch.rpm
[root@master-server src]# rpm -ivh percona-toolkit-2.2.7-1.noarch.rpm     //安裝後,percona-toolkit工具的各個組件命令就有有了(輸入ht-,按TAB鍵就會顯示)併發

安裝該工具依賴的軟件包
[root@master-server src]# yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl perl-DBI -y

1、pt-table-checksum使用梳理
pt-table-checksum 是 Percona-Toolkit的組件之一,用於檢測MySQL主、從庫的數據是否一致。其原理是在主庫執行基於statement的sql語句來生成主庫數據塊的checksum,把相同的sql語句傳遞到從庫執行,並在從庫上計算相同數據塊的checksum,最後,比較主從庫上相同數據塊的checksum值,由此判斷主從數據是否一致。檢測過程根據惟一索引將表按row切分爲塊(chunk),覺得單位計算,能夠避免鎖表。檢測時會自動判斷複製延遲、 master的負載, 超過閥值後會自動將檢測暫停,減少對線上服務的影響。
pt-table-checksum 默認狀況下能夠應對絕大部分場景,官方說,即便上千個庫、上萬億的行,它依然能夠很好的工做,這源自於設計很簡單,一次檢查一個表,不須要太多的內存和多餘的操做;必要時,pt-table-checksum 會根據服務器負載動態改變 chunk 大小,減小從庫的延遲。

爲了減小對數據庫的干預,pt-table-checksum還會自動偵測並鏈接到從庫,固然若是失敗,能夠指定--recursion-method選項來告訴從庫在哪裏。它的易用性還體如今,複製如有延遲,在從庫 checksum 會暫停直到遇上主庫的計算時間點(也經過選項--設定一個可容忍的延遲最大值,超過這個值也認爲不一致)。

爲了保證主數據庫服務的安全,該工具實現了許多保護措施:
    1)自動設置 innodb_lock_wait_timeout 爲1s,避免引發
    2)默認當數據庫有25個以上的併發查詢時,pt-table-checksum會暫停。能夠設置 --max-load 選項來設置這個閥值
    3)當用 Ctrl+C 中止任務後,工具會正常的完成當前 chunk 檢測,下次使用 --resume 選項啓動能夠恢復繼續下一個 chunk

pt-table-checksum [OPTIONS] [DSN]
pt-table-checksum:在主(master)上經過執行校驗的查詢對複製的一致性進行檢查,對比主從的校驗值,從而產生結果。DSN指向的是主的地址,該工具的退出狀態不爲零,若是發現有任何差異,或者若是出現任何警告或錯誤。注意:第一次運行的時候須要加上--create-replicate-table參數,生成checksums表!!若是不加這個參數,那麼就須要在對應庫下手工添加這張表了,表結構SQL以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 :不檢查複製過濾器,建議啓用。後面能夠用--databases來指定須要檢查的數據庫。
--no-check-binlog-format : 不檢查複製的binlog模式,要是binlog模式是ROW,則會報錯。
--replicate-check-only :只顯示不一樣步的信息。
--replicate= :把checksum的信息寫入到指定表中,建議直接寫到被檢查的數據庫當中。
--databases= :指定須要被檢查的數據庫,多個則用逗號隔開。
--tables= :指定須要被檢查的表,多個用逗號隔開
h= :Master的地址
u= :用戶名
p=:密碼
P= :端口

最重要的一點就是:
要在主庫上受權,能讓主庫ip訪問。這一點不能忘記!(實驗證實從庫上能夠不受權,但最好仍是從庫也受權)
注意:
1)根據測試,須要一個即能登陸主庫,也能登陸從庫的帳號;
2)只能指定一個host,必須爲主庫的IP;
3)在檢查時會向表加S鎖;
4)運行以前須要從庫的同步IO和SQL進程是YES狀態。

例如:(本文例子中:192.168.1.101是主庫ip,192.168.1.102是從庫ip)
在主庫執行受權(必定要對主庫ip受權,受權的用戶名和密碼能夠自行定義,不過要保證這個權限能同時登錄主庫和從庫)
mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE,CREATE,DELETE,INSERT,UPDATE ON *.* TO 'root'@'192.168.1.101' identified by '123456';
mysql> flush privileges;

在從庫上執行受權
mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'root'@'192.168.1.101' IDENTIFIED BY '123456';
mysql> flush privileges;

以下,在主庫上執行的一個檢查主從數據一致性的命令(別忘了第一次運行的時候須要添加--create-replicate-table參數,後續再運行時就不須要加了):
下面命令中的192.168.1.101是主庫ip
檢查的是huanqiu庫下的haha表的數據(固然,命令中也能夠不跟表,直接檢查某整個庫的數據;以下去掉--tables=haha表,直接檢查huanqiu庫的數據)
[root@master-server ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=huanqiu.checksums --create-replicate-table --databases=huanqiu --tables=haha h=192.168.1.101,u=root,p=123456,P=3306

1
2
3
Diffs cannot be detected because  no  slaves were found.  Please  read  the  --recursion-method documentation for information.
             TS ERRORS  DIFFS      ROWS   CHUNKS SKIPPED     TIME  TABLE
01-08T04:04:54      0      0        4       1       0   0.009 huanqiu.haha

上面有報錯:
Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information
上面的提示信息很清楚,由於找不到從,因此執行失敗,提示用參數--recursion-method 能夠指定模式解決。
實際上是由於從庫的slave關閉了。
在主庫上執行:

1
2
3
4
5
6
mysql> show processlist;
+ ----+------+-----------+------+---------+------+-------+------------------+
| Id |  User  | Host      | db   | Command |  Time  | State | Info             |
+ ----+------+-----------+------+---------+------+-------+------------------+
| 10 | root | localhost |  NULL  | Query   |    0 | init  | show processlist |
+ ----+------+-----------+------+---------+------+-------+------------------+

發現沒有slave在運行。

在從庫上開啓slave
mysql> start slave;
mysql> show slave status\G;

再在主庫上執行:

1
2
3
4
5
6
7
mysql> show processlist;
+ ----+-------+---------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+
| Id |  User   | Host                | db   | Command     |  Time  | State                                                                 | Info             |
+ ----+-------+---------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+
| 10 | root  | localhost           |  NULL  | Query       |    0 | init                                                                  | show processlist |
| 18 | slave | 192.168.1.102:37115 |  NULL  | Binlog Dump |    5 | Master has sent  all  binlog  to  slave; waiting  for  binlog  to  be updated |  NULL              |
+ ----+-------+---------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+

發現已有slave在運行。

再次執行檢查命令:
[root@master-server ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=huanqiu.checksums --databases=huanqiu --tables=haha h=192.168.1.101,u=root,p=123456,P=3306

1
2
             TS ERRORS  DIFFS      ROWS   CHUNKS SKIPPED     TIME  TABLE
01-08T04:11:03      0      0        4       1       0   1.422 huanqiu.haha

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

2、pt-table-sync用法梳理
若是經過pt-table-checksum 檢查找到了不一致的數據表,那麼如何同步數據呢?即如何修復MySQL主從不一致的數據,讓他們保持一致性呢?
這時候能夠利用另一個工具pt-table-sync。
使用方法:
pt-table-sync: 高效的同步MySQL表之間的數據,他能夠作單向和雙向同步的表數據。他能夠同步單個表,也能夠同步整個庫。它不一樣步表結構、索引、或任何其餘模式對象。因此在修復一致性以前須要保證他們表存在。

假如上面檢查數據時發現主從不一致
[root@master-server ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=huanqiu.checksums --databases=huanqiu --tables=haha h=192.168.1.101,u=root,p=123456,P=3306

1
2
             TS ERRORS  DIFFS      ROWS   CHUNKS SKIPPED     TIME  TABLE
01-08T04:18:07      0      1        4       1       0   0.843 huanqiu.haha

如今須要DIFFS爲1可知主從數據不一致,須要修復!修復命令以下:
先master的ip,用戶,密碼,而後是slave的ip,用戶,密碼
[root@master-server ~]# pt-table-sync --replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --print

1
2
3
4
REPLACE  INTO  `huanqiu`.`haha`(`id`, ` name `)  VALUES  ( '1' 'wangshibo' /*percona-toolkit src_db:huanqiu src_tbl:haha src_dsn:h=192.168.1.101,p=...,u=root dst_db:huanqiu dst_tbl:haha dst_dsn:h=192.168.1.102,p=...,u=root lock:1 transaction:1 changing_src:huanqiu.checksums replicate:huanqiu.checksums bidirectional:0 pid:23676 user:root host:master-server*/ ;
REPLACE  INTO  `huanqiu`.`haha`(`id`, ` name `)  VALUES  ( '2' 'wangshikui' /*percona-toolkit src_db:huanqiu src_tbl:haha src_dsn:h=192.168.1.101,p=...,u=root dst_db:huanqiu dst_tbl:haha dst_dsn:h=192.168.1.102,p=...,u=root lock:1 transaction:1 changing_src:huanqiu.checksums replicate:huanqiu.checksums bidirectional:0 pid:23676 user:root host:master-server*/ ;
REPLACE  INTO  `huanqiu`.`haha`(`id`, ` name `)  VALUES  ( '3' 'limeng' /*percona-toolkit src_db:huanqiu src_tbl:haha src_dsn:h=192.168.1.101,p=...,u=root dst_db:huanqiu dst_tbl:haha dst_dsn:h=192.168.1.102,p=...,u=root lock:1 transaction:1 changing_src:huanqiu.checksums replicate:huanqiu.checksums bidirectional:0 pid:23676 user:root host:master-server*/ ;
REPLACE  INTO  `huanqiu`.`haha`(`id`, ` name `)  VALUES  ( '4' 'wanghi' /*percona-toolkit src_db:huanqiu src_tbl:haha src_dsn:h=192.168.1.101,p=...,u=root dst_db:huanqiu dst_tbl:haha dst_dsn:h=192.168.1.102,p=...,u=root lock:1 transaction:1 changing_src:huanqiu.checksums replicate:huanqiu.checksums bidirectional:0 pid:23676 user:root host:master-server*/ ;

參數解釋:
--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)打印出來了修復數據的sql語句,能夠手動的在slave從庫上執行,讓他們數據保持一致性,這樣比較麻煩!
能夠直接在master主庫上執行修復操做,經過--execute參數,以下:
[root@master-server ~]# pt-table-sync --replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --execute

如上修復後,再次檢查,發現主從庫數據已經一致了!
[root@master-server ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=huanqiu.checksums --databases=huanqiu --tables=haha h=192.168.1.101,u=root,p=123456,P=3306

1
2
             TS ERRORS  DIFFS      ROWS   CHUNKS SKIPPED     TIME  TABLE
01-08T04:36:43      0      0        4       1       0   0.040 huanqiu.haha

-----------------------------------------------------------------------------------------------------------------------
建議:
修復數據的時候,最好仍是用--print打印出來的好,這樣就能夠知道那些數據有問題,能夠人爲的干預下。
否則直接執行了,出現問題以後更很差處理。總之仍是在處理以前作好數據的備份工做。

注意:要是表中沒有惟一索引或則主鍵則會報錯:
Can't make changes on the master because no unique index exists at /usr/local/bin/pt-table-sync line 10591.
-----------------------------------------------------------------------------------------------------------------------
爲了確保主從數據的一致性,能夠編寫監控腳本,定時檢查。當檢查到主從數據不一致時,強制修復數據。
[root@master-server ~]# cat /root/pt_huanqiu.sh

1
2
3
4
5
6
7
8
#!/bin/bash
NUM=$( /usr/bin/pt-table-checksum  --nocheck-replication-filters --no-check-binlog- format  --replicate=huanqiu.checksums --databases=huanqiu  h=192.168.1.101,u=root,p=123456,P=3306| awk  -F " "  '{print $3}' | sed  -n  '2p' )
if  [ $NUM - eq  1 ]; then
   /usr/bin/pt-table-sync  --replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --print
   /usr/bin/pt-table-sync  --replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --execute
else
   echo  "data is ok"
fi

[root@master-server ~]# cat /root/pt_huanpc.sh 

1
2
3
4
5
6
7
8
#!/bin/bash
NUM=$( /usr/bin/pt-table-checksum  --nocheck-replication-filters --no-check-binlog- format  --replicate=huanpc.checksums --databases=huanpc  h=192.168.1.101,u=root,p=123456,P=3306| awk  -F " "  '{print $3}' | sed  -n  '2p' )
if  [ $NUM - eq  1 ]; then
   /usr/bin/pt-table-sync  --replicate=huanpc.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --print
   /usr/bin/pt-table-sync  --replicate=huanpc.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --execute
else
   echo  "data is ok"
fi

[root@master-server ~]# crontab -l
#檢查主從huanqiu庫數據一致性
* * * * * /bin/bash -x /root/pt_huanqiu.sh > /dev/null 2>&1
* * * * * sleep 10;/bin/bash -x /root/pt_huanqiu.sh > /dev/null 2>&1
* * * * * sleep 20;/bin/bash -x /root/pt_huanqiu.sh > /dev/null 2>&1
* * * * * sleep 30;/bin/bash -x /root/pt_huanqiu.sh > /dev/null 2>&1
* * * * * sleep 40;/bin/bash -x /root/pt_huanqiu.sh > /dev/null 2>&1
* * * * * sleep 50;/bin/bash -x /root/pt_huanqiu.sh > /dev/null 2>&1

#檢查主從huanpc庫數據一致性
* * * * * /bin/bash -x /root/root/pt_huanpc.sh > /dev/null 2>&1
* * * * * sleep 10;/bin/bash -x /root/pt_huanpc.sh > /dev/null 2>&1
* * * * * sleep 20;/bin/bash -x /root/pt_huanpc.sh > /dev/null 2>&1
* * * * * sleep 30;/bin/bash -x /root/pt_huanpc.sh > /dev/null 2>&1
* * * * * sleep 40;/bin/bash -x /root/pt_huanpc.sh > /dev/null 2>&1
* * * * * sleep 50;/bin/bash -x /root/pt_huanpc.sh > /dev/null 2>&1

-----------------------------------------------------------------------------------------------------------------------
最後總結:
pt-table-checksum和pt-table-sync工具很給力,工做中經常在使用。注意使用該工具須要受權,通常SELECT, PROCESS, SUPER, REPLICATION SLAVE等權限就已經足夠了。

-----------------------------------------------------------------------------------------------------------------------
另外說一個問題:
在上面的操做中,在主庫裏添加pt-table-checksum檢查的權限(從庫能夠不受權)後,進行數據一致性檢查操做,會在操做的庫(實例中是huanqiu、huanpc)下產生一個checksums表!
這張checksums表是pt-table-checksum檢查過程當中產生的。這張表一旦產生了,默認是刪除不了的,而且這張表所在的庫也默認刪除不了,刪除後過一下子就又會出來。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
mysql> use huanqiu;
Reading  table  information  for  completion  of  table  and  column  names
You can turn  off  this feature  to  get a quicker startup  with  -A
 
Database  changed
mysql> show tables;
+ -------------------+
| Tables_in_huanqiu |
+ -------------------+
| checksums         |
| haha              |
+ -------------------+
rows  in  set  (0.00 sec)
 
mysql>  drop  table  checksums;
Query OK, 0  rows  affected (0.01 sec)
 
mysql> show tables;
+ -------------------+
| Tables_in_huanqiu |
+ -------------------+
| haha              |
+ -------------------+
1 row  in  set  (0.00 sec)
 
mysql> show tables;         //過一段時間再次查看,發現checksums表還在
+ -------------------+
| Tables_in_huanqiu |
+ -------------------+
| checksums         |
| haha              |
+ -------------------+
rows  in  set  (0.00 sec)
 
不只這張表刪除不了,這張表所在的庫也刪除不了,刪除後過一下子就是自動生成。
mysql>  drop  database  huanqiu;
Query OK, 1 row affected (0.01 sec)
 
mysql>  drop  database  huanpc;
Query OK, 1 row affected (0.02 sec)
 
mysql> show databases;
+ --------------------+
Database            |
+ --------------------+
| information_schema |
| huanqiu            |
| mysql              |
| performance_schema |
| test               |
+ --------------------+
rows  in  set  (0.00 sec)
 
mysql>  drop  database  huanqiu;
Query OK, 1 row affected (0.01 sec)
 
mysql> show databases;
+ --------------------+
Database            |
+ --------------------+
| information_schema |
| huanpc             |
| huanqiu            |
| mysql              |
| performance_schema |
| test               |
+ --------------------+
rows  in  set  (0.00 sec)

要想刪除的話,必定要先把pt-table-checksum檢查前添加的權限收回!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
mysql> show grants  for  'root' @ '192.168.1.101' ;    
+ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants  for  root@192.168.1.101                                                                                                                                                       |
+ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
GRANT  SELECT INSERT UPDATE DELETE CREATE , PROCESS, SUPER, REPLICATION SLAVE  ON  *.*  TO  'root' @ '192.168.1.101'  IDENTIFIED  BY  PASSWORD  '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'  |
+ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row  in  set  (0.00 sec)
 
mysql>  revoke  SELECT INSERT UPDATE DELETE CREATE , PROCESS, SUPER, REPLICATION SLAVE  ON  *.*  FROM  'root' @ '192.168.1.101' ;
Query OK, 0  rows  affected (0.01 sec)
 
mysql> show grants  for  'root' @ '192.168.1.101' ;
+ -----------------------------------------------------------------------------------------------------------------+
| Grants  for  root@192.168.1.101                                                                                   |
+ -----------------------------------------------------------------------------------------------------------------+
GRANT  USAGE  ON  *.*  TO  'root' @ '192.168.1.101'  IDENTIFIED  BY  PASSWORD  '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'  |
+ -----------------------------------------------------------------------------------------------------------------+
1 row  in  set  (0.00 sec)
 
mysql>  select  user ,host, password  from  mysql. user ;
+ -------+---------------+-------------------------------------------+
user   | host          |  password                                   |
+ -------+---------------+-------------------------------------------+
| root  | localhost     | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root  | master-server |                                           |
| root  | 127.0.0.1     |                                           |
| root  | ::1           |                                           |
|       | localhost     |                                           |
|       | master-server |                                           |
| root  | 192.168.1.101 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| slave | 192.168.1.102 | *4F0FF134CC4C1A2872D972373A6AA86CA0A81872 |
+ -------+---------------+-------------------------------------------+
rows  in  set  (0.00 sec)
 
mysql>  delete  from  mysql. user  where  user = "root"  and  host= "192.168.1.101" ;   //這一步其實沒必要操做,此步刪除操做不能在上面 revoke 執行前進行,不然 revoke 回收權限失敗!
Query OK, 1 row affected (0.00 sec)
 
mysql>  select  user ,host, password  from  mysql. user ;
+ -------+---------------+-------------------------------------------+
user   | host          |  password                                   |
+ -------+---------------+-------------------------------------------+
| root  | localhost     | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root  | master-server |                                           |
| root  | 127.0.0.1     |                                           |
| root  | ::1           |                                           |
|       | localhost     |                                           |
|       | master-server |                                           |
| slave | 192.168.1.102 | *4F0FF134CC4C1A2872D972373A6AA86CA0A81872 |
+ -------+---------------+-------------------------------------------+
rows  in  set  (0.00 sec)

權限刪除後,就能成功刪除checksums這張表和它所在的庫了!
主庫的checksums刪除了,從庫的這張表也會跟着刪除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
mysql> use huanpc;
Database  changed
mysql> show tables;
+ ------------------+
| Tables_in_huanpc |
+ ------------------+
| checksums        |
| heihei           |
+ ------------------+
rows  in  set  (0.00 sec)
 
mysql>  drop  table  checksums;
Query OK, 0  rows  affected (0.01 sec)
 
mysql> show tables;
+ ------------------+
| Tables_in_huanpc |
+ ------------------+
| heihei           |
+ ------------------+
1 row  in  set  (0.01 sec)
 
mysql> use huanqiu;
Reading  table  information  for  completion  of  table  and  column  names
You can turn  off  this feature  to  get a quicker startup  with  -A
 
Database  changed
mysql> show tables;
+ -------------------+
| Tables_in_huanqiu |
+ -------------------+
| checksums         |
| haha              |
+ -------------------+
rows  in  set  (0.00 sec)
 
mysql>  drop  table  checksums;
Query OK, 0  rows  affected (0.00 sec)
 
mysql> show tables;
+ -------------------+
| Tables_in_huanqiu |
+ -------------------+
| haha              |
+ -------------------+
1 row  in  set  (0.00 sec)

也就是說,checksums表一旦產生,不只這張表默認刪除不了,連同它所在的庫,要是想刪除它們,只能如上操做先撤銷權限。

3、pt-heartbeat監控mysql主從複製延遲梳理

對於MySQL數據庫主從複製延遲的監控,能夠藉助percona的有力武器pt-heartbeat來實現。
pt-heartbeat的工做原理經過使用時間戳方式在主庫上更新特定表,而後在從庫上讀取被更新的時間戳而後與本地系統時間對比來得出其延遲。具體流程:
   1)在主上建立一張heartbeat表,按照必定的時間頻率更新該表的字段(把時間更新進去)。監控操做運行後,heartbeat表能促使主從同步!
   2)鏈接到從庫上檢查複製的時間記錄,和從庫的當前系統時間進行比較,得出時間的差別。

使用方法(主從和從庫上均可以執行監控操做):
pt-heartbeat [OPTIONS] [DSN] --update|--monitor|--check|--stop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
注意:須要指定的參數至少有 --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,
   position              bigint unsigned DEFAULT NULL,
   relay_master_log_file varchar(255) DEFAULT NULL,
   exec_master_log_pos   bigint unsigned DEFAULT NULL
);
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。

實例說明:
master:192.168.1.101
slave:192.168.1.102
同步的庫:huanqiu、huanpc
主從庫都能使用root帳號、密碼123456登陸

先操做針對huanqiu庫的檢查,其餘同步的庫的檢查操做相似!

1
2
3
4
5
6
7
8
9
10
11
12
mysql> use huanqiu;                   
Database changed
 
mysql> CREATE TABLE heartbeat (             // 主庫上的對應庫下建立heartbeat表,通常建立後從庫會同步這張表(不一樣步的話,就在從庫那邊手動也手動建立)
     ->   ts                    varchar(26) NOT NULL,
     ->   server_id             int unsigned NOT NULL PRIMARY KEY,
     ->    file                   varchar(255) DEFAULT NULL,
     ->   position              bigint unsigned DEFAULT NULL,
     ->   relay_master_log_file varchar(255) DEFAULT NULL,
     ->   exec_master_log_pos   bigint unsigned DEFAULT NULL
     -> );
Query OK, 0 rows affected (0.02 sec)

更新主庫上的heartbeat,--interval=1表示1秒鐘更新一次(注意這個啓動操做要在主庫服務器上執行)
[root@master-server ~]# pt-heartbeat --user=root --ask-pass --host=192.168.1.101 --create-table -D huanqiu --interval=1 --update --replace --daemonize
Enter password: 
[root@master-server ~]# 
[root@master-server ~]# ps -ef|grep pt-heartbeat
root 15152 1 0 19:49 ? 00:00:00 perl /usr/bin/pt-heartbeat --user=root --ask-pass --host=192.168.1.101 --create-table -D huanqiu --interval=1 --update --replace --daemonize
root 15154 14170 0 19:49 pts/3 00:00:00 grep pt-heartbeat

在主庫運行監測同步延遲:
[root@master-server ~]# pt-heartbeat -D huanqiu --table=heartbeat --monitor --host=192.168.1.102 --user=root --password=123456
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 ]
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表示從沒有延遲。 [ 0.00s, 0.00s, 0.00s ] 表示1m,5m,15m的平均值。能夠經過--frames去設置。

或者加上--master-server-id參數(主庫my.cnf裏配置的server-id值)
[root@master-server ~]# pt-heartbeat -D huanqiu --table=heartbeat --monitor --host=192.168.1.102 --user=root --password=123456 --master-server-id=101
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 ]
.........
也能夠將主庫的server-id打印出來(--print-master-server-id)
[root@master-server ~]# pt-heartbeat -D huanqiu --table=heartbeat --monit --host=192.168.1.102 --user=root --password=123456 --print-master-server-id
0.00s [ 0.00s, 0.00s, 0.00s ] 101
0.00s [ 0.00s, 0.00s, 0.00s ] 101
0.00s [ 0.00s, 0.00s, 0.00s ] 101
0.00s [ 0.00s, 0.00s, 0.00s ] 101
.........
[root@master-server ~]# pt-heartbeat -D huanqiu --table=heartbeat --check --host=192.168.1.102 --user=root --password=123456 --print-master-server-id
0.00 101

上面的監測命令會一直在運行狀態中,可使用--check監測一次就退出
注意:使用了--check,就不能使用--monit
--update,--monitor和--check是互斥的,--daemonize和--check也是互斥。

[root@master-server ~]# pt-heartbeat -D huanqiu --table=heartbeat --check --host=192.168.1.102 --user=root --password=123456
0.00
[root@master-server ~]#

注意:
若是想把這個輸出結果加入自動化監控,那麼可使用以下命令使監控輸出寫到文件,而後使用腳本按期過濾文件中的最大值做爲預警便可:
注意--log選項必須在有--daemonize參數的時候纔會打印到文件中,且這個文件的路徑最好在/tmp下,不然可能由於權限問題沒法建立
[root@master-server ~]# pt-heartbeat -D huanqiu --table=heartbeat --monitor --host=192.168.1.102 --user=root --password=123456 --log=/opt/master-slave.txt --daemonize
[root@master-server ~]# tail -f /opt/master-slave.txt            //能夠測試,在主庫上更新數據時,從庫上是否及時同步,如不一樣步,能夠在這裏看到監控的延遲數據
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 ]
.......

下面是編寫的主從同步延遲監控腳本,就是按期過濾--log文件中最大值(此腳本運行的前提是:啓動更新主庫heartbeat命令以及帶上--log的同步延遲檢測命令)。若是發生延遲,發送報警郵件。sendemail郵件發送環境部署參考:http://www.cnblogs.com/kevingrace/p/5961861.html
[root@master-server ~]# cat /root/check-slave-monit.sh     

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
cat  /opt/master-slave .txt >  /opt/master_slave .txt
echo  /opt/master-slave .txt
max_time=` cat  /opt/master_slave .txt | grep  - v  '^$'  | awk  '{print $1}'  | sort  -k1nr | head  -1`
NUM=$( echo  "$max_time" | cut  -d "s"  -f1)
if  [ $NUM ==  "0.00"  ]; then
    echo  "Mysql主從數據一致"
else
    /usr/local/bin/sendEmail  -f ops@huanqiu.cn -t wangshibo@huanqiu.cn -s smtp.huanqiu.cn -u  "Mysql主從同步延遲"  -o message-content- type =html -o message-charset=utf8 -xu ops@huanqiu.cn -xp WEE78@12l$ -m  "Mysql主從數據同步有延遲"
fi

[root@master-server ~]# chmod /root/check-slave-monit.sh
[root@master-server ~]# sh /root/check-slave-monit.sh 
Mysql主從數據一致

結合crontab,每隔一分鐘檢查一次

1
2
3
[root@master-server ~] # crontab -e
#mysql主從同步延遲檢查
* * * * *  /bin/bash  -x  /root/check-slave-monit .sh >  /dev/null  2>&1

在從庫上運行監測同步延遲(也能夠在命令後加上--master-server-id=101或--print-master-server-id,同上操做)
[root@slave-server src]# pt-heartbeat -D huanqiu --table=heartbeat --monitor --user=root --password=123456
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]
........
[root@slave-server src]# pt-heartbeat -D huanqiu --table=heartbeat --user=root --password=123456 --check
0.00
[root@slave-server src]# pt-heartbeat -D huanqiu --table=heartbeat --monitor --user=root --password=123456 --log=/opt/master-slave.txt --daemonize
[root@slave-server src]# tail -f /opt/master-slave.txt 
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 ]
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]

如何關閉上面在主庫上執行的heartbeat更新進程呢?
方法一:能夠用參數--stop去關閉
[root@master-server ~]# ps -ef|grep heartbeat
root 15152 1 0 19:49 ? 00:00:02 perl /usr/bin/pt-heartbeat --user=root --ask-pass --host=192.168.1.101 --create-table -D huanqiu --interval=1 --update --replace --daemonize
root 15310 1 0 19:59 ? 00:00:01 perl /usr/bin/pt-heartbeat -D huanqiu --table=heartbeat --monitor --host=192.168.1.102 --user=root --password=123456 --log=/opt/master-slave.txt --daemonize
root 15555 31932 0 20:13 pts/2 00:00:00 grep heartbeat
[root@master-server ~]# pt-heartbeat --stop
Successfully created file /tmp/pt-heartbeat-sentinel
[root@master-server ~]# ps -ef|grep heartbeat
root 15558 31932 0 20:14 pts/2 00:00:00 grep heartbeat
[root@master-server ~]#

這樣就把在主上開啓的進程殺掉了。
可是後續要繼續開啓後臺進行的話,記住必定要先把/tmp/pt-heartbeat-sentinel 文件刪除,不然啓動不了

方法二:直接kill掉進程pid(推薦這種方法)
[root@master-server ~]# ps -ef|grep heartbeat
root 15152 1 0 19:49 ? 00:00:02 perl /usr/bin/pt-heartbeat --user=root --ask-pass --host=192.168.1.101 --create-table -D huanqiu --interval=1 --update --replace --daemonize
root 15310 1 0 19:59 ? 00:00:01 perl /usr/bin/pt-heartbeat -D huanqiu --table=heartbeat --monitor --host=192.168.1.102 --user=root --password=123456 --log=/opt/master-slave.txt --daemonize
root 15555 31932 0 20:13 pts/2 00:00:00 grep heartbeat
[root@master-server ~]# kill -9 15152
[root@master-server ~]# ps -ef|grep heartbeat
root 15558 31932 0 20:14 pts/2 00:00:00 grep heartbeat

最後總結:
經過pt-heartbeart工具能夠很好的彌補默認主從延遲的問題,但須要搞清楚該工具的原理。
默認的Seconds_Behind_Master值是經過將服務器當前的時間戳與二進制日誌中的事件時間戳相對比獲得的,因此只有在執行事件時才能報告延時。備庫複製線程沒有運行,也會報延遲null。
還有一種狀況:大事務,一個事務更新數據長達一個小時,最後提交。這條更新將比它實際發生時間要晚一個小時才記錄到二進制日誌中。當備庫執行這條語句時,會臨時地報告備庫延遲爲一個小時,執行完後又很快變成0。

---------------------------------------percona-toolkit其餘組件命令用法---------------------------------- 

下面這些工具最好不要直接在線上使用,應該做爲上線輔助或故障後離線分析的工具,也能夠作性能測試的時候配合着使用。

1)pt-online-schema-change
功能介紹:
功能爲:在alter操做更改表結構的時候不用鎖定表,也就是說執行alter的時候不會阻塞寫和讀取操做,注意執行這個工具的時候必須作好備份,操做以前最好要充分了解它的原理。
工做原理是:建立一個和你要執行alter操做的表同樣的空表結構,執行表結構修改,而後從原表中copy原始數據到表結構修改後的表,當數據copy完成之後就會將原表移走,用新表代替原表,默認動做是將原表drop掉。在copy數據的過程當中,任何在原表的更新操做都會更新到新表,由於這個工具在會在原表上建立觸發器,觸發器會將在原表上更新的內容更新到新表。若是表中已經定義了觸發器這個工具就不能工做了。

用法介紹:
pt-online-schema-change [OPTIONS] DSN
options能夠自行查看help(或加--help查看有哪些選項),DNS爲你要操做的數據庫和表。
有兩個參數須要注意一下:
--dry-run 這個參數不創建觸發器,不拷貝數據,也不會替換原表。只是建立和更改新表。
--execute 這個參數的做用和前面工做原理的介紹的同樣,會創建觸發器,來保證最新變動的數據會影響至新表。注意:若是不加這個參數,這個工具會在執行一些檢查後退出。這一舉措是爲了讓使用這充分了解了這個工具的原理。

使用示例:
在線更改表的的引擎,這個尤爲在整理innodb表的時候很是有用,以下huanqiu庫的haha表默認是Myisam存儲引擎,現須要在線修改爲Innodb類型。

1
2
3
4
5
6
7
8
9
10
11
mysql> show create table huanqiu.haha;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                             |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| haha  | CREATE TABLE `haha` (
   ` id ` int(10) NOT NULL AUTO_INCREMENT,
   `name` varchar(50) NOT NULL,
   PRIMARY KEY (` id `)
) ENGINE=MyISAM AUTO_INCREMENT=91 DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row  in  set  (0.00 sec)

修改操做以下:

1
2
3
4
5
6
7
8
9
10
11
[root@master-server ~] # pt-online-schema-change --user=root --password=123456 --host=localhost --alter="ENGINE=InnoDB" D=huanqiu,t=haha --execute --check-replication-filters
Found 1 slaves:
   slave-server
Will check slave lag on:
   slave-server
Replication filters are  set  on these hosts:
   slave-server
     slave_skip_errors = ALL
     replicate_ignore_db = mysql
     replicate_do_db = huanqiu,huanpc
Please  read  the --check-replication-filters documentation to learn how to solve this problem. at  /usr/bin/pt-online-schema-change  line 8083.

如上命令就是在主庫上操做的,會提示它有從庫,須要添加參數--nocheck-replication-filters,即不檢查從庫。(注意:下面命令中能夠將localhost換成主庫ip。另外:該命令只能針對某張表進行修改,由於它是針對alter操做的,而alter是針對表的操做命令。因此不能省略命令中"t=表名"的選項)

1
2
3
4
5
6
7
8
[root@master-server ~] # pt-online-schema-change --user=root --password=123456 --host=localhost --alter="ENGINE=InnoDB" D=huanqiu,t=haha --execute --nocheck-replication-filters       
Found 1 slaves:
   slave-server
.......
2017-01-16T10:36:33 Dropped old table `huanqiu`.`_haha_old` OK.
2017-01-16T10:36:33 Dropping triggers...
2017-01-16T10:36:33 Dropped triggers OK.
Successfully altered `huanqiu`.`haha`.

而後再次查看huanqiu.haha表的存儲引擎,發現已經是Innodb類型的了。

1
2
3
4
5
6
7
8
9
10
11
mysql> show create table huanqiu.haha;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                             |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| haha  | CREATE TABLE `haha` (
   ` id ` int(10) NOT NULL AUTO_INCREMENT,
   `name` varchar(50) NOT NULL,
   PRIMARY KEY (` id `)
) ENGINE=InnoDB AUTO_INCREMENT=91 DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row  in  set  (0.00 sec)

如果在從庫上,則能夠直接執行(也能夠將下面從庫ip替換成localhost)

1
2
3
4
5
6
7
8
9
10
11
[root@slave-server ~] # pt-online-schema-change --user=root --password=123456 --host=192.168.1.102 --alter="ENGINE=InnoDB" D=huanqiu,t=haha --execute
No slaves found.  See --recursion-method  if  host slave-server has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
.......
2017-01-15T21:40:35 Swapped original and new tables OK.
2017-01-15T21:40:35 Dropping old table...
2017-01-15T21:40:35 Dropped old table `huanqiu`.`_haha_old` OK.
2017-01-15T21:40:35 Dropping triggers...
2017-01-15T21:40:35 Dropped triggers OK.
Successfully altered `huanqiu`.`haha`.

2)pt-duplicate-key-checker
功能介紹:
功能爲從mysql表中找出重複的索引和外鍵,這個工具會將重複的索引和外鍵都列出來,並生成了刪除重複索引的語句,很是方便
用法介紹:
pt-duplicate-key-checker [OPTION...] [DSN]
包含比較多的選項,具體的能夠經過命令pt-duplicate-key-checker --help來查看具體支持那些選項,我這裏就不一一列舉了。DNS爲數據庫或者表。
使用示例:
查看huanqiu庫或huanqiu.haha表的重複索引和外鍵使用狀況使用,以下命令:

1
2
3
4
5
6
[root@master-server ~] # pt-duplicate-key-checker  --host=localhost --user=root --password=123456  --databases=huanqiu
# ########################################################################
# Summary of indexes                                                     
# ########################################################################
 
# Total Indexes  6
1
2
3
4
5
6
# [root@master-server ~]# pt-duplicate-key-checker  --host=localhost --user=root --password=123456  --databases=huanqiu --table=haha
# ########################################################################
# Summary of indexes                                                     
# ########################################################################
 
# Total Indexes  1

3)pt-slave-find
功能介紹:
查找和打印mysql全部從服務器複製層級關係
用法介紹:
pt-slave-find [OPTION...] MASTER-HOST
原理:鏈接mysql主服務器並查找其全部的從,而後打印出全部從服務器的層級關係。
使用示例:
查找主服務器爲192.168.1.101的mysql有全部從的層級關係(將下面的192.168.1.101改爲localhost,就是查詢本機mysql的從關係):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@master-server ~] # pt-slave-find --user=root --password=123456 --host=192.168.1.101
192.168.1.101
Version         5.6.33-log
Server ID       101
Uptime          5+02:59:42 (started 2017-01-11T10:44:14)
Replication     Is not a slave, has 1 slaves connected, is not read_only
Filters        
Binary logging  MIXED
Slave status   
Slave mode      STRICT
Auto-increment  increment 1, offset 1
InnoDB version  5.6.33
+- 192.168.1.102
    Version         5.6.34-log
    Server ID       102
    Uptime          4+22:22:18 (started 2017-01-11T15:21:38)
    Replication     Is a slave, has 0 slaves connected, is not read_only
    Filters         slave_skip_errors=ALL; replicate_ignore_db=mysql; replicate_do_db=huanqiu,huanpc
    Binary logging  MIXED
    Slave status    265831 seconds behind, running, no errors
    Slave mode      STRICT
    Auto-increment  increment 1, offset 1
    InnoDB version  5.6.34

4)pt-show-grants
功能介紹:
規範化和打印mysql權限,讓你在複製、比較mysql權限以及進行版本控制的時候更有效率!
用法介紹:
pt-show-grants [OPTION...] [DSN]
選項自行用help查看,DSN選項也請查看help,選項區分大小寫。
使用示例:
查看指定mysql的全部用戶權限:

1
2
3
4
5
6
7
[root@master-server ~] # pt-show-grants --host='localhost' --user='root' --password='123456'
-- Grants dumped by pt-show-grants
-- Dumped from server Localhost via UNIX socket, MySQL 5.6.33-log at 2017-01-16 11:22:12
-- Grants  for  '' @ 'localhost'
GRANT USAGE ON *.* TO  '' @ 'localhost' ;
-- Grants  for  'data_check' @ '%'
.......

查看執行數據庫的權限:

1
2
3
4
5
6
7
8
9
10
[root@master-server ~] # pt-show-grants --host='localhost' --user='root' --password='123456' --database='huanqiu'
-- Grants dumped by pt-show-grants
-- Dumped from server Localhost via UNIX socket, MySQL 5.6.33-log at 2017-01-16 11:23:16
-- Grants  for  '' @ 'localhost'
GRANT USAGE ON *.* TO  '' @ 'localhost' ;
-- Grants  for  'data_check' @ '%'
GRANT SELECT ON *.* TO  'data_check' @ '%'  IDENTIFIED BY PASSWORD  '*36B94ABF70E8D5E025CF9C059E66445CBB05B54F' ;
-- Grants  for  'mksync' @ '%'
GRANT ALL PRIVILEGES ON *.* TO  'mksync' @ '%'  IDENTIFIED BY PASSWORD  '*B5E7409B1A22D47C6F1D8A693C6146CEB6570475' ;
........

查看每一個用戶權限生成revoke收回權限的語句:

1
2
3
4
5
6
7
[root@master-server ~] # pt-show-grants --host='localhost' --user='root' --password='123456'  --revoke
-- Grants dumped by pt-show-grants
-- Dumped from server Localhost via UNIX socket, MySQL 5.6.33-log at 2017-01-16 11:24:58
-- Revoke statements  for  '' @ 'localhost'
REVOKE USAGE ON *.* FROM  '' @ 'localhost' ;
-- Grants  for  '' @ 'localhost'
..........

5)pt-upgrade
功能介紹:
這個工具用來檢查在新版本中運行的SQL是否與老版本同樣,返回相同的結果,最好的應用場景就是數據遷移的時候。這在升級服務器的時候很是有用,能夠先安裝並導數據到新的服務器上,而後使用這個工具跑一下sql看看有什麼不一樣,能夠找出不一樣版本之間的差別。
用法介紹:
pt-upgrade [OPTION...] DSN [DSN...] [FILE]
比較文件中每個查詢語句在每臺服務器上執行的結果(主要是針對不一樣版本的執行結果)。(--help查看選項)
使用示例:
查看某個sql文件在兩個服務器的運行結果範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@master-server ~] # pt-upgrade h=192.168.1.101 h=192.168.1.102 --user=root --password=123456 /root/test.sql
 
#-----------------------------------------------------------------------
# Logs
#-----------------------------------------------------------------------
.......
host1:
   DSN:       h=192.168.1.101
   hostname :  master-server
   MySQL:     Source distribution 5.6.33
 
host2:
   DSN:       h=192.168.1.102
   hostname :  slave-server
   MySQL:     Source distribution 5.6.34
......
queries_read          1
queries_with_diffs    0
queries_with_errors   0

查看慢查詢中的對應的查詢SQL在兩個服務器的運行結果範例:

1
2
[root@master-server ~] # pt-upgrade h=192.168.1.101 h=192.168.1.102 --user=root --password=123456 /data/mysql/data/mysql-slow.log
.......

6)pt-index-usage
功能介紹:
這個工具主要是用來分析慢查詢的索引使用狀況。從log文件中讀取插敘語句,並用explain分析他們是如何利用索引。完成分析以後會生成一份關於索引沒有被查詢使用過的報告。
用法介紹:
pt-index-usage [OPTION...] [FILE...]
能夠直接從慢查詢中獲取sql,FILE文件中的sql格式必須和慢查詢中個是一致,若是不是一直須要用pt-query-digest轉換一下。也能夠不生成報告直接保存到數據庫中,具體的見後面的示例
注意:使用這個工具須要MySQL必需要有密碼,另外運行時可能報找不到/var/lib/mysql/mysql.sock的錯,簡單的從mysql啓動後的sock文件作一個軟連接便可。
重點要說明的是pt-index-usage只能分析慢查詢日誌,因此若是想全面分析全部查詢的索引使用狀況就得將slow_launch_time設置爲0,所以請謹慎使用該工具,線上使用的話最好在凌晨進行分析,尤爲分析大量日誌的時候是很耗CPU的。
總體來講這個工具是不推薦使用的,要想實現相似的分析能夠考慮一些其餘第三方的工具,好比:mysqlidxchx, userstat和check-unused-keys。網上比較推薦的是userstat,一個Google貢獻的patch。
使用示例:
從滿查詢中的sql查看索引使用狀況範例:

1
[root@master-server ~] # pt-index-usage --host=localhost --user=root --password=123456 /data/mysql/data/mysql-slow.log

將分析結果保存到數據庫範例:

1
[root@master-server ~] # pt-index-usage --host=localhost --user=root --password=123456 /data/mysql/data/mysql-slow.log  --no-report --create-save-results-database

7)pt-visual-explain
功能介紹:
格式化explain出來的執行計劃按照tree方式輸出,方便閱讀。
用法介紹:
pt-visual-explain [OPTION...] [FILE...]
經過管道直接查看explain輸出結果的範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
mysql>  select  * from huanqiu.haha;
+----+-------------+
id  | name        |
+----+-------------+
|  1 | wangshibo   |
|  2 | wangshihuan |
|  3 | 王世博      |
| 10 | wangshiman  |
+----+-------------+
4 rows  in  set  (0.00 sec)
 
[root@master-server ~] # mysql -uroot -p123456  -e "explain select * from huanqiu.haha" |pt-visual-explain
Warning: Using a password on the  command  line interface can be insecure.
Table scan
rows           4
+- Table
    table          haha
    
[root@master-server ~] # mysql -uroot -p123456  -e "explain select * from huanqiu.haha where id=3" |pt-visual-explain
Warning: Using a password on the  command  line interface can be insecure.
Bookmark lookup
+- Table
|  table          haha
|  possible_keys  PRIMARY
+- Constant index lookup
    key            haha->PRIMARY
    possible_keys  PRIMARY
    key_len        4
    ref            const
    rows           1

查看包含查詢語句的test.sql文件的範例:

1
[root@master-server ~] # pt-visual-explain --connect /root/test.sql --user=root --password=123456

8)pt-config-diff
功能介紹:
比較mysql配置文件和服務器參數
用法介紹:
pt-config-diff [OPTION...] CONFIG CONFIG [CONFIG...]
CONFIG能夠是文件也能夠是數據源名稱,最少必須指定兩個配置文件源,就像unix下面的diff命令同樣,若是配置徹底同樣就不會輸出任何東西。
使用示例:
範例1:查看本地和遠程服務器的配置文件差別:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@master-server ~] # pt-config-diff h=localhost h=192.168.1.102 --user=root --password=123456
18 config differences
Variable                  master-server             slave-server
========================= ========================= =========================
binlog_checksum           NONE                      CRC32
general_log_file           /data/mysql/data/maste ...  /data/mysql/data/slave ...
hostname                   master-server             slave-server
innodb_version            5.6.33                    5.6.34
log_bin_index              /data/mysql/data/maste ...  /data/mysql/data/slave ...
log_slave_updates         OFF                       ON
relay_log_recovery        OFF                       ON
secure_file_priv                                    NULL
server_id                 101                       102
server_uuid               d8497104-d7a7-11e6-911... d8773e51-d7a7-11e6-911...
slave_net_timeout         3600                      5
slave_skip_errors         OFF                       ALL
sync_binlog               1                         0
sync_master_info          10000                     1
sync_relay_log            10000                     1
sync_relay_log_info       10000                     1
system_time_zone          CST                       EST
version                   5.6.33-log                5.6.34-log

範例2:比較本地配置文件和遠程服務器的差別:

1
2
3
4
5
6
7
8
9
10
[root@master-server ~] # pt-config-diff /usr/local/mysql/my.cnf h=localhost h=192.168.1.102 --user=root --password=123456
6 config differences
Variable                   /usr/local/mysql/my .cnf master-server      slave-ser
========================= ================= ================== ===============
binlog_checksum           none              NONE               CRC32
innodb_read_io_threads    1000              64                 64
innodb_write_io_threads   1000              64                 64
log_bin_index             master-bin.index   /data/mysql/dat ...  /data/mysql/ ...
server_id                 101               101                102
sync_binlog               1                 1                  0

9)pt-mysql-summary
功能介紹:
精細地對mysql的配置和sataus信息進行彙總,彙總後你直接看一眼就能看明白。
工做原理:鏈接mysql後查詢出status和配置信息保存到臨時目錄中,而後用awk和其餘的腳本工具進行格式化。OPTIONS能夠查閱官網的相關頁面。
用法介紹:
pt-mysql-summary [OPTIONS] [-- MYSQL OPTIONS]
使用示例:
彙總本地mysql服務器的status和配置信息:

1
[root@master-server ~] # pt-mysql-summary -- --user=root --password=123456 --host=localhost

10)pt-deadlock-logger
功能介紹:
提取和記錄mysql死鎖的相關信息
用法介紹:
pt-deadlock-logger [OPTION...] SOURCE_DSN
收集和保存mysql上最近的死鎖信息,能夠直接打印死鎖信息和存儲死鎖信息到數據庫中,死鎖信息包括髮生死鎖的服務器、最近發生死鎖的時間、死鎖線程id、死鎖的事務id、發生死鎖時事務執行了多長時間等等很是多的信息。
使用示例:
查看本地mysql的死鎖信息

1
2
3
4
[root@master-server ~] # pt-deadlock-logger  --user=root --password=123456 h=localhost D=test,t=deadlocks
server ts thread txn_id txn_time user  hostname  ip db tbl idx lock_type lock_mode wait_hold victim query
localhost 2017-01-11T11:00:33 188 0 0 root  192.168.1.101 huanpc checksums PRIMARY RECORD X w 1 REPLACE INTO `huanpc`.`checksums` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary, this_cnt, this_crc) SELECT  'huanpc' 'heihei' '1' , NULL, NULL, NULL, COUNT(*) AS cnt, COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS( '#' , `member`, `city`)) AS UNSIGNED)), 10, 16)), 0) AS crc FROM `huanpc`.`heihei` /*checksum table*/
localhost 2017-01-11T11:00:33 198 0 0 root  192.168.1.101 huanpc checksums PRIMARY RECORD X w 0 REPLACE INTO `huanpc`.`checksums` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary, this_cnt, this_crc) SELECT  'huanpc' 'heihei' '1' , NULL, NULL, NULL, COUNT(*) AS cnt, COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS( '#' , `member`, `city`)) AS UNSIGNED)), 10, 16)), 0) AS crc FROM `huanpc`.`heihei` /*checksum table*/

11)pt-mext
功能介紹:
並行查看SHOW GLOBAL STATUS的多個樣本的信息。
用法介紹:
pt-mext [OPTIONS] -- COMMAND
原理:pt-mext執行你指定的COMMAND,並每次讀取一行結果,把空行分割的內容保存到一個一個的臨時文件中,最後結合這些臨時文件並行查看結果。
使用示例:
每隔10s執行一次SHOW GLOBAL STATUS,並將結果合併到一塊兒查看

1
[root@master-server ~] # pt-mext  -- mysqladmin ext -uroot -p123456  -i10 -c3

12)pt-query-digest
功能介紹:
分析查詢執行日誌,併產生一個查詢報告,爲MySQL、PostgreSQL、 memcached過濾、重放或者轉換語句。
pt-query-digest能夠從普通MySQL日誌,慢查詢日誌以及二進制日誌中分析查詢,甚至能夠從SHOW PROCESSLIST和MySQL協議的tcpdump中進行分析,若是沒有指定文件,它從標準輸入流(STDIN)中讀取數據。
用法介紹:
pt-query-digest [OPTION...] [FILE]
解析和分析mysql日誌文件
使用示例:(建議:當log很大的時候最好仍是將日誌文件移到其餘機器上進行分析,以避免過多耗費本機性能)
範例1:分析本地的慢查詢日誌文件(本例是慢查詢日誌,也能夠是mysql的其餘日誌)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
[root@master-server ~] # pt-query-digest --user=root --password=123456 /data/mysql/data/mysql-slow.log
 
# 260ms user time, 30ms system time, 24.85M rss, 204.71M vsz
# Current date: Mon Jan 16 13:20:39 2017
# Hostname: master-server
# Files: /data/mysql/data/mysql-slow.log
# Overall: 18 total, 2 unique, 0 QPS, 0x concurrency _____________________
# Time range: all events occurred at 2017-01-11 11:00:33
# Attribute          total     min     max     avg     95%  stddev  median
# ============     ======= ======= ======= ======= ======= ======= =======
# Exec time           812s      2s     92s     45s     80s     27s     52s
# Lock time              0       0       0       0       0       0       0
# Rows sent              0       0       0       0       0       0       0
# Rows examine           0       0       0       0       0       0       0
# Query size         1.10k      62      63   62.56   62.76    0.50   62.76
 
# Profile
# Rank Query ID           Response time  Calls R/Call  V/M   Item
# ==== ================== ============== ===== ======= ===== =============
#    1 0x50B84661D4CCF34B 467.9075 57.6%    10 46.7907 16.48 CREATE DATABASE `huanqiu`
#    2 0x9CC34439A4FB17E3 344.2984 42.4%     8 43.0373 16.22 CREATE DATABASE `huanpc`
 
# Query 1: 0 QPS, 0x concurrency, ID 0x50B84661D4CCF34B at byte 2642 _____
# This item is included in the report because it matches --limit.
# Scores: V/M = 16.48
# Time range: all events occurred at 2017-01-11 11:00:33
# Attribute    pct   total     min     max     avg     95%  stddev  median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count         55      10
# Exec time     57    468s      2s     92s     47s     80s     28s     52s
# Lock time      0       0       0       0       0       0       0       0
# Rows sent      0       0       0       0       0       0       0       0
# Rows examine   0       0       0       0       0       0       0       0
# Query size    55     630      63      63      63      63       0      63
# String:
# Hosts
# Users        root
# Query_time distribution
#   1us
#  10us
# 100us
#   1ms
#  10ms
# 100ms
#    1s  #######
#  10s+  ################################################################
CREATE DATABASE IF NOT EXISTS `huanqiu` /* pt-table-checksum */\G
 
# Query 2: 0 QPS, 0x concurrency, ID 0x9CC34439A4FB17E3 at byte 3083 _____
# This item is included in the report because it matches --limit.
# Scores: V/M = 16.22
# Time range: all events occurred at 2017-01-11 11:00:33
# Attribute    pct   total     min     max     avg     95%  stddev  median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count         44       8
# Exec time     42    344s      2s     82s     43s     80s     26s     56s
# Lock time      0       0       0       0       0       0       0       0
# Rows sent      0       0       0       0       0       0       0       0
# Rows examine   0       0       0       0       0       0       0       0
# Query size    44     496      62      62      62      62       0      62
# String:
# Hosts
# Users        root
# Query_time distribution
#   1us
#  10us
# 100us
#   1ms
#  10ms
# 100ms
#    1s  #########
#  10s+  ################################################################
CREATE DATABASE IF NOT EXISTS `huanpc` /* pt-table-checksum */\G
 
整個輸出分爲三大部分:
1)總體概要(Overall)
這個部分是一個大體的概要信息(相似loadrunner給出的概要信息),經過它能夠對當前MySQL的查詢性能作一個初步的評估,好比各個指標的最大值(max),平均值(min),95%分佈值,中位數(median),標準誤差(stddev)。
這些指標有查詢的執行時間(Exec  time ),鎖佔用的時間(Lock  time ),MySQL執行器須要檢查的行數(Rows examine),最後返回給客戶端的行數(Rows sent),查詢的大小。
 
2)查詢的彙總信息(Profile)
這個部分對全部「重要」的查詢(一般是比較慢的查詢)作了個一覽表。
每一個查詢都有一個Query ID,這個ID經過Hash計算出來的。pt-query-digest是根據這個所謂的Fingerprint來group by的。
Rank整個分析中該「語句」的排名,通常也就是性能最常的。
Response  time   「語句」的響應時間以及總體佔比狀況。
Calls 該「語句」的執行次數。
R /Call  每次執行的平均響應時間。
V /M  響應時間的差別平均對比率。
在尾部有一行輸出,顯示了其餘2個佔比較低而不值得單獨顯示的查詢的統計數據。
 
3)詳細信息
這個部分會列出Profile表中每一個查詢的詳細信息:
包括Overall中有的信息、查詢響應時間的分佈狀況以及該查詢」入榜」的理由。
pt-query-digest還有不少複雜的操做,這裏就不一一介紹了。好比:從PROCESSLIST中查詢某個MySQL中最慢的查詢:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
mysql> use  test ;
Database changed
 
mysql> 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
     -> );
Query OK, 0 rows affected (0.02 sec)
  
mysql>  select  * from query_review;
Empty  set  (0.00 sec)
  
[root@master-server ~] # pt-query-digest --user=root --password=123456 --review h=localhost,D=test,t=query_review /data/mysql/data/mysql-slow.log
 
mysql>  select  * from query_review;
+----------------------+------------------------------------------+-----------------------------------------------------------------+----------
| checksum | fingerprint | sample | first_see
+----------------------+------------------------------------------+-----------------------------------------------------------------+----------
| 5816476304744969035 | create database  if  not exists `huanqiu` | CREATE DATABASE IF NOT EXISTS `huanqiu` /* pt-table-checksum */ | 2017-01-1
| 11295947304747079651 | create database  if  not exists `huanpc` | CREATE DATABASE IF NOT EXISTS `huanpc` /* pt-table-checksum */ | 2017-01-1
+----------------------+------------------------------------------+-----------------------------------------------------------------+----------
2 rows  in  set  (0.00 sec)

從tcpdump中分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@master-server ~] # tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp.txt
tcpdump: verbose output suppressed, use - v  or -vv  for  full protocol decode
listening on any, link- type  LINUX_SLL (Linux cooked), capture size 65535 bytes
 
而後打開另外一個終端窗口:
[root@master-server ~] # pt-query-digest --type tcpdump mysql.tcp.txt
Pipeline process 3 (TcpdumpParser) caused an error: substr outside of string at  /usr/bin/pt-query-digest  line 3628, <> chunk 93.
Will retry pipeline process 2 (TcpdumpParser) 100  more  times .
 
# 320ms user time, 20ms system time, 24.93M rss, 204.84M vsz
# Current date: Mon Jan 16 13:24:50 2017
# Hostname: master-server
# Files: mysql.tcp.txt
# Overall: 31 total, 4 unique, 4.43 QPS, 0.00x concurrency _______________
# Time range: 2017-01-16 13:24:43.000380 to 13:24:50.001205
# Attribute          total     min     max     avg     95%  stddev  median
# ============     ======= ======= ======= ======= ======= ======= =======
# Exec time           30ms    79us     5ms   967us     4ms     1ms   159us
# Rows affecte          14       0       2    0.45    1.96    0.82       0
# Query size         1.85k      17     200   61.16  192.76   72.25   17.65
.........

13)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分鐘

1
2
3
[root@master-server ~] # pt-slave-delay --user=root --password=123456 --delay 1m --run-time 10m --host=192.168.1.102
2017-01-16T13:32:31 slave running 0 seconds behind
2017-01-16T13:32:31 STOP SLAVE  until  2017-01-16T13:33:31 at master position mysql-bin.000005 /102554361

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

1
2
3
[root@master-server ~] # pt-slave-delay --user=root --password=123456 --delay 1m --interval 15s --run-time 10m --host=192.168.1.102
2017-01-16T13:38:22 slave running 0 seconds behind
2017-01-16T13:38:22 STOP SLAVE  until  2017-01-16T13:39:22 at master position mysql-bin.000005 /102689359

14)pt-slave-restart
功能介紹:
監視mysql複製錯誤,並嘗試重啓mysql複製當複製中止的時候
用法介紹:
pt-slave-restart [OPTION...] [DSN]
監視一個或者多個mysql複製錯誤,當從中止的時候嘗試從新啓動複製。你能夠指定跳過的錯誤並運行從到指定的日誌位置。
使用示例:
範例1:監視192.168.1.101的從,跳過1個錯誤

1
[root@master-server ~] # pt-slave-restart --user=root --password=123456 --host=192.168.1.101 --skip-count=1

範例2:監視192.168.1.101的從,跳過錯誤代碼爲1062的錯誤。

1
[root@master-server ~] # pt-slave-restart --user=root --password=123456 --host=192.168.1.101 --error-numbers=1062

15)pt-diskstats
功能介紹:
是一個對GUN/LINUX的交互式監控工具
用法介紹:
pt-diskstats [OPTION...] [FILES]
爲GUN/LINUX打印磁盤io統計信息,和iostat有點像,可是這個工具是交互式而且比iostat更詳細。能夠分析從遠程機器收集的數據。
使用示例:
範例1:查看本機全部的磁盤的狀態狀況:

1
[root@master-server ~]# pt-diskstats

範例2:只查看本機sdc1磁盤的狀態狀況:

1
2
3
4
[root@master-server ~]# pt-diskstats   --devices-regex vdc1
   #ts device    rd_s rd_avkb rd_mb_s rd_mrg rd_cnc   rd_rt    wr_s wr_avkb wr_mb_s wr_mrg wr_cnc   wr_rt busy in_prg    io_s  qtime stime
   0.9 vdc1       0.0     0.0     0.0     0%    0.0     0.0     5.9     4.0     0.0     0%    0.0     1.0   0%      0     5.9    0.6   0.4
   1.0 vdc1       0.0     0.0     0.0     0%    0.0     0.0     2.0     6.0     0.0    33%    0.0     0.7   0%      0     2.0    0.0   0.7

16)pt-summary
功能介紹:
友好地收集和顯示系統信息概況,此工具並非一個調優或者診斷工具,這個工具會產生一個很容易進行比較和發送郵件的報告。
用法介紹:
pt-summary
原理:此工具會運行和多命令去收集系統狀態和配置信息,先保存到臨時目錄的文件中去,而後運行一些unix命令對這些結果作格式化,最好是用root用戶或者有權限的用戶運行此命令。
使用示例:
查看本地系統信息概況

1
[root@master-server ~]# pt-summary

17)pt-stalk
功能介紹:
出現問題的時候收集mysql的用於診斷的數據
用法介紹:
pt-stalk [OPTIONS] [-- MYSQL OPTIONS]
pt-stalk等待觸發條件觸發,而後收集數據幫助錯誤診斷,它被設計成使用root權限運行的守護進程,所以你能夠診斷那些你不能直接觀察的間歇性問題。默認的診斷觸發條件爲SHOW GLOBAL STATUS。也能夠指定processlist爲診斷觸發條件 ,使用--function參數指定。
使用示例:
範例1:指定診斷觸發條件爲status,同時運行語句超過20的時候觸發,收集的數據存放在目標目錄/tmp/test下:

1
[root@master-server ~]# pt-stalk   --function status --variable Threads_running --threshold 20 --dest /tmp/test  -- -uroot -p123456  -h192.168.1.101

範例2:指定診斷觸發條件爲processlist,超過20個狀態爲statistics觸發,收集的數據存放在/tmp/test目錄下:

1
2
3
4
5
6
7
8
9
[root@master-server ~]# pt-stalk   --function processlist --variable State --match statistics --threshold 20 --dest /tmp/test -- -uroot -p123456  -h192.168.1.101
.......
2017_01_15_17_31_49-hostname
2017_01_15_17_31_49-innodbstatus1
2017_01_15_17_31_49-innodbstatus2
2017_01_15_17_31_49-interrupts
2017_01_15_17_31_49-log_error
2017_01_15_17_31_49-lsof
2017_01_15_17_31_49-meminfo

18)pt-archiver
功能介紹:
將mysql數據庫中表的記錄歸檔到另一個表或者文件
用法介紹:
pt-archiver [OPTION...] --source DSN --where WHERE
這個工具只是歸檔舊的數據,不會對線上數據的OLTP查詢形成太大影響,你能夠將數據插入另一臺服務器的其餘表中,也能夠寫入到一個文件中,方便使用source命令導入數據。另外你還能夠用它來執行delete操做。特別注意:這個工具默認的會刪除源中的數據!!
使用示例:
範例1:將192.168.1.101上的huanqiu庫的haha表id小於10的記錄轉移到192.168.1.102上的wangshibo庫下的wang_test表內,並歸檔到/var/log/haha_archive_20170115.log文件中(注意:轉移先後,兩張表對應轉移字段要相同,字段屬性最好也要相同;)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
源數據庫機器192.168.1.101的huanqiu庫下的haha表在轉移前的信息:
mysql>  select  from  huanqiu.haha;                                                                                                            
+ ----+---------------+
| id |  name           |
+ ----+---------------+
|  1 | changbo       |
|  2 | wangpengde    |
|  4 | guocongcong   |
|  5 | kevin         |
|  8 | mamin         |
|  9 | shihonge      |
| 11 | zhanglei      |
| 15 | zhanghongmiao |
+ ----+---------------+
rows  in  set  (0.01 sec)
 
目標數據庫機器192.168.1.102的wangshibo庫下的wang_test表在轉移前的信息:
mysql>  select  from  wangshibo.wang_test;
+ ------+-----------+
| id   |  name       |
+ ------+-----------+
|   20 | guominmin |
|   21 | gaofei    |
|   22 | 李夢楠    |
+ ------+-----------+
rows  in  set  (0.00 sec)
 
接着在192.168.1.101機器上執行轉移命令:
[root@master-server ~]# pt-archiver  --source h=192.168.1.101,D=huanqiu,t=haha --user=root --password=123456 --dest h=192.168.1.102,D=wangshibo,t=wang_test --file '/var/log/haha_archive_20170115.log' --where "id<=10"  --commit-each
 
上面命令執行成功後,再次觀察轉移先後信息
發現源數據庫機器192.168.1.101的huanqiu.haha表數據在轉移後,源數據也刪除了!
mysql>  select  from  huanqiu.haha;
+ ----+---------------+
| id |  name           |
+ ----+---------------+
| 11 | zhanglei      |
| 15 | zhanghongmiao |
+ ----+---------------+
rows  in  set  (0.00 sec)
 
查看歸檔日誌:
[root@master-server ~]# tail -f /var/log/haha_archive_20170115.log
1   changbo
2   wangpengde
4   guocongcong
5   kevin
8   mamin
9   shihonge
 
目標數據庫192.168.1.102的wangshibo.wang_test表內已經移轉到了新數據
mysql>  select  from  wangshibo.wang_test;
+ ------+-------------+
| id   |  name         |
+ ------+-------------+
|   20 | guominmin   |
|   21 | gaofei      |
|   22 | 李夢楠       |
|    1 | changbo     |
|    2 | wangpengde  |
|    4 | guocongcong |
|    5 | kevin       |
|    8 | mamin       |
|    9 | shihonge    |
+ ------+-------------+
rows  in  set  (0.00 sec)

範例2:將192.168.1.101上的huanqiu庫的haha表裏id小於10的記錄歸檔到haha_log_archive_2017.10.10.log文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
mysql>  select  from  huanqiu.haha;
+ ----+---------------+
| id |  name           |
+ ----+---------------+
|  1 | changbo       |
|  2 | wangpengde    |
|  4 | guocongcong   |
|  5 | kevin         |
|  8 | mamin         |
|  9 | shihonge      |
| 11 | zhanglei      |
| 15 | zhanghongmiao |
+ ----+---------------+
rows  in  set  (0.00 sec)
 
[root@master-server ~]# pt-archiver  --source h=192.168.1.101,D=huanqiu,t=haha --user=root --password=123456 --file 'haha_log_archive_2017.10.10.log' --where "id<=10" --commit-each
 
轉移後的源數據已被刪除
mysql>  select  from  huanqiu.haha;
+ ----+---------------+
| id |  name           |
+ ----+---------------+
| 11 | zhanglei      |
| 15 | zhanghongmiao |
+ ----+---------------+
rows  in  set  (0.00 sec)
 
查看歸檔文件
[root@master-server ~]# cat haha_log_archive_2017.10.10.log
1   changbo
2   wangpengde
4   guocongcong
5   kevin
8   mamin
9   shihonge

範例3:刪除192.168.1.101上的huanqiu庫的haha表中id小於10的記錄:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mysql>  select  from  huanqiu.haha;
+ ----+---------------+
| id |  name           |
+ ----+---------------+
|  1 | changbo       |
|  2 | wangpengde    |
|  4 | guocongcong   |
|  5 | kevin         |
|  8 | mamin         |
|  9 | shihonge      |
| 11 | zhanglei      |
| 15 | zhanghongmiao |
+ ----+---------------+
rows  in  set  (0.00 sec)
 
[root@master-server ~]# pt-archiver  --source h=192.168.1.101,D=huanqiu,t=haha --user=root --password=123456 --purge --where 'id<=10' --no-check-charset
<br>再次查看,發現數據已成功刪除!
mysql>  select  from  huanqiu.haha;
+ ----+---------------+
| id |  name           |
+ ----+---------------+
| 11 | zhanglei      |
| 15 | zhanghongmiao |
+ ----+---------------+
rows  in  set  (0.00 sec)

19)pt-find
功能介紹:
查找mysql表並執行指定的命令,和gnu的find命令相似。
用法介紹:
pt-find [OPTION...] [DATABASE...]
默認動做是打印數據庫名和表名
使用示例:
查找192.168.1.101中1天之前建立的InnoDB的表 ,並打印。

1
2
3
4
5
6
7
8
9
10
11
[root@master-server ~] # pt-find --ctime +1  --host=192.168.1.101 --engine InnoDB --user=root --password=123456
`huanpc`.`_heihei_new`
`huanpc`.`checksums`
`huanqiu`.`_haha_new`
`huanqiu`.`checksums`
`huanqiu`.`heartbeat`
`mysql`.`innodb_index_stats`
`mysql`.`innodb_table_stats`
`mysql`.`slave_master_info`
`mysql`.`slave_relay_log_info`
`mysql`.`slave_worker_info`

範例2:查找192.168.1.101中1天之前更改過的數據庫名字匹配%huanqiu%的而且引擎爲Myisam的表,並將表的引擎更改成Innodb引擎。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
先查找出192.168.1.101上1天之前更改過的數據庫名字匹配%huanqiu%的而且引擎爲Myisam的表
[root@master-server ~] # pt-find --ctime +2 --dblike huanqiu --host=192.168.1.101 --engine Myisam --user=root --password=123456
`huanqiu`.`_haha_new`
`huanqiu`.`checksums`
`huanqiu`.`heartbeat`
[root@master-server ~] # pt-find --ctime +2 --dblike huanpc --host=192.168.1.101 --engine Myisam --user=root --password=123456
`huanpc`.`_heihei_new`
`huanpc`.`checksums`
 
再將查找出的表的引擎改成Innodb
[root@master-server ~] # pt-find --ctime +2 --dblike huanqiu --host=192.168.1.101 --engine Myisam --user=root --password=123456 --exec "ALTER TABLE %D.%N ENGINE=InnoDB"
[root@master-server ~] # pt-find --ctime +2 --dblike huanpc --host=192.168.1.101 --engine Myisam --user=root --password=123456 --exec "ALTER TABLE %D.%N ENGINE=InnoDB"
 
最後再檢查對應數據表的引擎

範例3:查找192.168.1.101中huanqiu庫和huanpc庫中的空表,並刪除。

1
[root@master-server ~] # pt-find --empty huanqiu huanpc --host=192.168.1.101 --user=root --password=123456  --exec-plus "DROP TABLE %s"

範例4:查找192.168.1.101中超過100M的表

1
[root@master-server ~] # pt-find --tablesize +100M --host=192.168.1.101 --user=root --password=123456

20)pt-kill
功能介紹:
Kill掉符合指定條件mysql語句
用法介紹:
pt-kill [OPTIONS]
加入沒有指定文件的話pt-kill鏈接到mysql並經過SHOW PROCESSLIST找到指定的語句,反之pt-kill從包含SHOW PROCESSLIST結果的文件中讀取mysql語句
使用示例:
範例1:查找192.168.1.101數據庫服務器運行時間超過60s的語句,並打印

1
[root@master-server ~] # pt-kill --busy-time 60 --print --host=192.168.1.101 --user=root --password=123456

範例2:查找192.168.1.101數據庫服務器運行時間超過60s的語句,並kill

1
[root@master-server ~] # pt-kill --busy-time 60 --kill --host=192.168.3.135 --user=root --password=123456

範例3:從proccesslist文件中查找執行時間超過60s的語句

1
2
3
[root@master-server ~] # mysql -uroot -p123456 -h192.168.1.101 -e "show processlist" > processlist.txt
Warning: Using a password on the  command  line interface can be insecure.
[root@master-server ~] # pt-kill --test-matching processlist.txt --busy-time 60 --print
***************當你發現本身的才華撐不起野心時,就請安靜下來學習吧***************
相關文章
相關標籤/搜索