關鍵詞:PT工具
【1】percona-toolkit 工具包
【1.1】percona-toolkit下載
下載地址:
https://www.percona.com/downloads/percona-toolkit/LATEST/
linux下載/windows直接點擊下載 percona-toolkit-3.1.0_x86_64.tar.gz
【1.2】percona-toolkit 安裝
#(1)安裝perl,需要本地或者網絡yum源,參考:yum源配置 yum -y install perl-devel perl-Digest-MD5 perl-DBI perl-DBD-MySQL perl-IO-Socket-SSL.noarch perl-Time-HiRes
#(2)編譯安裝
需求
* Perl v5.8 or newer
* Bash v3 or newer
* Core Perl modules like Time::HiRes
# perl --version |head -2 #檢查perl版本
# bash --version #檢查bash版本
快速安裝步驟(缺省/usr/local/bin路徑下,過程略)
# tar zxvf percona-toolkit-<version>.tar.gz
# cd percona-toolkit-<version>
# perl Makefile.PL (安裝到非缺省目錄 perl Makefile.PL PREFIX=${HOME})
# make
# make test
# make install
【1.3】PT工具DBA最佳常用
參考應用:https://dbawsp.com/1054.html
- Level 1 (必須一定掌握)
- Level 2(大家可以了解,遇到問題可以想到這個工具可以協助大家解決很多問題)
【2】pt-table-checksum工具
(經常會有環境BUG,有時候死活跑不出來)
【2.1】pt-table-checksum的應用場景
(1)數據庫遷移后驗證數據
(2)主從復制出現問題,需要修復
(3)不小心誤操作,主從數據庫高反了,產生了錯誤的數據。
(4)定期校驗數據
【2.2】基本使用
基本使用參考:https://blog.csdn.net/jswangchang/article/details/79501553?tdsourcetag=s_pctim_aiomsg
詳細參數參考:https://www.xin3721.com/ArticleMySQL/mysql14224.html
官方資料:https://www.percona.com/doc/percona-toolkit/LATEST/pt-table-checksum.html
生產環境下使用經驗:https://segmentfault.com/a/1190000004309169
使用方法:
pt-table-checksum [OPTIONS] [DSN]
pt-table-checksum
:在主(master)上通過執行校驗的查詢對復制的一致性進行檢查,對比主從的校驗值,從而產生結果。
如何知道自己有哪些從庫呢?show slave hosts;
DSN指向的是主的地址,該工具的退出狀態不為零,如果發現有任何差別,或者如果出現任何警告或錯誤,更多信息請查看官方資料。
(1)對比一個表
pt-table-checksum --nocheck-replication-filters --replicate=yggl.checksums --databases=yggl --tables=salary h=127.0.0.1,u=root,p=123456,P=3306
詳細使用務必參考: http://www.xuchanggang.cn/archives/938.html
【2.3】常見報錯
(1)Diffs cannot be detected because no slaves were found 不能自動找到從庫,確認processlist或host或dsns方式用對了。
建議在從庫的配置文件中加上
report_host = MASTER_HOST report_port = 13306
注: (1)在有些情況下,recursion-method如果不設會報錯:Diffs cannot be detected because no slaves were found.
其參數有四:processlist/hosts/dsn=DSN/no,用來決定查找slave的方式是show full processlist還是show slave hosts還是命令行直接指定還是壓根就不准備找從庫,具體見下面參數介紹
(2)主從的端口必須一致,如果不一致就需要用DSN方法進行指定,否則會報找不到從庫的錯誤,如果能連到從庫服務器但沒有指定端口,默認會尋找3306端口
案例: https://bbs.csdn.net/topics/390531787
問題:
我在使用pt-table-checksum檢查主從數據是否一致遇到的問題:
一個主,兩個從
主:192.168.11.50 端口3306
從1:192.168.11.64 端口3306
從2:192.168.11.74 端口3307
pt-table-checksum可以很容易檢查從1的數據是否一致,但是從2因為端口是3307,連接不上,如何解決?
解決:
在Master機的test庫加入 CREATE TABLE `dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, `dsn` varchar(255) NOT NULL, PRIMARY KEY (`id`) ); – 寫入從庫信息 INSERT INTO dsns (parent_id,dsn) values(1,'h=192.168.11.64,u=checksums,p=123456,P=3306'); – 如果有多個從庫,就插入多條記錄. INSERT INTO dsns (parent_id,dsn) values(1,'h=192.168.11.74,u=checksums,p=123456,P=3307'); 執行pt-table-checksum命令時多加下面的參數即可。 --recursion-method=dsn=h=192.168.11.103,D=test,t=dsns
(3)被檢查的主從binlog_format必須為statement,如果不是statement-based,那就添加參數--no-check-binlog-format來避開binlog格式檢查
(4)檢查結果會輸出到默認建立的percona庫中的checksums表中,並會輸出統計信息到屏幕,diffs列展示主從數據不一致的塊的數目,如果都是0,恭喜,數據是一致的
(2)Cannot connect to h=slave1.*.com,p=...,u=percona_user 可以在pt-table-checksum命令前加PTDEBUG=1來看詳細的執行過程,如端口、用戶名、權限錯誤。
(3)Waiting for the --replicate table to replicate to XXX 問題出在 percona.checksums
表在從庫不存在,根本原因是沒有從主庫同步過來,所以看一下從庫是否延遲嚴重。
(4)Pausing because Threads_running=25 反復打印出類似上面停止檢查的信息。
這是因為當前數據庫正在運行的線程數大於默認25,pt-table-checksum 為了減少對庫的壓力暫停檢查了。等數據庫壓力過了就好了,或者也可以直接 Ctrl+C 終端,
下一次加上--resume繼續執行,或者加大--max-load=值。
(5)字符集問題
Error checksumming table Error executing checksum query: DBD::mysql::st execute failed: Illegal mix of collations 12-17T14:48:04 Error checksumming table d_ec_cs.t_online_cs: Error executing checksum query: DBD::mysql::st execute failed: Illegal mix of collations for operation 'concat_ws' [for Statement "REPLACE INTO `percona`.`ali_checksum` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary, this_cnt, this_crc) SELECT ?, ?, ?, ?, ?, ?, COUNT(*) AS cnt, COALESCE(LOWER(CONV(BIT_XOR(CAST(CRC32(CONCAT_WS('#', `f_cs_id`, `f_corp_id`, `f_valid`, `f_show_name`, `f_online_msg`, `f_offline_msg`, `f_show_mobile`, `f_group_id`, `f_qq`, `f_show_qq`, `f_msn`, `f_show_msn`, `f_sms_online`, `f_scheme`, `f_tel`, `f_telno`, `f_show_tel`, `f_contact`, `f_mobile`, `f_position`, `f_other1`, `f_other2`, `f_other_text1`, `f_other_text2`, `f_email`, `f_qq_first`, `f_qq_first_type`, `f_aids_open`, `f_aids_qq`, `f_aids_crmqq`, `f_aids_yahoo`, `f_aids_skype`, `f_aids_aliww`, `f_aids_msn`, `f_aids_alibaba`, `f_aids_alitrade`, CONCAT(ISNULL(`f_show_name`), ISNULL(`f_group_id`), ISNULL(`f_qq`), ISNULL(`f_show_qq`), ISNULL(`f_sms_online`), ISNULL(`f_other_text1`), ISNULL(`f_other_text2`), ISNULL(`f_email`)) )) AS UNSIGNED)), 10, 16)), 0) AS crc FROM `d_ec_cs`.`t_online_cs` /*checksum table*/" with ParamValues: 0='d_ts_profile', 1='t_user_account', 2=1, 3=undef, 4=undef, 5=undef] at /usr/bin/pt-table-checksum line 10520.
是個bug,暫時無法解決,Illegal mix of collations for operation 'concat_ws'。
【3】pt-table-checksum最佳實踐
【3.1】檢查主從數據的一致性情況:
pt-table-checksum [OPTIONS] [DSN]。
pt-table-checksum:在主上通過執行校驗的查詢對復制的一致性進行檢查,對比主從的校驗值,從而產生結果。
DSN指向的是主的地址,該工具的退出狀態不為零,如果發現有任何差別,或者如果出現任何警告或錯誤,不指定任何參數,會直接對本地的所有數據庫的表進行檢查。
如pt-table-checksum u=root,p=123456
注意事項如下:
(1).測試需要一個既能登錄主庫,也能登錄從庫,而且還能同步數據庫的賬號;
(2).只能指定一個host,必須為主庫的IP;
(3).在檢查時會向表加S鎖;
(4).運行之前需要從庫的同步IO和SQL進程是YES狀態。
mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'checksums'@'x.x.x.x' IDENTIFIED BY ‘xxxx’;
(5).如果在配置主從時,忽略復制mysql庫時,需要在 主上 和 從上 都執行上面的授權語句
[root@mysql-master1 ~]# pt-table-checksum h=’172.16.10.53′,u=’checksums’,p=’checksums’,P=3306 -d test_0109 \
–nocheck-replication-filters –replicate=test_checksum.checksums –nocheck-binlog-format –nocheck-plan –recursion-method=hosts Waiting to check replicas for differences: 0% 00:00 remain TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE 01-12T14:39:51 0 0 0 1 0 0.024 test_0109.broker 01-12T14:39:51 0 0 4 1 0 0.010 test_0109.check_conistent 01-12T14:39:51 0 0 0 1 0 0.012 test_0109.partner_alert_rule 01-12T14:39:51 0 1 0 1 0 0.266 test_0109.proc_test 01-12T14:39:51 0 1 529 1 0 0.021 test_0109.project
類似如下圖:

參數說明:
TS :完成檢查的時間。
ERRORS :檢查時候發生錯誤和警告的數量。
DIFFS :0表示一致,1表示不一致。當指定–no-replicate-check時,會一直為0,當指定–replicate-check-only會顯示不同的信息。
ROWS :表的行數。
CHUNKS :被划分到表中的塊的數目。
SKIPPED :由於錯誤或警告或過大,則跳過塊的數目。
TIME :執行的時間。
TABLE :被檢查的表名。
參數意義:
–nocheck-replication-filters :不檢查復制過濾器,建議啟用。后面可以用–databases來指定需要檢查的數據庫。
–no-check-binlog-format : 不檢查復制的binlog模式,要是binlog模式是ROW,則會報錯。
–replicate-check-only :只顯示不同步的信息。
–replicate= :把checksum的信息寫入到指定表中,建議直接寫到被檢查的數據庫當中。
–databases= :指定需要被檢查的數據庫,多個則用逗號隔開。
–tables= :指定需要被檢查的表,多個用逗號隔開
–recursion-method=: 主機信息
h=172.16.10.53 :Master的地址
u=checksums :用戶名
p=checksums :密碼
P=3306 :端口
通過DIFFS是1可以看出主從的表數據不一致。通過查看從庫上的 test_checksum.checksums 表可以看到主從庫的檢驗信息。
mysql> select * from test_checksum.checksums;
+———–+——————–+——-+————+————-+—————-+—————-+———-+———-+————+————+———————+
| db | tbl | chunk | chunk_time | chunk_index | lower_boundary | upper_boundary | this_crc | this_cnt | master_crc | master_cnt | ts |
+———–+——————–+——-+————+————-+—————-+—————-+———-+———-+————+————+———————+
| test_0109 | broker | 1 | 0.005901 | NULL | NULL | NULL | 0 | 0 | 0 | 0 | 2015-01-12 14:39:51 |
| test_0109 | check_conistent | 1 | 0.000484 | NULL | NULL | NULL | 709a8dc | 4 | 709a8dc | 4 | 2015-01-12 14:39:51 |
| test_0109 | partner_alert_rule | 1 | 0.000825 | NULL | NULL | NULL | 0 | 0 | 0 | 0 | 2015-01-12 14:39:51 |
| test_0109 | proc_test | 1 | 0.000439 | NULL | NULL | NULL | 652c8c22 | 99 | 0 | 0 | 2015-01-12 14:39:51 |
| test_0109 | project | 1 | 0.006852 | NULL | NULL | NULL | 0 | 0 | 862da9de | 529 | 2015-01-12 14:39:51 |
+———–+——————–+——-+————+————-+—————-+—————-+———-+———-+————+————+———————+
通過上面的 this_crc <> master_crc 更能清楚的看出他們的不一致了,通過chunk知道是這個張表的哪個塊上的記錄出現不一致。
要是主的binlog模式是Row 則會報錯:
Replica db2 has binlog_format ROW which could cause pt-table-checksum to break replication.
Please read “Replicas using row-based replication” in the LIMITATIONS section of the tool’s documentation.
If you understand the risks, specify –no-check-binlog-format to disable this check.
指定–replicate-check-only參數會在前一次pt-table-checksum檢驗的數據之上比較(不會再執行計算),顯示出數據不一致的SLAVE主機名
【3.2】修復主從數據不一致的情況
通過上面的工具,我們檢測出主從之間數據不一致的情況,那此時我們應該如何處理呢?
percona提供了pt-table-sync 用於修復主從數據的一致性
pt-table-sync [OPTIONS] DSN [DSN]。
pt-table-sync: 高效的同步MySQL表之間的數據,他可以做單向和雙向同步的表數據。他可以同步單個表,也可以同步整個庫。它不同步表結構、索引、或任何其他模式對象。所以在修復一致性之前需要保證他們表存在。
繼續上面的復制環境,主和從的表數據不一致,需要修復
pt-table-sync –print –replicate=test_checksum.checksums h=172.16.10.53,u=checksums,p=checksums,P=3306 h=172.16.10.55,u=checksums,p=checksums,P=3306
// 先MASTER的IP,再SLAVE的IP
// 以上是打印出同步語句,如果不一致數據較多,不需要打印出這些語句;
參數意義參考:
–replicate= :指定通過pt-table-checksum得到的表,這2個工具差不多都會一直用。
–databases= : 指定執行同步的數據庫,多個用逗號隔開。
–tables= :指定執行同步的表,多個用逗號隔開。
–sync-to-master :指定一個DSN,即從的IP,他會通過show processlist或show slave status 去自動的找主。
h=127.0.0.1 :服務器地址,命令里有2個ip,第一次出現的是M的地址,第2次是Slave的地址。
u=root :帳號。
p=123456 :密碼。
–print :打印,但不執行命令。
–execute :執行命令。
執行數據修復:
pt-table-sync –execute –replicate=test_checksum.checksums h=172.16.10.53,u=checksums,p=checksums,P=3306 h=172.16.10.55,u=checksums,p=checksums,P=3306
此時,再檢測主從數據一致性,發現主從數據已經一致了:
[root@mysql-master1 ~]# pt-table-checksum h=’172.16.10.53′,u=’checksums’,p=’checksums’,P=3306 -d test_0109 \
–nocheck-replication-filters –replicate=test_checksum.checksums –nocheck-binlog-format –nocheck-plan –recursion-method=hosts TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE 01-12T14:54:16 0 0 0 1 0 0.018 test_0109.broker 01-12T14:54:16 0 0 4 1 0 0.008 test_0109.check_conistent 01-12T14:54:16 0 0 0 1 0 0.008 test_0109.partner_alert_rule 01-12T14:54:16 0 0 0 1 0 0.016 test_0109.proc_test 01-12T14:54:16 0 0 529 1 0 0.273 test_0109.project
附:
以下錯誤處理方式:
(1).要是表中沒有唯一索引或則主鍵則會報錯:
Can’t make changes on the master because no unique index exists at /usr/local/bin/pt-table-sync line 10591.
(2).要是從庫有的數據,而主庫沒有,那這個數據怎么處理?
會給出刪除SLAVE多余數據,和修復SLAVE缺失數據的SQL語句。
(3).該工具執行檢查表動作,檢查連接的帳號需要有很高的權限,在一般權限上需要加SELECT, PROCESS, SUPER, REPLICATION SLAVE等權限。
pt-table-checksm 配合pt-table-sync使用,在執行pt-table-sync數據同步之前,一定要執行pt-table-checksm命令檢查。
(4).手動執行pt-table-checksum時會出現Diffs cannot be detected because no slaves were found. Please read the –recursion-method documentation for information.
從字面意思上看是,主庫找不到從數據庫。只需要在從庫配置文件/具體目錄/my.cnf中添加
report_host=slave_ip
report_port=slave_port
即可。
也可以在pt-table-checksum –recursion-method=hosts
默認是通過show processlist 找到host的值或show slave hosts 找到host的值。
【3.3】我的實踐
(1)檢查同步
在主庫/從庫都可以運行
pt-table-checksum --nocheck-replication-filters --replicate=test.checksum --databases=test h=127.0.0.1,u=root,p=123456,P=3306 --no-check-binlog-format
#pt-table-checksum --nocheck-replication-filters --replicate=test.checksum --databases=test h='主庫IP',u='root',p='123456',P=3306 --no-check-binlog-format --recursion-method=processlist
(2)構造問題
在從庫插入一條數據。因為之前插入了一條數據ID為5,但刪除掉了,所以這里再插入一條數據,id自動變成了6
主庫數據如下:
(3)再次檢查
發現已經有誤差了。
(4)使用 pt-table-sync 修復
左邊的h 是主庫,右邊的 h 是從庫
pt-table-sync --print --replicate=test.checksum h=127.0.0.1,u=root,p=123456,P=3306 h=192.168.1.201,u=root,p=123456,P=3306
Errors in command-line arguments: 必須要有以下3個選項其中一個,否則會報錯。
* Specify at least one of --print, --execute or --dry-run
這里使用了 --print ,所以會自動打印出來,因為我們這里是,從庫比主庫數據多。
所以這里給出的是刪除從庫多余數據的SQL;
然后執行后,解決
pt-table-sync --execute --replicate=test.checksum h=127.0.0.1,u=root,p=123456,P=3306 h=192.168.1.201,u=root,p=123456,P=3306
【4】percona-toolkit工具包下的所有工具
【4.1】官網文檔
官網說明參考:https://www.percona.com/doc/percona-toolkit/LATEST/index.html
【4.2】主要工具介紹
如果是非源碼安裝或源碼安裝是未指定路徑,缺省情況下所有的pt相關的工具位於/usr/bin目錄下,以pt-開頭。
獲取有關命令行的幫助信息,直接在shell提示符下輸入命令行與--hlep即可。如: /usr/bin/pt-upgrade --help
# ls -hltr /usr/bin/pt-*
pt-upgrade
#該命令主要用於對比不同mysql版本下SQL執行的差異,通常用於升級前進行對比。
#會生成SQL文件或單獨的SQL語句在每個服務器上執行的結果、錯誤和警告信息等。
pt-online-schema-change
#功能為支持在線變更表構,且不鎖定原表,不阻塞原表的DML操作。
#該特性與Oracle的dbms_redefinition在線重定義表原理基本類似。
pt-mysql-summary
#對連接的mysql服務器生成一份詳細的配置情況以及sataus信息
#在尾部也提供當前實例的的配置文件的信息
pt-mext
#並行查看SHOW GLOBAL STATUS的多個樣本的信息。
#pt-mext會執行你指定的COMMAND,並每次讀取一行結果,把空行分割的內容保存到一個一個的臨時文件中,最后結合這些臨時文件並行查看結果。
pt-kill
#Kill掉符合指定條件mysql語句
pt-ioprofile
#pt-ioprofile的原理是對某個pid附加一個strace進程進行IO分析
pt-fingerprint
#用於生成查詢指紋。主要將將sql查詢生成queryID,pt-query-digest中的ID即是通過此工具來完成的。
#類似於Oracle中的SQL_ID,涉及綁定變量,字面量等
pt-find
#用與查找mysql表並執行指定的命令,類似於find命令
pt-fifo-split
#模擬切割文件並通過管道傳遞給先入先出隊列而不用真正的切割文件
pt-deadlock-logger
#用於監控mysql服務器上死鎖並輸出到日志文件,日志包含發生死鎖的時間、死鎖線程id、死鎖的事務id、發生死鎖時事務執行時間等詳細信息。
pt-archiver
#將mysql數據庫中表的記錄歸檔到另外一個表或者文件
#該工具具只是歸檔舊的數據,對線上數據的OLTP查詢幾乎沒有影響。
#可以將數據插入另外一台服務器的其他表中,也可以寫入到一個文件中,方便使用load data infile命令導入數據。
pt-agent
#基於Percona Cloud的一個客戶端代理工具
pt-visual-explain
#用於格式化explain的輸出
pt-variable-advisor
#用於分析mysql系統變量可能存在的一些問題,可以據此評估有關參數的設置正確與否。
pt-stalk
#用於收集mysql數據庫故障時的相關信息便於后續診斷處理。
pt-slave-delay
#用於設定從服務器落后於主服務器的時間間隔。
#該命令行通過啟動和停止復制sql線程來設置從落后於主指定時間。
pt-sift
#用於瀏覽pt-stalk生成的文件。
pt-show-grants
#將當前實例的用戶權限全部輸出,可以用於遷移數據庫過程中重建用戶。
pt-query-digest
#用於分析mysql服務器的慢查詢日志,並格式化輸出以便於查看和分析。
pt-pmp
#為查詢程序執行聚合的GDB堆棧跟蹤,先進性堆棧跟蹤,然后將跟蹤信息匯總。
pt-index-usage
#從log文件中讀取查詢語句,並用分析當前索引如何被使用。
#完成分析之后會生成一份關於索引沒有被查詢使用過的報告,可以用於分析報告考慮剔除無用的索引。
pt-heartbeat
#用於監控mysql復制架構的延遲。
#主要是通過在主庫上的--update線程持續更新指定表上的一個時間戳,從庫上--monitor線程或者--check線程檢查主庫更新的時間戳並與當前系統時間對比,得到延遲值。
pt-fk-error-logger
#將外鍵相關的錯誤信息記錄到日志或表。
pt-duplicate-key-checker
#功能為從mysql表中找出重復的索引和外鍵,這個工具會將重復的索引和外鍵都列出來
#同時也可以生成相應的drop index的語句
pt-diskstats
#類似於iostat,打印磁盤io統計信息,但是這個工具是交互式並且比iostat更詳細。可以分析從遠程機器收集的數據。
pt-config-diff
#用於比較mysql配置文件和服務器變量
#至少2個配置源需要指定,可以用於遷移或升級前后配置文件進行對比
pt-align
#格式化輸出
pt-slave-find
#連接mysql主服務器並查找其所有的從,然后打印出所有從服務器的層級關系。
pt-table-checksum
#用於校驗mysql復制的一致性。
#該工具主要是高效的查找數據差異,如果存在差異性,可以通過pt-table-sync來解決。
#用戶慢查詢分析
#根據執行時間,鎖時間,執行次數,等等綜合分析