如何找出 Informix 数据库服务器上长时间运行的查询是什么?我有一个正在耗尽 CPU 的查询,并想找出查询是什么。
4 回答
如果查询当前正在运行,请观察onstat -g act -r 1输出并查找rstcb不为 0的项目
Running threads:
tid tcb rstcb prty status vp-class name
106 c0000000d4860950 0 2 running 107soc soctcppoll
107 c0000000d4881950 0 2 running 108soc soctcppoll
564457 c0000000d7f28250 c0000000d7afcf20 2 running 1cpu CDRD_10
在此示例中,第三行是当前正在运行的内容。如果您有多个具有非零 rstcb 值的行,那么请注意寻找始终或几乎始终存在的行。这很可能是您正在寻找的会话。
c0000000d7afcf20是我们对此示例感兴趣的地址。
使用onstat -u | grep c0000000d7afcf20查找会话
c0000000d7afcf20 Y--P--- 22887 informix - c0000000d5b0abd0 0 5 14060 3811
这将为您提供会话 ID,在我们的示例中为22887。使用onstat -g ses 22887 列出有关该会话的信息。在我的示例中,它是一个系统会话,因此在 onstat -g ses 输出中看不到任何内容。
好的,我花了一点时间才弄清楚如何连接到 sysmaster。JDBC 连接字符串是:
jdbc:informix-sqli://dbserver.local:1526/sysmaster:INFORMIXSERVER=mydatabase
端口号与连接到实际数据库时的端口号相同。也就是说,如果您的连接字符串是:
jdbc:informix-sqli://database:1541/crm:INFORMIXSERVER=crmlive
那么 sysmaster 连接字符串是:
jdbc:informix-sqli://database:1541/sysmaster:INFORMIXSERVER=crmlive
还发现了这个 wiki 页面,其中包含许多用于对 sysmaster 表进行操作的 SQL 查询。
这是因为建议的答案是针对 DB2,而不是 Informix。
sysmaster 数据库(Informix 共享内存的虚拟关系数据库)可能包含您所寻找的信息。这些页面可能会帮助您入门:
SELECT ELAPSED_TIME_MIN,SUBSTR(AUTHID,1,10) AS AUTH_ID,
AGENT_ID, APPL_STATUS,SUBSTR(STMT_TEXT,1,20) AS SQL_TEXT
FROM SYSIBMADM.LONG_RUNNING_SQL
WHERE ELAPSED_TIME_MIN > 0
ORDER BY ELAPSED_TIME_MIN DESC