在mysql工做中接觸最多的就是mysql replication,mysql在複製方面仍是會有一些常規問題,好比主庫宕機或者從庫宕機有可能會致使複製中斷,一般須要進行人爲修復,或者不少時候須要把一個從庫提高爲主庫,但對從庫和主庫的數據一致性不能保證同樣。這種狀況下就須要使用percona-toolkit工具的pt-table-checksum組件來檢查主從數據的一致性;若是發現不一致的數據,能夠經過pt-table-sync修復;還能夠經過pt-heartbeat監控主從複製延遲。固然若是數據量小,slave只是當作一個備份使用,那麼出現數據不一致徹底能夠重作,或者經過其餘方法解決。若是數據量很是大,重作就是很是蛋碎的一件事情了。好比說,線上數據庫作了主從同步環境,數據庫在進行了遷移後,須要對mysql遷移(Replication)後的數據一致性進行校驗,但又不能對生產環境使用形成影響,pt-table-checksum成爲了絕佳也是惟一的檢查工具。html
percona-toolkit介紹
percona-toolkit是一組高級命令行工具的集合,用來執行各類經過手工執行很是複雜和麻煩的mysql和系統任務,這些任務包括:
1)檢查master和slave數據的一致性
2)有效地對記錄進行歸檔
3)查找重複的索引
4)對服務器信息進行彙總
5)分析來自日誌和tcpdump的查詢
6)當系統出問題的時候收集重要的系統信息
percona-toolkit源自Maatkit和Aspersa工具,這兩個工具是管理mysql的最有名的工具。不過,如今Maatkit工具已經不維護了,因此之後推薦仍是使用percona-toolkit工具!
這些工具主要包括開發、性能、配置、監控、複製、系統、實用六大類,做爲一個優秀的DBA,裏面有的工具很是有用,若是能掌握並加以靈活應用,將能極大的提升工做效率。mysql
percona-toolkit工具中最主要的三個組件分別是:
1)pt-table-checksum 負責監測mysql主從數據一致性
2)pt-table-sync 負責當主從數據不一致時修復數據,讓它們保存數據的一致性
3)pt-heartbeat 負責監控mysql主從同步延遲
下面就對這三個組件的使用作一記錄,固然percona-toolkit工具也有不少其餘組件,後面會一一說明。ios
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鍵就會顯示)sql
安裝該工具依賴的軟件包
[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 會暫停直到遇上主庫的計算時間點(也經過選項--設定一個可容忍的延遲最大值,超過這個值也認爲不一致)。bash
爲了保證主數據庫服務的安全,該工具實現了許多保護措施:
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
上面有報錯:
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在運行。
在從庫上開啓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
解釋:
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
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 ~]# 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 | +-------------------+ 2 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 | +-------------------+ 2 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 | +--------------------+ 5 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 | +--------------------+ 6 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 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 | +-------+---------------+-------------------------------------------+ 8 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 | +-------+---------------+-------------------------------------------+ 7 rows in set (0.00 sec)
權限刪除後,就能成功刪除checksums這張表和它所在的庫了!
主庫的checksums刪除了,從庫的這張表也會跟着刪除
mysql> use huanpc; Database changed mysql> show tables; +------------------+ | Tables_in_huanpc | +------------------+ | checksums | | heihei | +------------------+ 2 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 | +-------------------+ 2 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
注意:須要指定的參數至少有 --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
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 -h192.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 -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文件中(注意:轉移先後,兩張表對應轉移字段要相同,字段屬性最好也要相同;)
源數據庫機器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 | +----+---------------+ 8 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 | 李夢楠 | +------+-----------+ 3 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 | +----+---------------+ 2 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 | +------+-------------+ 9 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 | +----+---------------+ 8 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 | +----+---------------+ 2 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 | +----+---------------+ 8 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
再次查看,發現數據已成功刪除! mysql> select * from huanqiu.haha; +----+---------------+ | id | name | +----+---------------+ | 11 | zhanglei | | 15 | zhanghongmiao | +----+---------------+ 2 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 -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