请问如何查询慢sql ID?想使用 kill id结束会话
很奇怪的是tikv占用CPU很高,在监控里看到慢SQL语句,可是在show processlist里查找不到对应的SQL,这个是在哪里查呢?
show processlist或者cluster_processlist里没有可能sql已经执行完了, 慢日志里只记录IP信息。
tidb显示不了OS id的吧
go开发的程序,多协程,跟os上的线程/进程没有对应关系
慢查询里记录的都是已经执行完的sql ![]()
另外,不要用show方法查进程,这样只能查当前节点的,查不了其他节点的。查询整个集群的进程要用
SELECT * FROM INFORMATION_SCHEMA.CLUSTER_PROCESSLIST
是不是要加full.
show full processlist
那如果当前有某条SQL占用CPU很高,那如何结束掉这个SQL进程呢?如何查询当前占用CPU高的CPU并能kill id
应该不是
已经知道是哪个sql占用CPU高了,应该就有对应进程号吧。最近的几个大版本都支持全局kill,不需要在对应节点上执行kill
看了一下dashboard里的top sql,好像统计的也都是已经执行完的。
不过可以用top sql里的sql模板id,去进程里面查有没有正在执行的语句
SELECT * FROM INFORMATION_SCHEMA.CLUSTER_PROCESSLIST
WHERE DIGEST = ''
TiDB 会将慢 SQL 记录到 INFORMATION_SCHEMA.SLOW_QUERY 表中,你可以通过这个表精准找到慢 SQL 的相关信息
在监控面板里能看到TOP SQL,就是因为不知道ID,无法在数据库里kill id啊,所以想知道如何查当前占用cpu高的CPU,能查到ID,这样可以去数据库里kill id.
一定不要用SLOW_QUERY,这个只记录当前节点的,比如有1、2、3三个tidb节点,连接1节点查询这个表,只能看到1节点上的慢查询,看不到2、3节点上的慢查询。要查询CLUSTER_SLOW_QUERY
TOP SQL里有 sql模板id,用这个id去CLUSTER_PROCESSLIST里查询,理论上就能查询到相同的语句,然后就能拿到对应的进程id
SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO
FROM information_schema.PROCESSLIST
WHERE TIME > 1000
AND state<>‘SLEEP’
ORDER BY TIME DESC;
直接找时间长的就行,时间段的也好耗费不了多少CPU
Tikv的CPU占用高,这个查询应该只是查tidb组件的吧,不会查tikv里运行的SQL吧?
sql最终不都是在tikv里运行吗?tidb是只有一个节点作为入口执行sql,然后sql下推到各个tikv里获取数据。
查询 information_schema.cluster_slow_query
这是最直接的方法:
SELECT
time,
query_time,
digest,
query
FROM information_schema.cluster_slow_query
WHERE time > NOW() - INTERVAL 1 HOUR
ORDER BY query_time DESC
LIMIT 20;
重点字段:
digest → SQL ID
query_time → 执行时间
query → 原始 SQL
例如:
digest: 0f3a4b2e…
query: select * from t where a=?
这个 digest 就是监控里看到的 SQL ID。
是的,我也感觉用sqlid再去processlist里面找会话id比较靠谱
使用CLUSTER_PROCESSLIST查询正在执行 且耗时长的语句, 比普通的 PROCESSLIST 更全面。
show命令或者直接查询性能视图就可以看到对应的sqlid,但是确定慢sql需要使用dashboard或者其他监控视图查询