我们的mysql进程有时会积压并且进程开始排队。我想通过在慢速时间记录进程列表来调试何时以及为什么会发生这种情况。
我想通过cron作业运行show full processlist;
,如果返回的行数超过50
,则将输出保存到文本文件中。
你能指出我正确的方向吗?
例如:
echo "show full processlist;" | mysql -uroot > processlist-`date +%F-%H-%M`.log
我只有在结果包含文字50 rows in set
(或大于50
行)时才会运行。
答案 0 :(得分:13)
pt-stalk专为此目的而设计。它每秒(或您指定的任何时间)对进程列表进行采样,然后达到阈值(Threads_running是默认值,在这种情况下是您想要的),收集大量数据,包括磁盘活动,tcpdumps,多个进程列表的样本,服务器状态变量,互斥/ 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
)并在Threads_running时触发数据集合1个连续样本(--cycles
)大于50。如果少于20%的磁盘空闲(--retention-time
),将保留3天(--disk-pct-free
)样本并且不会触发收集。在每个集合中,将执行pcap格式tcpdump(--collect-tcpdump
),可以使用传统的tcpdump工具或许多其他Percona Toolkit工具(包括pt-query-digest和pt-tcp-model)进行分析。样本之间将有5分钟的休息时间(默认为--sleep
),以防止自己进行DoS。这个过程将被守护(--daemonize
)。 --
之后的参数将被传递给所有mysql / mysqladmin命令,因此这是一个设置--defaults-file
之类的地方的好地方,在这里您可以将您的登录凭据存储在远离窥探的目的地。
答案 1 :(得分:3)
首先,确保MySQL的慢查询日志不是您所需要的。此外,MySQL的-e
参数允许您在命令行上指定查询。
转换逻辑,这会保存进程列表,并在进程列表不够长时将其删除:
date=$(date +...) # set the desired date format here
[ $(mysql -uroot -e "show full processlist" | tee plist-$date.log | wc -l) -lt 51 ] && rm plist-$date.log