显然,我的一位同事杀死了一个导致 MySQL 挂起(锁定其他查询)的 Web 服务器,而不是杀死特定的查询,并且他特别小心地忘记了有关阻止其他查询的查询的任何细节。我希望我能说这是第一次发生这种情况,但大约每 2 到 4 个月就会发生一次(遗憾的是间隔不规律,没有相关信息),我非常希望能够记录花费很长时间的查询,无论它们是否完成。
现在,对于成功的查询,我们有完全可行的慢查询日志,但它只有在完成时才会出现,而不是在查询期间被终止时。是否有内置解决方案可以在查询仍在运行时记录查询?目前,我求助于每 10 秒运行一次查询此内容的守护进程/脚本:
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE TIME > 30
AND USER != 'replication'
AND USER != 'system user'
AND USER != 'DELAYED'
AND COMMAND != 'Sleep'
AND ID != CONNECTION_ID();
...但感觉有点像黑客行为,我想知道是否存在我忽略的内置可能性?
答案1
pt-query-digest --processlist h=host1 --print --no-report
按照说明尝试这里。我从未尝试在实时服务器上进行摘要,仅用它来处理现有的慢速日志,但这似乎是您需要的工具。您需要安装 Percona Toolkit。
答案2
虽然这需要使用第二个软件(来自同一供应商),但你应该考虑MySQL 代理在您的服务器前面,并使用其非常广泛的功能来记录查询的开始和结束时间,即使它们被服务器取消。