写点什么

使 pt-kill 和 pt-query-digest 工具兼容 TiDB

  • 2022 年 7 月 11 日
  • 本文字数:2152 字

    阅读完需:约 7 分钟

作者: tsthght 原文来源:https://tidb.net/blog/74d4f54b


MySQL DBA 对 percona toolkit 再熟悉不过了,其中 pt-kill 和 pt-query-digest 是日常运维中经常使用到的工具。但是这些原生工具对 TiDB 兼容性不是特别好,限制了在 TiDB 上的使用我们对 pt-kill 和 pt-query-digest 进行了简单的修改,使其能够在 TiDB 上正常使用,不需要再重新造轮子,大大降低了 TiDB 运维人员的学习成本。我们将修改后的工具放到了GitHub上,方便大家更好的运维 TiDB,为 TiDB 社区贡献一份力量。接下来会简单介绍这两个工具使用方法。


pt-kill 工具用来批量 kill 指定条件的数据库中的连接,从而达到过载保护作用。该工具会发送KILL xxx 语句来实现该功能,但是 TiDB 默认情况下参数 compatible-kill-query 为 false,即KILL xxx不起作用,需要发送KILL TiDB xxx才实际起作用。TiDB 这样的设计充分考虑了当使用负载均衡或代理连接 TiDB 时,当用户按下 Ctrl+C 时,会导致误杀其他连接的问题。而然,这样的设计,也导致了 TiDB 默认参数情况下,pt-kill 工具失效。


因此我们修改了 pt-kill,增加了参数–tidb,当需要 KILL TiDB 上的连接时,只需要添加该参数,pt-kill 便会发送 KILL TIDB xxx 命令,从而可以 KILL 掉 TiDB 上的指定连接。当然,为了防止误杀其他连接,pt-kill 也需要直连 TiDB 使用。由于 pt-kill 工具大家非常了解,且网上用法的介绍非常多,下面仅简单列举一个使用例子:


##按照执行时间kill, 杀掉执行时间超过5秒的所有查询pt-kill --no-version-check --host 127.0.0.1 --charset utf8 --match-command Query --busy-time 5 --kill --victims all --interval 10 --tidb 
复制代码


pt-query-digest 工具是用来分析 MySQL 日志的首选工具,一些有名的慢日志系统也基于该工具开发。然而,TiDB(3.0.0)的慢日志记录的时间格式与 MySQL 格式略有不同,因此该工具也无法正常的分析 TiDB 的慢日志。


-- TiDB 3.0.0 slow log 格式# Time: 2019-05-24-11:33:43.112342888 +0800# Txn_start_ts: 0# User: admin@127.0.0.1# Conn_ID: 810559# Query_time: 10.000232849# DB: test# Is_internal: false# Digest: b4dae6a771c1d84157dcc302bef38cbff77a7a8ff89ee38302ac3324485454a3select sleep(10);
-- MySQL5.7 slow log 格式# Time: 2019-05-24T03:58:59.355559Z# User@Host: root[root] @ localhost [] Id: 2222# Query_time: 0.000033 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0SET timestamp=1556078339;
复制代码


虽然 TiDB 也支持了一些查看慢日志的方法,诸如内存表,和一些 admin 命令,如下所示。但是远远没有 pt-query-digest 功能强大。


## 查询内存表/* 查询所有用户执行的SQL,且按执行消耗时间排序 */tidb > select `Query_time`, query from INFORMATION_SCHEMA.`SLOW_QUERY` where `Is_internal`=false order by `Query_time` desc limit 2;+--------------+------------------------------------------------------------------+| Query_time   | query                                                            |+--------------+------------------------------------------------------------------+| 12.77583857  | select * from t_slim, t_wide where t_slim.c0=t_wide.c0;          ||  0.734982725 | select t0.c0, t1.c1 from t_slim t0, t_wide t1 where t0.c0=t1.c0; |+--------------+------------------------------------------------------------------+2 rows in setTime: 0.012s
## 使用admin命令admin show slow recent Nadmin show slow top [internal | all] Nadmin show slow recent 10
复制代码


因此,我们对 pt-query-digest 进行了简单修改,使其兼容了 TiDB(3.0.0+) 的慢日志,从而可以像分析 MySQL 慢日志一样分析 TiDB(3.0.0+) 慢日志。同样,pt-query-digest 工具大家已经非常熟悉,且网上用法的介绍非常多,下面仅简单列举几个使用例子:


# 直接分析慢查询pt-query-digest slow.log > result.log
# 最近12小时pt-query-digest --since=12h slow.log > result.log
# 时间范围pt-query-digest slow.log --since '2019-06-18 09:30:00' --until '2019-06-18 10:00:00' > result.log
# 按照SQL类型查询pt-query-digest --filter '$event->{fingerprint} =~ m/^select/i' slow.log > result.log
# 按用户查询pt-query-digest --filter '($event->{User} || "") =~ m/^superadmin/i' test.log > slow.log
# 只查询客户端发送的SQLpt-query-digest --filter '($event->{Is_internal} || "") =~ m/^false/i' test.log > slow.log
# 访问特定DB的SQLpt-query-digest --filter '($event->{DB} || "") =~ m/^test1/i' test.log > slow.log
# 某个连接发送过来的SQLpt-query-digest --filter '($event->{Conn_ID} || "") =~ m/^810559/i' test.log > slow.log
# 查看属性信息pt-query-digest test.log --filter 'print Dumper $event' --no-report
## 输出json (可以分析是否一条SQL走了不同的索引等等)pt-query-digest test.log --output=json
复制代码


更详细的用法,详见GitHub,地址:https://github.com/MyTiDBA/TiDB-toolkit


欢迎大家使用和交流~


发布于: 刚刚阅读数: 2
用户头像

TiDB 社区官网:https://tidb.net/ 2021.12.15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
使 pt-kill 和 pt-query-digest 工具兼容 TiDB_TiDB 社区干货传送门_InfoQ写作社区