亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

percona-toolkit工具的pt-table-checksum實際運用簡析

發布時間:2020-04-29 11:52:52 來源:億速云 閱讀:552 作者:三月 欄目:MySQL數據庫

本文主要給大家簡單講講percona-toolkit工具的pt-table-checksum實際運用簡析,相關專業術語大家可以上網查查或者找一些相關書籍補充一下,這里就不涉獵了,直奔主題,希望可以給大家帶來一些實際幫助。

mysql工作中接觸最多的就是mysql replication,mysql在復制方面還是會有一些常規問題,比如主庫宕機或者從庫宕機有可能會導致復制中斷,通常需要進行人為修復,或者很多時候需要把一個從庫提升為主庫,但對從庫和主庫的數據一致性不能保證一樣。這種情況下就需要使用percona-toolkit工具的pt-table-checksum組件來檢查主從數據的一致性;如果發現不一致的數據,可以通過pt-table-sync修復;還可以通過pt-heartbeat監控主從復制延遲。當然如果數據量小,slave只是當做一個備份使用,那么出現數據不一致完全可以重做,或者通過其他方法解決。如果數據量非常大,重做就是非常蛋碎的一件事情了。比如說,線上數據庫做了主從同步環境,數據庫在進行了遷移后,需要對mysql遷移(Replication)后的數據一致性進行校驗,但又不能對生產環境使用造成影響,pt-table-checksum成為了絕佳也是唯一的檢查工具。

percona-toolkit工具的pt-table-checksum實際運用簡析

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

具體安裝方法參考官網地址: https://www.percona.com/doc/percona-toolkit/LATEST/installation.html

下邊是直接yum安裝:

sudo yum install percona-toolkit

安裝參考地址:

https://blog.csdn.net/stevendbaguo/article/details/73122074

https://www.cnblogs.com/piperck/p/5131289.html

https://blog.csdn.net/zengxuewen2045/article/details/52029093

https://blog.csdn.net/u010587433/article/details/46708563

https://blog.csdn.net/zjq1985/article/details/79816242?utm_source=blogxgwz2

一、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如下:

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

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



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

mysql> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host      | db   | Command | Time | State | Info             |
+----+------+-----------+------+---------+------+-------+------------------+
| 10 | root | localhost | NULL | Query   |    0 | init  | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+

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

再在主庫上執行:

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

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


二、pt-table-sync用法梳理
解釋:

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

如果通過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


            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

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

            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

#!/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 ~]# crontab -l[root@master-server ~]# cat /root/pt_huanpc.sh 

#!/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檢查過程中產生的。這張表一旦產生了,默認是刪除不了的,并且這張表所在的庫也默認刪除不了,刪除后過一會兒就又會出來。

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檢查前添加的權限收回!

mysql> show grants for 'root'@'192.168.1.101';    
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@192.168.1.101                                                                                                                                                       |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
GRANT SELECTINSERTUPDATEDELETECREATE, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'root'@'192.168.1.101' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

 

mysql> revoke SELECTINSERTUPDATEDELETECREATE, 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刪除了,從庫的這張表也會跟著刪除

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表一旦產生,不僅這張表默認刪除不了,連同它所在的庫,要是想刪除它們,只能如上操作先撤銷權限

三、pt-heartbeat監控mysql主從復制延遲梳理

對于MySQL數據庫主從復制延遲的監控,可以借助percona的有力武器pt-heartbeat來實現。
pt-heartbeat的工作原理通過使用時間戳方式在主庫上更新特定表,然后在從庫上讀取被更新的時間戳然后與本地系統時間對比來得出其延遲。具體流程:
   1)在主上創建一張heartbeat表,按照一定的時間頻率更新該表的字段(把時間更新進去)。監控操作運行后,heartbeat表能促使主從同步!
   2)連接到從庫上檢查復制的時間記錄,和從庫的當前系統時間進行比較,得出時間的差異。

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

注意:需要指定的參數至少有 --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庫的檢查,其他同步的庫的檢查操作類似!

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     

#!/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,每隔一分鐘檢查一次

[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類型。

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)

修改操作如下:

[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=表名"的選項)

[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類型的了。

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)

[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表的重復索引和外鍵使用情況使用,如下命令:

[root@master-server ~]# pt-duplicate-key-checker  --host=localhost --user=root --password=123456  --databases=huanqiu
# ########################################################################
# Summary of indexes                                                     
# ########################################################################

 

# Total Indexes  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的從關系):

[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的所有用戶權限:

[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'@'%'

.......

查看執行數據庫的權限:

[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收回權限的語句:

[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文件在兩個服務器的運行結果范例:

[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在兩個服務器的運行結果范例:

[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查看索引使用情況范例:

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

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

[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輸出結果的范例:

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文件的范例:

[root@master-server ~]# pt-visual-explain --connect /root/test.sql --user=root --password=123456范例2:比較本地配置文件和遠程服務器的差異:

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

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:比較本地配置文件和遠程服務器的差異:

[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和配置信息:

[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的死鎖信息

[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,并將結果合并到一起查看

[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的其他日志)

[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表的表結構必須先建好,表結構如下:

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中分析:

[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分鐘

[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分鐘:

  [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個錯誤

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

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

[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:查看本機所有的磁盤的狀態情況:

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

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

[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用戶或者有權限的用戶運行此命令。
使用示例:
查看本地系統信息概況

[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下:

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

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

[root@master-server ~]# pt-stalk  --function processlist --variable State --match statistics --threshold 20 --dest /tmp/test -- -uroot -p123456  -h292.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文件中(注意:轉移前后,兩張表對應轉移字段要相同,字段屬性最好也要相同;)

源數據庫機器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文件中:

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的記錄:

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的表 ,并打印。

[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引擎。

先查找出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庫中的空表,并刪除。

[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的表

[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的語句,并打印

[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

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

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

[root@master-server ~]# mysql -uroot -p123456 -h292.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

percona-toolkit工具的pt-table-checksum實際運用簡析就先給大家講到這里,對于其它相關問題大家想要了解的可以持續關注億速云的行業資訊。我們的板塊內容每天都會捕捉一些行業新聞及專業知識分享給大家的。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长子县| 剑阁县| 台州市| 贺兰县| 襄垣县| 长沙县| 呼伦贝尔市| 灵寿县| 白银市| 淳化县| 乌拉特前旗| 工布江达县| 栾川县| 安平县| 诸城市| 丰镇市| 鹤壁市| 鱼台县| 凌云县| 万年县| 米易县| 镇巴县| 久治县| 武功县| 洞口县| 汉寿县| 永春县| 崇义县| 上虞市| 宝山区| 庆安县| 五台县| 平塘县| 德安县| 贵定县| 石楼县| 栖霞市| 临泽县| 海宁市| 个旧市| 忻州市|