无法使用Python脚本查询 information_schema.CLUSTER_SLOW_QUERY 等表

【 TiDB 使用环境】生产环境
【 TiDB 版本】7.5.3
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】


目前想使用Python脚本来统计TIDB的慢查,然后获取相关慢查信息之后用于后续其他用途。
现在遇到问题,使用python + pymysql 写的脚本,核心就是执行如下sql

select count(*) from information_schema.CLUSTER_SLOW_QUERY where Time > NOW() - INTERVAL 1 MINUTE ;

或者使用

select count(*) from information_schema.CLUSTER_SLOW_QUERY where Time > '2026-04-09 15:00:00' ;

不管是表 CLUSTER_SLOW_QUERY 还是 SLOW_QUERY 都获取不到数据,

但是相同的SQL语句,我再命令登录TIDB就可以查询到。

也对比以下4个参数值, 脚本获取和命令行获取一致,感觉不是时区的问题

MySQL [(none)]> SELECT @@session.time_zone, @@global.time_zone, NOW(), UTC_TIMESTAMP();
+---------------------+--------------------+---------------------+---------------------+
| @@session.time_zone | @@global.time_zone | NOW()               | UTC_TIMESTAMP()     |
+---------------------+--------------------+---------------------+---------------------+
| SYSTEM              | SYSTEM             | 2026-04-09 14:37:36 | 2026-04-09 06:37:37 |
+---------------------+--------------------+---------------------+---------------------+

大家有人遇到过这个问题吗?

PS: 我用golang重新了脚本,也是同样的问题,查询不到数据。

建议使用general_log拿一下具体执行的sql。另外,python用的用户和手工执行的用户是同一个用户吗?

这个是什么工具,从哪里获取呢?

不是一个用户,是单独的只读账号,但是是所有库所有表上的只读权限呢,(我先试试用管理账号能否获取到数据)

应该是权限不够,参考这里

可以将所有执行的sql语句打印出来

好的,我了解下

解决了,非常感谢~

1 个赞

:handshake::handshake::handshake:

这种情况在 TiDB 里非常典型,不是时区问题,而是 TiDB 慢查询表的会话可见性 / 刷新机制 + pymysql 默认事务隔离级别

核心原因

  1. TiDB 的 SLOW_QUERY / CLUSTER_SLOW_QUERY 是内存表 / 临时汇总表
    它不是普通 InnoDB 表,不会自动在事务中刷新。

  2. pymysql 默认开启自动提交 = False,会进入一个长事务
    你在 Python 里第一次连接后,就进入了一个事务快照。
    之后慢查询新产生的数据,在这个事务里看不见。

而你在命令行:

• 要么每条语句自动提交

• 要么每次重连新会话
所以能查到最新数据。

TiDB Python 查不到 CLUSTER_SLOW_QUERY 干条解决方案

  1. 授权超权限:给 Python 连接用户授予 SUPER/PROCESS 权限,普通用户无权限访问集群级慢查询表。
  2. 对齐会话参数:连接时显式设置 time_zone=‘SYSTEM’ 等会话变量,避免上下文差异导致空结果。
  3. 修复查询语法:避免使用 NOW () 等动态函数,改用 Python 生成固定时间字符串作为查询条件。
  4. 适配客户端兼容:升级 PyMySQL 到最新版,使用 SSCursor 流式游标适配大结果集。
  5. 排查基础查询:先执行 LIMIT 10 测试基础查询,排除表访问或权限问题。
  6. 对比请求差异:对比命令行与 Python 的请求日志 / 参数,排查时区、超时、解析差异等根因。
  7. 注意延迟与缓存:慢日志有写入延迟,查询时需预留 10 秒左右延迟,避免查询刚生成的慢查询。

估计是授权 PROCESS就可以了

授权没有弄全