我们正在尝试进行一些服务器性能调试,我想捕获在几分钟内在我们的 MySQL 服务器上运行的查询的快照。
我熟悉 MySQL 的SHOW FULL PROCESSLIST
,但是我希望能够通过命令行运行它,这样我就可以将它转储到一个文件中并对其进行后期处理。
有没有办法将此查询输出到文件并让它每秒运行一次?
有没有更好的方法来捕获所有正在运行的查询?
请注意,我对慢查询不感兴趣(我熟悉慢查询日志)。
Dan*_*man 13
最健壮的方法是使用“通用查询日志”,它将捕获所有查询:http : //dev.mysql.com/doc/refman/5.1/en/query-log.html
您没有指定 MySQL 服务器版本,但如果您有 5.1.12 或更高版本,您可以通过 SQL 使用全局变量启用和禁用它;有关详细信息,请参阅文档。
小智 10
我会使用慢查询日志。如果您设置 long_query_time = 0,它会捕获所有查询,而不仅仅是那些缓慢的查询。
它还捕获所有查询,这里提到的 TCP 嗅探技术并非如此;那些不会捕获通过套接字执行的查询。观看 SHOW PROCESSLIST 也是如此;你会错过快速运行的查询。
如果您想通过进程列表或 TCP 流量捕获查询,我建议使用 Percona Toolkit 的 pt-query-digest。它可以为你轮询进程列表(并理解结果,如果你自己捕获一堆样本,这很难做到),并且它可以解释 MySQL 的 TCP 协议,因此你可以抓取一些 TCP流量并对其进行分析。当然,它也是有史以来最好的查询聚合器/分析器/报告器,但是您没有说明捕获查询后要对它们做什么。
当然:
mysqladmin -u root -p -i 1 --verbose processlist > /tmp/pl.out
Run Code Online (Sandbox Code Playgroud)
干杯
小智 5
以 root 身份尝试此命令(或使用sudo
):
tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | perl -e '
while(<>) { chomp; next if /^[^ ]+[ ]*$/;
if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
if (defined $q) { print "$q\n"; }
$q=$_;
} else {
$_ =~ s/^[ \t]+//; $q.=" $_";
}
}'
Run Code Online (Sandbox Code Playgroud)
发现http://www.mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging/
归档时间: |
|
查看次数: |
33378 次 |
最近记录: |