作者 | 吳守陽
審校 | 重樓
介紹
Percona Toolkit是一套專業的MySQL和MariaDB數據庫管理工具,涵蓋了從性能優化到數據同步和備份恢復的多個方面。本文將深入探討Percona Toolkit工具集的核心功能和使用場景,幫助你更好地理解和利用這些強大的數據庫工具。
主要功能和用途
性能優化和分析:
- 使用pt-query-digest分析慢查詢,優化數據庫性能。
- 使用pt-index-usage檢查和優化索引的使用情況。
數據歸檔:
- 使用pt-archiver歸檔和清理歷史數據。
數據同步和比較:
- 使用pt-table-checksum檢查表之間的數據一致性。
- 使用pt-table-sync在數據庫服務器之間同步表數據。
Schema變更:
- 使用pt-online-schema-change在線執行表結構更改,避免表鎖定問題。
實用工具:
- 使用pt-config-diff比較MySQL配置文件的不同之處。
- 使用pt-mysql-summary生成MySQL服務器的摘要信息,方便日常管理和監控。
Percona Toolkit工具
1.pt-align
作用:對齊查詢輸出,方便人們閱讀和分析。
示例:
echo -e "col1 col2\nval1 val2" | pt-align
2.pt-archiver
作用:從MySQL表中歸檔舊數據,以保持表的高性能。
參數:
--limit10000 每次取1000行數據用pt-archive處理
--txn-size 1000 設置1000行為一個事務提交一次
--where‘id<3000‘ 設置操作條件
--progress5000 每處理5000行輸出一次處理信息
--statistics 輸出執行過程及最后的操作統計。(只要不加上--quiet,默認情況下pt-archive都會輸出執行過程的)
--charset=UTF8 指定字符集為UTF8
--bulk-delete 批量刪除source上的舊數據(例如每次1000行的批量刪除操作)
--bulk-insert 批量插入數據到dest主機 (看dest的general log發現它是通過在dest主機上LOAD DATA LOCAL INFILE插入數據的)
--replace 將insert into 語句改成replace寫入到dest庫
--sleep120 每次歸檔了limit個行記錄后的休眠120秒(單位為秒)
--file‘/root/test.txt‘
--purge 刪除source數據庫的相關匹配記錄
--header 輸入列名稱到首行(和--file一起使用)
--no-check-charset 不指定字符集
--check-columns 檢驗dest和source的表結構是否一致,不一致自動拒絕執行(不加這個參數也行。默認就是執行檢查的)
--no-check-columns 不檢驗dest和source的表結構是否一致,不一致也執行(會導致dest上的無法與source匹配的列值被置為null或者0)
--chekc-interval 默認1s檢查一次
--local 不把optimize或analyze操作寫入到binlog里面(防止造成主從延遲巨大)
--retries 超時或者出現死鎖的話,pt-archiver進行重試的間隔(默認1s)
--no-version-check 目前為止,發現部分pt工具對阿里云RDS操作必須加這個參數
--analyze=ds 操作結束后,優化表空間(d表示dest,s表示source)
--no-delete 表示不刪除原來的數據,注意:如果不指定此參數,所有處理完成后,都會清理原表中的數據
示例:
- 將表中小于2018-07-01時間的數據進行歸檔,不刪除原表記錄pt-archiver --source h=192.168.153.148,P=3306,u=mss,p=mss,D=d1,t=t4 --dest h=192.168.153.148,P=3306,u=mss,p=mss,D=d1,t=t5 --no-check-charset --where 'day<"2018-07-01"' --progress 5000 --no-delete --limit=10000 --statistics
- 將表中小于2018-07-01時間的數據進行歸檔,刪除原表記錄,優化表空間(因為這種操作費時間,并且需要你提前預估有足夠的磁盤空間用于拷貝表)pt-archiver --source h=192.168.153.148,P=3306,u=mss,p=mss,D=d1,t=t4 --dest h=192.168.153.148,P=3306,u=mss,p=mss,D=d1,t=t5 --no-check-charset --where 'day<"2018-07-01"' --progress 5000 --purge --check-columns --analyze=ds --limit=10000 --statistics
- 用于把數據導出文件,不用刪除原表中數據 pt-archiver --source h=192.168.153.148,P=3306,u=mss,p=mss,D=d1,t=t4 --no-check-charset --where 'day<"2018-06-01"' --progress 4000 --no-delete --file "/tmp/pt-archiver.dat" --header --limit=10000
- 將表中小于2018-07-01時間的數據進行歸檔,每10000條一次刪除原表記錄pt-archiver --source h=192.168.153.148,P=3306,u=mss,p=mss,D=d1,t=t4 --dest h=192.168.153.148,P=3306,u=mss,p=mss,D=d1,t=t5 --no-check-charset --where 'day<"2018-07-01"' --progress 5000 --bulk-delete --limit=10000 --statistics
- 將表中6個月前的數據歸檔pt-archiver --source h=host,D=db,t=table --dest h=host,D=db,t=archive_table --where "created < NOW() - INTERVAL 6 MONTH"
3.pt-config-diff
作用:比較兩個MySQL配置文件并顯示差異。
示例:
pt-config-diff /etc/my.cnf /etc/mysql/my.cnf
4.pt-deadlock-logger
作用:記錄MySQL中的死鎖事件。
參數:
--ask-pass Prompt for a password when connecting to MySQL
--charset=s -A Default character set
--clear-deadlocks=s Use this table to create a small deadlock
--columns=A The columns are: (default server, ts, thread, txn_id,
txn_time, user, hostname, ip, db, tbl, idx, lock_type,
lock_mode, wait_hold, victim, query)
--config=A Read this comma-separated list of config files; if
specified, this must be the first option on the command
line
--create-dest-table Create the table specified by --dest
--daemonize Fork to the background and detach from the shell
--database=s -D Connect to this database
--defaults-file=s -F Only read mysql options from the given file
--dest=d DSN for where to store deadlocks; specify at least a
database (D) and table (t)
--help Show help and exit
--host=s -h Connect to host
--interval=m How often to check for deadlocks (default 30).
Optional suffix s=seconds, m=minutes, h=hours, d=days;
if no suffix, s is used.
--iterations=i How many times to check for deadlocks
--log=s Print all output to this file when daemonized
--numeric-ip Express IP addresses as integers
--password=s -p Password to use when connecting
--pid=s Create the given PID file
--port=i -P Port number to use for connection
--quiet Do not deadlocks; only print errors and warnings to
STDERR
--run-time=m How long to run before exiting. Optional suffix s=
seconds, m=minutes, h=hours, d=days; if no suffix, s is
used.
--set-vars=A Set the MySQL variables in this comma-separated list of
variable=value pairs
--socket=s -S Socket file to use for connection
--tab Use tabs to separate columns instead of spaces
--user=s -u User for login if not current user
--version Show version and exit
--[no]version-check Check for the latest version of Percona Toolkit, MySQL,
and other programs (default yes)
示例:
pt-deadlock-logger h=host1 --iterations 1
pt-deadlock-logger --user=username --password=password
pt-deadlock-logger h=host1 --dest h=host2,D=percona_schema,t=deadlocks
5.pt-diskstats
作用:收集和顯示磁盤I/O統計信息。
示例:
pt-diskstats --devices sda,sdb --interval 1
6.pt-duplicate-key-checker
作用:查找和報告重復的MySQL索引。
參數:
Options:
--all-structs Compare indexes with different structs (BTREE, HASH,
etc)
--ask-pass Prompt for a password when connecting to MySQL
--charset=s -A Default character set
--[no]clustered PK columns appended to secondary key is duplicate (
default yes)
--config=A Read this comma-separated list of config files; if
specified, this must be the first option on the command
line
--databases=h -d Check only this comma-separated list of databases
--defaults-file=s -F Only read mysql options from the given file
--engines=h -e Check only tables whose storage engine is in this comma-
separated list
--help Show help and exit
--host=s -h Connect to host
--ignore-databases=H Ignore this comma-separated list of databases
--ignore-engines=H Ignore this comma-separated list of storage engines
--ignore-order Ignore index order so KEY(a,b) duplicates KEY(b,a)
--ignore-tables=H Ignore this comma-separated list of tables
--key-types=s Check for duplicate f=foreign keys, k=keys or fk=both (
default fk)
--password=s -p Password to use when connecting
--pid=s Create the given PID file
--port=i -P Port number to use for connection
--set-vars=A Set the MySQL variables in this comma-separated list of
variable=value pairs
--socket=s -S Socket file to use for connection
--[no]sql Print DROP KEY statement for each duplicate key (
default yes)
--[no]summary Print summary of indexes at end of output (default yes)
--tables=h -t Check only this comma-separated list of tables
--user=s -u User for login if not current user
--verbose -v Output all keys and/or foreign keys found, not just
redundant ones
--version Show version and exit
--[no]version-check Check for the latest version of Percona Toolkit, MySQL,
and other programs (default yes)
示例:
pt-duplicate-key-checker --user=username --password=password
7.pt-fifo-split
作用:將輸入文件分割成多個文件,并按FIFO順序處理。
示例:
pt-fifo-split --lines 1000 input.txt
8.pt-find
作用:查找和列出符合條件的MySQL表。
示例:
pt-find --user=username --password=password --database=db --engine=InnoDB
9.pt-fingerprint
作用:將SQL查詢規范化為指紋形式,以便對類似查詢進行分組和統計。
參數:
--match-embedded-numbers Match numbers embedded in words and replace as
single values
--match-md5-checksums Match MD5 checksums and replace as single values
--query=s The query to convert into a fingerprint
示例:
pt-fingerprint --query="SELECT * FROM users WHERE id = 123 AND username = 'johndoe';"
輸出:SELECT * FROM users WHERE id = ? AND username = ?;
10.pt-fk-error-logger
作用:記錄MySQL中的外鍵錯誤。
示例:
pt-fk-error-logger --user=username --password=password
11.pt-galera-log-explainer
作用:分析和解釋Galera Cluster的日志文件。
示例:
pt-galera-log-explainer --file /path/to/galera.log
12.pt-heartbeat
作用:監控和報告MySQL復制延遲。
示例:
pt-heartbeat --update --database=test --table=heartbeat --interval=1 --user=username --password=password
13.pt-index-usage
作用:分析和報告MySQL表的索引使用情況。
參數:
--ask-pass 連接到 MySQL 時提示輸入密碼
--charset=s -A 默認字符集
--config=A 讀取這個逗號分隔的配置文件列表;如果指定此選項,它必須是命令行上的第一個選項
--create-save-results-database 如果 --save-results-database 不存在,則創建它
--[no]create-views 為 --save-results-database 示例查詢創建視圖
--database=s -D 連接到的數據庫
--databases=h -d 只從這個逗號分隔的數據庫列表中獲取表和索引
--databases-regex=s 只從名稱匹配這個 Perl 正則表達式的數據庫中獲取表和索引
--defaults-file=s -F 只從指定的文件中讀取 MySQL 選項
--drop=H 僅建議刪除這些類型的未使用索引(默認非唯一)
--empty-save-results-tables 刪除并重新創建 --save-results-database 中所有已存在的表
--help 顯示幫助信息并退出
--host=s -h 連接到的主機
--ignore-databases=H 忽略這個逗號分隔的數據庫列表
--ignore-databases-regex=s 忽略名稱匹配這個 Perl 正則表達式的數據庫
--ignore-tables=H 忽略這個逗號分隔的表名列表
--ignore-tables-regex=s 忽略名稱匹配這個 Perl 正則表達式的表
--password=s -p 連接時使用的密碼
--port=i -P 連接使用的端口號
--progress=a 將進度報告打印到 STDERR(默認 time,30)
--quiet -q 不打印任何警告
--[no]report 打印 --report-format 的報告(默認是)
--report-format=A 目前只有一個報告:drop_unused_indexes(默認 drop_unused_indexes)
--save-results-database=d 將結果保存到這個數據庫的表中
--set-vars=A 在這個逗號分隔的變量=值列表中設置 MySQL 變量
--socket=s -S 連接使用的套接字文件
--tables=h -t 只從這個逗號分隔的表列表中獲取索引
--tables-regex=s 只從名稱匹配這個 Perl 正則表達式的表中獲取索引
--user=s -u 登錄時使用的用戶,如果不是當前用戶
--version 顯示版本信息并退出
--[no]version-check 檢查 Percona Toolkit、MySQL 和其他程序的最新版本(默認是)
示例:
pt-index-usage --user=username --password=password --database=db slow.log
14.pt-ioprofile
作用:記錄并顯示進程的I/O活動。
示例:
pt-ioprofile --pid 1234
15.pt-k8s-debug-collector
作用:收集Kubernetes集群的調試信息。
參數:
--ask-pass 連接到 MySQL 時提示輸入密碼
--charset=s -A 默認字符集
--config=A 讀取這個逗號分隔的配置文件列表;如果指定此選項,它必須是命令行上的第一個選項
--create-save-results-database 如果 --save-results-database 不存在,則創建它
--[no]create-views 為 --save-results-database 示例查詢創建視圖
--database=s -D 連接到的數據庫
--databases=h -d 只從這個逗號分隔的數據庫列表中獲取表和索引
--databases-regex=s 只從名稱匹配這個 Perl 正則表達式的數據庫中獲取表和索引
--defaults-file=s -F 只從指定的文件中讀取 MySQL 選項
--drop=H 僅建議刪除這些類型的未使用索引(默認非唯一)
--empty-save-results-tables 刪除并重新創建 --save-results-database 中所有已存在的表
--help 顯示幫助信息并退出
--host=s -h 連接到的主機
--ignore-databases=H 忽略這個逗號分隔的數據庫列表
--ignore-databases-regex=s 忽略名稱匹配這個 Perl 正則表達式的數據庫
--ignore-tables=H 忽略這個逗號分隔的表名列表
--ignore-tables-regex=s 忽略名稱匹配這個 Perl 正則表達式的表
--password=s -p 連接時使用的密碼
--port=i -P 連接使用的端口號
--progress=a 將進度報告打印到 STDERR(默認 time,30)
--quiet -q 不打印任何警告
--[no]report 打印 --report-format 的報告(默認是)
--report-format=A 目前只有一個報告:drop_unused_indexes(默認 drop_unused_indexes)
--save-results-database=d 將結果保存到這個數據庫的表中
--set-vars=A 在這個逗號分隔的變量=值列表中設置 MySQL 變量
--socket=s -S 連接使用的套接字文件
--tables=h -t 只從這個逗號分隔的表列表中獲取索引
--tables-regex=s 只從名稱匹配這個 Perl 正則表達式的表中獲取索引
--user=s -u 登錄時使用的用戶,如果不是當前用戶
--version 顯示版本信息并退出
--[no]version-check 檢查 Percona Toolkit、MySQL 和其他程序的最新版本(默認是)
示例:
pt-k8s-debug-collector --namespace default
16.pt-kill
作用:查找并終止符合條件的MySQL會話。
參數:
- `--ask-pass` 連接到MySQL時提示輸入密碼
- `--charset=s -A` 默認字符集
- `--config=A` 讀取這個以逗號分隔的配置文件列表;如果指定,這必須是命令行上的第一個選項
- `--create-log-table` 如果不存在,創建--log-dsn表
- `--daemonize` 后臺運行并從shell分離
- `--database=s -D` 用于連接的數據庫
- `--defaults-file=s -F` 僅從指定文件讀取MySQL選項
- `--filter=s` 丟棄該Perl代碼未返回true的事件
- `--group-by=s` 將匹配應用于按此SHOW PROCESSLIST列分組的每類查詢
- `--help` 顯示幫助并退出
- `--host=s -h` 連接到主機(默認localhost)
- `--interval=m` 檢查要殺死的查詢的頻率。可選后綴s=秒,m=分鐘,h=小時,d=天;如果沒有后綴,則使用s
- `--json` 以JSON格式打印已殺死的查詢,必須與--print一起使用
- `--json-fields=s` 指定在使用--json時要包含在JSON輸出中的額外鍵值對列表,參數值的格式必須為:
- `--kill-busy-commands=s` 組:操作(默認Query)
- `--log=s` 在后臺運行時將所有輸出打印到該文件
- `--log-dsn=d` 將每個被殺死的查詢存儲在此DSN中
- `--password=s -p` 連接時使用的密碼
- `--pid=s` 創建給定的PID文件
- `--port=i -P` 用于連接的端口號
- `--query-id` 打印剛被殺死的查詢的ID
- `--rds` 表示問題實例位于Amazon RDS上
- `--run-time=m` 運行多長時間后退出。可選后綴s=秒,m=分鐘,h=小時,d=天;如果沒有后綴,則使用s
- `--sentinel=s` 如果此文件存在則退出(默認/tmp/pt-kill-sentinel)
- `--set-vars=A` 在這個以逗號分隔的變量=值對列表中設置MySQL變量
- `--slave-password=s` 設置用于連接從庫的密碼
- `--slave-user=s` 設置用于連接從庫的用戶
- `--socket=s -S` 用于連接的套接字文件
- `--stop` 通過創建--sentinel文件停止運行實例
- `--[no]strip-comments` 從PROCESSLIST的Info列中移除SQL注釋(默認yes)
- `--user=s -u` 登錄用戶(如果不是當前用戶)
- `--verbose -v` 打印正在執行的操作信息到STDOUT
- `--version` 顯示版本并退出
- `--[no]version-check` 檢查Percona Toolkit、MySQL和其他程序的最新版本(默認yes)
- `--victims=s` 每類匹配的查詢中將被殺死的查詢(默認oldest)
- `--wait-after-kill=m` 殺死一個查詢后等待,然后再查找更多要殺死的查詢。可選后綴s=秒,m=分鐘,h=小時,d=天;如果沒有后綴,則使用s
- `--wait-before-kill=m` 殺死一個查詢前等待。可選后綴s=秒,m=分鐘,h=小時,d=天;如果沒有后綴,則使用s
操作:
- `--execute-command=s` 當查詢匹配時執行此命令
- `--fingerprint` 修改--print行為,強制顯示查詢指紋而不是原始查詢
- `--kill` 殺死匹配查詢的連接
- `--kill-query` 殺死匹配查詢
- `--print` 打印匹配查詢的KILL語句;不實際殺死查詢
類匹配:
- `--any-busy-time=m` 如果任何查詢運行時間超過此時間,則匹配查詢類。“超過”意味著如果您指定10秒,例如,只有在至少有一個查詢運行時間超過10秒時,類才會匹配。可選后綴s=秒,m=分鐘,h=小時,d=天;如果沒有后綴,則使用s
- `--each-busy-time=m` 如果每個查詢運行時間超過此時間,則匹配查詢類。“超過”意味著如果您指定10秒,例如,只有當每個查詢運行時間超過10秒時,類才會匹配。可選后綴s=秒,m=分鐘,h=小時,d=天;如果沒有后綴,則使用s
- `--query-count=i` 如果類中至少有這么多查詢,則匹配查詢類
查詢匹配:
- `--busy-time=m` 匹配運行時間超過此時間的查詢。可選后綴s=秒,m=分鐘,h=小時,d=天;如果沒有后綴,則使用s
- `--idle-time=m` 匹配空閑/睡眠時間超過此時間的查詢。可選后綴s=秒,m=分鐘,h=小時,d=天;如果沒有后綴,則使用s
- `--ignore-command=s` 忽略Command匹配此Perl正則表達式的查詢
- `--ignore-db=s` 忽略db(數據庫)匹配此Perl正則表達式的查詢
- `--ignore-host=s` 忽略Host匹配此Perl正則表達式的查詢
- `--ignore-info=s` 忽略Info(查詢)匹配此Perl正則表達式的查詢
- `--[no]ignore-self` 不要殺死pt-kill自己的連接(默認yes)
- `--ignore-state=s` 忽略State匹配此Perl正則表達式的查詢(默認Locked)
- `--ignore-user=s` 忽略User匹配此Perl正則表達式的查詢
- `--match-all` 匹配所有未被忽略的查詢
- `--match-command=s` 僅匹配Command匹配此Perl正則表達式的查詢
- `--match-db=s` 僅匹配db(數據庫)匹配此Perl正則表達式的查詢
- `--match-host=s` 僅匹配Host匹配此Perl正則表達式的查詢
- `--match-info=s` 僅匹配Info(查詢)匹配此Perl正則表達式的查詢
- `--match-state=s` 僅匹配State匹配此Perl正則表達式的查詢
- `--match-user=s` 僅匹配User匹配此Perl正則表達式的查詢
- `--replication-threads` 允許匹配和殺死復制線程
- `--test-matching=a` 包含PROCESSLIST快照的文件,以測試匹配選項
示例:
pt-kill --busy-time 60 --user=username --password=password
17.pt-mext
作用:擴展Percona Toolkit的功能,通過加載外部模塊。
示例:
pt-mext /path/to/module.pm
18.pt-mongodb-index-check
作用:檢查MongoDB中的索引并報告不必要的索引。
參數:
- `-h, --help` 顯示上下文相關的幫助信息
- `--version` 顯示版本信息
- `--all-databases` 檢查所有數據庫(不包括系統數據庫)
- `--databases=DATABASES,...` 要檢查的數據庫列表,用逗號分隔
- `--all-collections` 檢查選定數據庫中的所有集合
- `--collections=COLLECTIONS,...` 要檢查的集合列表,用逗號分隔
- `--mongodb.uri=mongodb://host:port/admindb?options` 連接URI
- `--json` 以JSON格式顯示輸出
示例:
pt-mongodb-index-check --uri mongodb://localhost:27017
19.pt-mongodb-query-digest
作用:分析和報告MongoDB查詢日志。
示例:
pt-mongodb-query-digest /path/to/mongodb.log
20.pt-mongodb-summary
作用:提供MongoDB服務器的摘要信息。
示例:
pt-mongodb-summary --uri mongodb://localhost:27017
21.pt-mysql-summary
作用:提供MySQL服務器的摘要信息。
示例:
pt-mysql-summary --user=username --password=password
22.pt-online-schema-change
作用:在線修改MySQL表的結構,而不會造成服務中斷。
參數:
- `--alter=s` 進行架構修改,不包括 ALTER TABLE 關鍵字
- `--alter-foreign-keys-method=s` 修改外鍵引用新表的方法
- `--[no]analyze-before-swap` 在交換新舊表之前對新表執行 ANALYZE TABLE(默認是)
- `--ask-pass` 連接 MySQL 時提示輸入密碼
- `--channel=s` 使用復制通道連接服務器時使用的通道名稱
- `--charset=s, -A` 默認字符集
- `--[no]check-alter` 解析指定的 --alter 并嘗試警告可能的意外行為(默認是)
- `--[no]check-foreign-keys` 檢查自引用外鍵(默認是)
- `--check-interval=m` 檢查 --max-lag 之間的休眠時間(默認 1),可選后綴 s=秒,m=分鐘,h=小時,d=天;如果沒有后綴,則使用 s
- `--[no]check-plan` 檢查查詢執行計劃的安全性(默認是)
- `--[no]check-replication-filters` 如果在任何服務器上設置了任何復制過濾器,則中止(默認是)
- `--check-slave-lag=s` 暫停數據復制,直到此副本的延遲小于 --max-lag
- `--[no]check-unique-key-change` 如果 --alter 指定的語句嘗試添加唯一索引,則避免 pt-online-schema-change 運行(默認是)
- `--chunk-index=s` 為塊表選擇優先的索引
- `--chunk-index-columns=i` 使用 --chunk-index 的最多左列數
- `--chunk-size=z` 每個復制塊選擇的行數(默認 1000)
- `--chunk-size-limit=f` 不要復制比期望塊大小大很多的塊(默認 4.0)
- `--chunk-time=f` 動態調整塊大小,以便每個數據復制查詢執行時間為該值(默認 0.5)
- `--config=A` 讀取此逗號分隔的配置文件列表;如果指定,則必須是命令行上的第一個選項
- `--critical-load=A` 在每個塊之后檢查 SHOW GLOBAL STATUS,并在負載過高時中止(默認 Threads_running=50)
- `--data-dir=s` 使用 DATA DIRECTORY 特性在不同分區上創建新表
- `--database=s, -D` 連接到此數據庫
- `--default-engine` 從新表中刪除 ENGINE
- `--defaults-file=s, -F` 僅從給定文件讀取 MySQL 選項
- `--[no]drop-new-table` 如果復制原始表失敗,則刪除新表(默認是)
- `--[no]drop-old-table` 重命名原始表后刪除它(默認是)
- `--[no]drop-triggers` 刪除舊表上的觸發器。--no-drop-triggers 強制 --no-drop-old-table(默認是)
- `--dry-run` 創建并修改新表,但不創建觸發器、復制數據或替換原始表
- `--execute` 表明您已閱讀文檔并希望修改表
- `--[no]fail-on-stopped-replication` 如果復制停止,則失敗并顯示錯誤(退出狀態 128),而不是等待復制重新啟動(默認是)
- `--force` 如果使用 alter-foreign-keys-method=none 可能會破壞外鍵約束,此選項將繞過確認
- `--help` 顯示幫助并退出
- `--host=s, -h` 連接到主機
- `--max-flow-ctl=f` 類似于 --max-lag 但用于 PXC 集群
- `--max-lag=m` 暫停數據復制,直到所有副本的延遲小于此值(默認 1s)。可選后綴 s=秒,m=分鐘,h=小時,d=天;如果沒有后綴,則使用 s
- `--max-load=A` 在每個塊之后檢查 SHOW GLOBAL STATUS,并在任何狀態變量超過其閾值時暫停(默認 Threads_running=25)
- `--new-table-name=s` 在交換前的新表名稱。%T 替換為原始表名稱(默認 %T_new)
- `--null-to-not-null` 允許將允許 NULL 值的列修改為不允許 NULL 值的列
- `--only-same-schema-fks` 僅檢查與原始表位于同一模式的外鍵
- `--password=s, -p` 連接時使用的密碼
- `--pause-file=s` 當指定的文件存在時,執行將暫停
- `--pid=s` 創建給定的 PID 文件
- `--plugin=s` 定義 pt_online_schema_change_plugin 類的 Perl 模塊文件
- `--port=i, -P` 使用的連接端口號
- `--preserve-triggers` 保留舊觸發器
- `--print` 將 SQL 語句打印到 STDOUT
- `--progress=a` 復制行時將進度報告打印到 STDERR(默認 time,30)
- `--quiet, -q` 不打印消息到 STDOUT(禁用 --progress)
- `--recurse=i` 發現副本時遞歸的層次數
- `--recursion-method=a` 發現副本的首選遞歸方法(默認 processlist,hosts)
- `--remove-data-dir` 如果原始表是使用 DATA DIRECTORY 特性創建的,則刪除它,并在 MySQL 默認目錄中創建新表而不創建新的 isl 文件(默認否)
- `--reverse-triggers` 警告!此選項在開始復制之前在新表上創建反向觸發器
- `--set-vars=A` 在此逗號分隔的變量=值對列表中設置 MySQL 變量
- `--skip-check-slave-lag=d` 檢查從庫延遲時跳過的 DSN
- `--slave-password=s` 設置連接從庫時使用的密碼
- `--slave-user=s` 設置連接從庫時使用的用戶
- `--sleep=f` 復制每個塊后休眠的時間(以秒為單位)(默認 0)
- `--socket=s, -S` 使用的連接套接字文件
- `--statistics` 打印內部計數器的統計信息
- `--[no]swap-tables` 交換原始表和新的修改表(默認是)
- `--tries=a` 嘗試關鍵操作的次數
- `--user=s, -u` 登錄用戶(如果不是當前用戶)
- `--version` 顯示版本并退出
- `--[no]version-check` 檢查 Percona Toolkit、MySQL 和其他程序的最新版本(默認是)
示例:
pt-online-schema-change --user=username --password=password --alter "ADD COLUMN new_col INT" D=db,t=table
23.pt-pg-summary
作用:提供PostgreSQL服務器的摘要信息。
示例:
pt-pg-summary
24.pt-pmp
作用:生成進程的MySQL性能剖析報告。
示例:
pt-pmp --pid 1234
25.pt-query-digest
作用:分析和匯總MySQL查詢日志,以找出慢查詢和高負載查詢。
參數:
--ask-pass 提示輸入連接到MySQL時的密碼
--attribute-aliases=a 屬性|別名列表,默認為 db|Schema
--attribute-value-limit=i 屬性值的合理限制,默認為 0
--charset=s -A 默認字符集
--config=A 讀取此逗號分隔的配置文件列表;如果指定,必須作為命令行的第一個選項
--[no]continue-on-error 即使出現錯誤也繼續解析,默認為 yes
--[no]create-history-table 如果不存在,則創建 --history 表,默認為 yes
--[no]create-review-table 如果不存在,則創建 --review 表,默認為 yes
--daemonize 后臺運行并從 shell 中分離出來
--database=s -D 連接到此數據庫
--defaults-file=s -F 僅從給定文件中讀取 MySQL 選項
--embedded-attributes=a 兩個 Perl 正則表達式模式,用于捕獲嵌入在查詢中的偽屬性
--expected-range=a 當條目多于或少于預期時解釋條目,默認為 5,10
--explain=d 使用此 DSN 運行對示例查詢的 EXPLAIN 并打印結果
--filter=s 丟棄此 Perl 代碼返回 false 的事件
--group-by=A 按此屬性的事件分組,默認為 fingerprint
--help 顯示幫助并退出
--history=d 保存每個查詢類的指標到指定表中
--host=s -h 連接到此主機
--ignore-attributes=a 不聚合這些屬性,默認為 arg, cmd, insert_id, ip, port, Thread_id, timestamp, exptime, flags, key, res, val, server_id, offset, end_log_pos, Xid
--inherit-attributes=a 如果丟失,則從最后一個擁有它們的事件繼承這些屬性,默認為 db,ts
--interval=f 查詢進程列表的輪詢頻率,單位為秒,默認為 0.1
--iterations=i 循環收集和報告的次數,默認為 1
--limit=A 限制輸出到給定的百分比或計數,默認為 95%:20
--log=s 當守護程序時將所有輸出打印到此文件
--max-hostname-length=i 在報告中截斷主機名到此長度,0=不截斷,默認為 10
--max-line-length=i 在報告中截斷行到此長度,0=不截斷,默認為 74
--order-by=A 按此屬性和聚合函數排序事件,默認為 Query_time:sum
--outliers=a 按屬性:百分位:計數報告異常值,默認為 Query_time:1:10
--output=s 如何格式化和打印查詢分析結果,默認為 report
--password=s -p 連接時使用的密碼
--pid=s 創建指定的 PID 文件
--port=i -P 連接使用的端口號
--preserve-embedded-numbers 在指紋查詢時保留數據庫/表名中的數字
--processlist=d 使用此 DSN 的進程列表輪詢查詢,默認間隔為 sleep
--progress=a 打印進度報告到 STDERR,默認為 time,30
--read-timeout=m 等待輸入事件的時間,默認為 0,可選的后綴 s=秒,m=分鐘,h=小時,d=天
--[no]report 打印每個 --group-by 屬性的查詢分析報告,默認為 yes
--report-all 報告所有查詢,甚至已經審查過的
--report-format=A 打印查詢分析報告的這些部分,默認為 rusage,date,hostname,files,header,profile,query_report,prepared
--report-histogram=s 繪制此屬性值的分布圖,默認為 Query_time
--resume=s 如果指定,工具將上次的文件偏移量寫入指定的文件名
--review=d 保存查詢類以供稍后審查,并不報告已經審查過的類
--run-time=m 每次迭代運行的時間,默認為時鐘,可選的后綴 s=秒,m=分鐘,h=小時,d=天
--run-time-mode=s 設置 --run-time 操作的值,默認為 clock
--sample=i 過濾每個查詢的前 N 個事件,默認為 0
--set-vars=A 設置這些 MySQL 變量的值,以逗號分隔的變量=值對
--show-all=H 顯示這些屬性的所有值
--since=s 解析此日期之后的查詢,默認為解析自此日期起的查詢
--slave-password=s 設置用于連接到從服務器的密碼
--slave-user=s 設置用于連接到從服務器的用戶
--socket=s -S 使用的連接套接字文件
--timeline 顯示事件的時間線
--type=A 解析的輸入類型,默認為 slowlog
--until=s 解析此日期之前的查詢,默認為解析直到此日期的查詢
--user=s -u 登錄時使用的用戶,如果不是當前用戶
--variations=A 報告這些屬性值的變化數量
--version 顯示版本并退出
--[no]version-check 檢查 Percona Toolkit、MySQL 和其他程序的最新版本,默認為 yes
--[no]vertical-format 在報告的 SQL 查詢中輸出一個尾隨 "\G",默認為 yes
--watch-server=s 告訴 pt-query-digest 解析 tcpdump 時觀察的服務器 IP 地址和端口(例如 "10.0.0.1:3306");忽略所有其他服務器
```
示例:
pt-query-digest /path/to/slow.log
26.pt-secure-collect
作用:收集和報告MySQL的安全信息。
示例:
pt-secure-collect --user=username --password=password
27.pt-show-grants
作用:顯示MySQL用戶的權限。
示例:
pt-show-grants --user=username --password=password
28.pt-sift
作用:收集和分析MySQL服務器的性能數據。
示例:
pt-sift --user=username --password=password
29.pt-slave-delay
作用:延遲MySQL復制以創建時間點恢復的機會。
示例:
pt-slave-delay --delay 1h --user=username --password=password
30.pt-slave-find
作用:查找MySQL復制拓撲中的所有從庫。
示例:
pt-slave-find --user=username --password=password
31.pt-slave-restart
作用:監控并自動重啟MySQL復制從庫。
示例:
pt-slave-restart --user=username --password=password
32.pt-stalk
作用:在檢測到MySQL服務器的問題時收集診斷數據。
示例:
pt-stalk --user=username --password=password
33.pt-summary
作用:提供MySQL服務器的摘要信息。
示例:
pt-summary
34.pt-table-checksum
作用:生成MySQL表的校驗和以檢測復制中的數據差異。
參數:
--binary-index 修改 --create-replicate-table 行為,使復制表的上限和下限列使用 BLOB 數據類型
--channel=s 連接到服務器時使用的復制通道名稱
--[no]check-binlog-format 檢查所有服務器的 binlog_format 是否相同(默認為 yes)
--[no]check-plan 檢查查詢執行計劃是否安全(默認為 yes)
--chunk-index=s 首選用于分塊表的索引
--chunk-index-columns=i 使用索引的左側這么多列來分塊表
--chunk-size=z 每個校驗查詢選擇的行數(默認為 1000)
--chunk-time=f 動態調整分塊大小,使每個校驗查詢執行時間為指定秒數(默認為 0.5)
--[no]create-replicate-table 如果不存在,則創建 --replicate 數據庫和表(默認為 yes)
--disable-qrt-plugin 禁用 QRT(查詢響應時間)插件(如果已啟用)
--[no]empty-replicate-table 在對表進行校驗之前刪除先前的校驗結果(默認為 yes)
--fail-on-stopped-replication 如果復制已停止,則報錯退出(退出狀態碼 128),而不是等待復制重新啟動
--float-precision=i FLOAT 和 DOUBLE 數字到字符串轉換的精度
--function=s 校驗和的哈希函數(FNV1A_64、MURMUR_HASH、SHA1、MD5、CRC32 等)
--pause-file=s 當指定的文件存在時,執行將暫停
--pid=s 創建指定的 PID 文件
--plugin=s 定義 pt_table_checksum_plugin 類的 Perl 模塊文件
--progress=a 將進度報告打印到 STDERR(默認為 time,30)
--quiet -q 僅打印最重要的信息(禁用 --progress)(默認為 0)
--recurse=i 在發現復制時遞歸的層級數
--recursion-method=a 發現復制時的首選遞歸方法(默認為 processlist,hosts)
--replicate=s 將校驗結果寫入此表(默認為 percona.checksums)
--[no]replicate-check 在完成每個表后,檢查復制是否存在數據差異(默認為 yes)
--replicate-check-only 僅檢查復制是否一致,而不執行校驗查詢
--replicate-check-retries=i 當遇到差異時,重試校驗比較此次數(默認為 1)
--replicate-database=s 僅使用此數據庫
--resume 從上次完成的塊繼續校驗(禁用 --[no]empty-replicate-table)
--retries=i 當遇到非致命錯誤時,重試此次數(默認為 2)
--run-time=m 運行時間,可選的后綴 s=秒,m=分鐘,h=小時,d=天;如果沒有后綴,默認為 s
--separator=s 用于 CONCAT_WS() 的分隔符字符(默認為 #)
--skip-check-slave-lag=d 跳過檢查從庫延遲的 DSN
--slave-password=s 設置用于連接到從庫的密碼
--slave-skip-tolerance=f 當一個主表標記為僅在一個塊中進行校驗,但從庫表超過此的最大接受大小時,跳過此表(默認為 1.0)
--slave-user=s 設置用于連接到從庫的用戶
--trim 對 VARCHAR 列添加 TRIM()(在比較 4.1 和 >= 5.0 時有幫助)
--truncate-replicate-table 在開始校驗之前截斷復制表
--[no]version-check 檢查最新版本的 Percona Toolkit、MySQL 和其他程序(默認為 yes)
--where=s 僅執行匹配此 WHERE 子句的行
Config:
--config=A 讀取此逗號分隔的配置文件列表;如果指定,必須作為命令行的第一個選項
Connection:
--ask-pass 連接到 MySQL 時提示輸入密碼
--defaults-file=s -F 僅從給定文件中讀取 MySQL 選項
--host=s -h 要連接的主機(默認為 localhost)
--password=s -p 連接時使用的密碼
--port=i -P 連接使用的端口號
--set-vars=A 設置這些 MySQL 變量的值,以逗號分隔的變量=值對
--socket=s -S 使用的連接套接字文件
--user=s -u 如果不是當前用戶,則登錄使用的用戶
Filter:
--columns=a -c 僅校驗此逗號分隔的列
--databases=h -d 僅校驗此逗號分隔的數據庫
--databases-regex=s 僅校驗數據庫名稱與此 Perl 正則表達式匹配的數據庫
--engines=h -e 僅校驗使用這些存儲引擎的表
--ignore-columns=H 在計算校驗和時忽略此逗號分隔的列
--ignore-databases=H 忽略此逗號分隔的數據庫
--ignore-databases-regex=s 忽略名稱與此 Perl 正則表達式匹配的數據庫
--ignore-engines=H 忽略此逗號分隔的存儲引擎(默認為 FEDERATED,MRG_MyISAM)
--ignore-tables=H 忽略此逗號分隔的表
--ignore-tables-regex=s 忽略名稱與此 Perl 正則表達式匹配的表
--tables=h -t 僅校驗此逗號分隔的表
--tables-regex=s 僅校驗名稱與此 Perl 正則表達式匹配的表
示例:
pt-table-checksum --user=username --password=password
35.pt-table-sync
作用:同步MySQL表的數據,以修復復制中的數據差異。
參數:
--algorithms=s 比較表時使用的算法優先級順序(默認為 Chunk,Nibble,GroupBy,Stream)
--ask-pass 連接到 MySQL 時提示輸入密碼
--bidirectional 啟用第一個和后續主機之間的雙向同步
--[no]bin-log 記錄到二進制日志(SET SQL_LOG_BIN=1)(默認為 yes)
--buffer-in-mysql 指示 MySQL 在其內存中緩沖查詢
--[no]buffer-to-client 在比較時逐行從 MySQL 獲取行(默認為 yes)
--channel=s 連接到使用復制通道的服務器時的通道名稱
--charset=s -A 默認字符集
--[no]check-child-tables 檢查 --execute 是否會對子表產生不利影響(默認為 yes)
--[no]check-master 使用 --sync-to-master 時,嘗試驗證檢測到的主服務器是否真正是主服務器(默認為 yes)
--[no]check-slave 檢查目標服務器是否為從服務器(默認為 yes)
--[no]check-triggers 檢查目標表上是否定義了觸發器(默認為 yes)
--chunk-column=s 使用此列對表進行分塊
--chunk-index=s 使用此索引對表進行分塊
--chunk-size=s 每個分塊的行數或數據大小(默認為 1000)
--columns=a -c 僅比較此逗號分隔的列
--config=A 讀取此逗號分隔的配置文件列表;如果指定,必須作為命令行的第一個選項
--conflict-column=s 在雙向同步期間,當行沖突時比較此列
--conflict-comparison=s 選擇具有此屬性的 --conflict-column 作為源
--conflict-error=s 如何報告無法解決的沖突和沖突錯誤(默認為 warn)
--conflict-threshold=s 一個 --conflict-column 必須超過另一個的量
--conflict-value=s 對于某些 --conflict-comparison,使用此值
--databases=h -d 僅同步此逗號分隔的數據庫
--defaults-file=s -F 僅從給定文件中讀取 MySQL 選項
--dry-run 分析,確定要使用的同步算法,打印并退出
--engines=h -e 僅同步使用此逗號分隔的存儲引擎的表
--execute 執行查詢以使表具有相同的數據
--explain-hosts 打印連接信息并退出
--float-precision=i FLOAT 和 DOUBLE 數字到字符串轉換的精度
--[no]foreign-key-checks 啟用外鍵檢查(SET FOREIGN_KEY_CHECKS=1)(默認為 yes)
--function=s 用于校驗和的哈希函數
--help 顯示幫助信息并退出
--[no]hex-blob HEX() BLOB、TEXT 和 BINARY 列(默認為 yes)
--host=s -h 要連接的主機
--ignore-columns=H 在比較中忽略此逗號分隔的列名
--ignore-databases=H 忽略此逗號分隔的數據庫
--ignore-engines=H 忽略此逗號分隔的存儲引擎(默認為 FEDERATED,MRG_MyISAM)
--ignore-tables=H 忽略此逗號分隔的表
--[no]index-hint 在分塊和行查詢中添加 FORCE/USE INDEX 提示(默認為 yes)
--lock=i 鎖定表:0=無,1=每個同步周期,2=每個表,3=全局
--lock-and-rename 鎖定源和目標表,同步后交換名稱
--password=s -p 連接時使用的密碼
--pid=s 創建指定的 PID 文件
--port=i -P 連接使用的端口號
--print 打印解決差異的查詢
--recursion-method=a 用于查找從服務器的首選遞歸方法(默認為 processlist,hosts)
--replace 將所有 INSERT 和 UPDATE 語句寫為 REPLACE
--replicate=s 同步在此表中列出為不同的表
--set-vars=A 設置此逗號分隔的變量=值對的 MySQL 變量
--slave-password=s 設置用于連接到從服務器的密碼
--slave-user=s 設置用于連接到從服務器的用戶
--socket=s -S 使用的連接套接字文件
--sync-to-master 將 DSN 視為從服務器,并將其同步到其主服務器
--tables=h -t 僅同步此逗號分隔的表
--timeout-ok 如果 --wait 失敗,則繼續
--[no]transaction 使用事務而不是 LOCK TABLES
--trim 在 BIT_XOR 和 ACCUM 模式下 TRIM() VARCHAR 列
--[no]unique-checks 啟用唯一鍵檢查(SET UNIQUE_CHECKS=1)(默認為 yes)
--user=s -u 如果不是當前用戶,則登錄使用的用戶
--verbose -v 打印同步操作的結果
--version 顯示版本信息并退出
--[no]version-check 檢查最新版本的 Percona Toolkit、MySQL 和其他程序(默認為 yes)
--wait=m -w 等待從服務器追上它們的主服務器的時間。可選的后綴 s=秒,m=分鐘,h=小時,d=天;如果沒有后綴,默認為 s
--where=s WHERE 子句,用于將同步限制為表的一部分
--[no]zero-chunk 添加一個用于具有零或等效于零值的行的分塊(默認為 yes)
示例:
pt-table-sync --user=username --password=password
36.pt-table-usage
作用:分析MySQL查詢日志以報告表的使用情況。
示例:
pt-table-usage --user=username --password=password slow.log
37.pt-upgrade
作用:分析MySQL查詢日志以檢測升級到新版本后的潛在問題。
示例:
pt-upgrade --user=username --password=password /path/to/slow.log
38.pt-variable-advisor
作用:檢查MySQL服務器的變量設置,并給出優化建議。
示例:
pt-variable-advisor --user=username --password=password
39.pt-visual-explain
作用:生成MySQL查詢計劃的可視化解釋。
示例:
pt-visual-explain "SELECT * FROM users WHERE id = 1"
注意事項
- 安全性:使用工具時需謹慎,避免對生產環境造成負面影響。
- 版本兼容性:確保工具版本與MySQL版本兼容。
- 配置文件:使用配置文件能夠方便地管理和調整參數。
總結
Percona Toolkit工具集是管理和優化MySQL和MariaDB數據庫的強大工具,能夠幫助數據庫管理員和開發人員提升工作效率,優化數據庫性能,確保數據的完整性和一致性。通過本文的介紹和解析,相信你能更全面地理解和應用這些工具,從而更好地管理和維護數據庫系統。
作者介紹
吳守陽,51CTO社區編輯,擁有8年DBA工作經驗,熟練管理MySQL、Redis、MongoDB等開源數據庫。精通性能優化、備份恢復和高可用性架構設計。善于故障排除和自動化運維,保障系統穩定可靠。具備良好的團隊合作和溝通能力,致力于為企業提供高效可靠的數據庫解決方案。