mysql - 当有超过 n 个查询时,如何记录 "show processlist"?

标签 mysql bash shell logging cron

我们的 mysql 进程有时会积压,进程开始排队。我想通过在缓慢的时间记录进程列表来调试发生这种情况的时间和原因。

我想通过 cron 作业运行 show full processlist;,如果返回的行超过 50,则将输出保存到文本文件。

你能给我指出正确的方向吗?

例如:

echo "show full processlist;" | mysql -uroot > processlist-`date +%F-%H-%M`.log

我只想在结果包含文本 50 rows in set(或大于 50 行)时运行它。

最佳答案

pt-stalk专为这个确切目的而设计。它每秒(或您指定的任何时间)对进程列表进行采样,然后在达到阈值时(Threads_running 是默认值,在这种情况下是您想要的),收集一大堆数据,包括磁盘事件、tcpdump、多个进程列表、服务器状态变量、mutex/innodb 状态等示例。

这是开始的方法:

pt-stalk --daemonize --dest /var/lib/pt-stalk --collect-tcpdump --threshold 50 --cycles 1 --disk-pct-free 20 --retention-time 3 -- --defaults-file=/etc/percona-toolkit/pt-stalk_my.cnf

上面的命令将每秒对 Threads_running(--threshold;将其设置为您的 n 值)进行采样(默认为 --interval) 并在连续 1 个样本 (--cycles) 的 Threads_running 大于 50 时触发数据收集。将保留 3 天 (--retention-time) 的样本,如果磁盘可用空间少于 20% (--disk-pct-free,则不会触发 collect >).在每次收集时,将执行 pcap 格式的 tcpdump (--collect-tcpdump),可以使用传统的 tcpdump 工具或许多其他 Percona Toolkit 工具进行分析,包括 pt-query-digestpt-tcp-model .样本之间将有 5 分钟的休息时间(默认为 --sleep),以防止您自己受到 DoS 攻击。该进程将被守护进程 (--daemonize)。 -- 之后的参数将传递给所有 m​​ysql/mysqladmin 命令,因此是设置诸如 --defaults-file 之类的内容的好地方,您可以在其中存储登录凭据远离窥探的眼睛。

关于mysql - 当有超过 n 个查询时,如何记录 "show processlist"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9778913/

相关文章:

php - 如何读取html表的位置并在php mysql中显示

mysql - 在 MySQL 中使用 IF 进行多列比较

bash - 如何通过双击在 Linux 上运行脚本

c - 使用 echo 和 system 在 C 中运行软件

linux - 用于解析列中数据的 Shell 脚本

linux - Bash:cd 到程序输出提供的目录

mysql - 如何在 mySQL 表中存储多个用户的书签?

mysql - 连接表以查询随机行

bash - Rebar3 和 Erlang -heart 标志

linux - 一个目录中的所有文件,linux