有没有基于数据库过滤MySQL慢查询日志的工具?

有没有基于数据库过滤MySQL慢查询日志的工具?

我目前正在尝试调整单个数据库(实际上是一组类似的数据库)的性能,但慢速查询日志中包含大量我目前不感兴趣的其他数据库的数据。我已经找到了一些慢速日志过滤脚本,但似乎没有找到任何能够根据数据库名称进行过滤的脚本。

查看日志文件(针对 5.0.18),数据库名称似乎出现在每个查询块中,因此执行这种过滤应该是一个相当简单的编程问题(这就是我要做的),但是如果这么简单,为什么没有人(我能找到)已经这样做了?

例如:

# Time: 090226 11:17:04
# User@Host: user1[user1] @ host [10.0.0.3]
# Query_time: 12  Lock_time: 0  Rows_sent: 2  Rows_examined: 4042564
use [db1];
SELECT ...
# Time: 090226 11:17:34
# User@Host: user1[user1] @ host [10.0.0.3]
# Query_time: 12  Lock_time: 0  Rows_sent: 0  Rows_examined: 4042560
SELECT ...
# Time: 090226 12:32:40
# User@Host: user2[user2] @ host [10.0.0.3]
# Query_time: 8  Lock_time: 0  Rows_sent: 123390  Rows_examined: 812841
use [db2];
SELECT ...

前两个查询都针对同一个数据库,因此单个use语句涵盖它们两个。

答案1

你可以使用这个小 awk 脚本来完成这项工作:

awk '{ if ($0 ~ /use \[.*\];/) { if ($2 ~ /db1/) { found = 1; } else { found = 0; }} if (found == 1) { print $0; }}' <mysqllogfile>

只需将 db1 替换为您要搜索的数据库名称。当您从上面获取示例时,此脚本将为您提供:

use [db1];
SELECT ...
# Time: 090226 11:17:34
# User@Host: user1[user1] @ host [10.0.0.3]
# Query_time: 12  Lock_time: 0  Rows_sent: 0  Rows_examined: 4042560
SELECT ...
# Time: 090226 12:32:40
# User@Host: user2[user2] @ host [10.0.0.3]
# Query_time: 8  Lock_time: 0  Rows_sent: 123390  Rows_examined: 812841

我不知道你的操作系统是什么,但 awk/gawk 适用于多种操作系统。

答案2

我最终发现mysqlsla并且,经过一些修补(我将其提交给他们,但如果有人需要,我会很乐意放在这里),它按照我的要求去做了。

相关内容