我们的 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-digest和 pt-tcp-model .样本之间将有 5 分钟的休息时间(默认为 --sleep
),以防止您自己受到 DoS 攻击。该进程将被守护进程 (--daemonize
)。 --
之后的参数将传递给所有 mysql/mysqladmin 命令,因此是设置诸如 --defaults-file
之类的内容的好地方,您可以在其中存储登录凭据远离窥探的眼睛。
关于mysql - 当有超过 n 个查询时,如何记录 "show processlist"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9778913/