Percona Toolkit(原 Maatkit/Aspersa)是 MySQL 運維必備的高級命令行工具集,涵蓋開發、性能、配置、監控、復制、系統六大類。本文聚焦五大高頻工具:pt-duplicate-key-checker、pt-online-schema-change、pt-query-advisor、pt-show-grants、pt-upgrade,從原理到實戰示例全方位解析。
# 下載 RPM 包 wget https://www.percona.com/redir/downloads/percona-toolkit/2.1.1/percona-toolkit-2.1.1-1.noarch.rpm wget https://pkgs.repoforge.org/perl-TermReadKey/perl-TermReadKey-2.30-1.el5.rf.x86_64.rpm # 安裝依賴與主包 rpm -ivh perl-TermReadKey-2.30-1.el5.rf.x86_64.rpm rpm -ivh percona-toolkit-2.1.1-1.noarch.rpm
源碼編譯安裝同樣適用:perl Makefile.PL && make && make test && make install。
功能:掃描表結構,列出冗余索引與外鍵,自動生成 DROP INDEX 語句。
pt-duplicate-key-checker --host=localhost --user=root --password=zhang@123 --databases=test
原理:建影子表 → 修改結構 → 建觸發器同步增量 → 分塊拷貝數據 → 切換表名 → 清理。全程不阻塞讀寫,前提:表無觸發器。
關鍵參數:--dry-run 只建表不拷貝;--execute 真實執行(必加,否則退出)。
# 在線修改引擎為 InnoDB pt-online-schema-change --user=root --password=zhang@123 --host=localhost --lock-wait-time=120 --alter="ENGINE=InnoDB" D=test,t=oss_pvinfo2 --execute # 在線添加字段 pt-online-schema-change --user=root --password=zhang@123 --host=localhost --lock-wait-time=120 --alter="ADD COLUMN domain_id INT" D=test,t=oss_pvinfo2 --execute
功能:基於預定義規則集(官方文檔)分析慢查詢/General Log/TCPdump 抓包的 SQL,輸出優化建議。注意:大日志文件可能觸發性能問題/死循環。
# 分析單條 SQL pt-query-advisor --query "select * from aaa" # 分析 General Log pt-query-advisor /data/dbdata/general.log # 分析慢查詢 pt-query-advisor /data/dbdata/localhost-slow.log
# 導出所有用戶權限 pt-show-grants --host=localhost --user=root --password=zhang@123 # 導出指定庫權限 pt-show-grants --host=localhost --user=root --password=zhang@123 --database=hostsops # 生成 REVOKE 語句 pt-show-grants --host=localhost --user=root --password=zhang@123 --revoke
場景:MySQL 升級前,對比新舊實例執行結果差異(結果集、錯誤、警告、耗時)。
# 對比單條 SQL pt-upgrade h=localhost h=192.168.3.92 --user=root --password=zhang@123 --query="select * from user_data.collect_data limit 5" # 對比文件中所有 SQL pt-upgrade h=localhost h=192.168.3.92 --user=root --password=zhang@123 aaa.sql # 對比慢查詢文件 pt-upgrade h=localhost h=192.168.3.92 --user=root --password=zhang@123 slow.log # 僅對比執行時間 pt-upgrade h=192.168.3.91 h=192.168.3.92 --user=root --password=zhang@123 --query="select * from user_data.collect_data" --compare query_times