針對架構不佳導致頻繁出現 Locked 進程的場景,編寫腳本定時清理,降低資料庫壓力。
show processlist 找出 State 含 "Locked" 的進程 ID#!/bin/bash
mysql_pwd="xxxxxx"
mysql_exec="/usr/local/mysql/bin/mysql"
tmp_dir="/tmp"
file_sh="$tmp_dir/mysql_kill_locked.sh"
file_tmp="$tmp_dir/mysql_kill_locked.tmp"
file_log="$tmp_dir/mysql_kill_locked.log"
# 擷取 Locked 進程 ID
$mysql_exec -uroot -p$mysql_pwd -e "show processlist" | grep -i "Locked" > $file_tmp
cat $file_tmp >> $file_log
# 產生 kill 腳本
for line in $(cat $file_tmp | awk '{print $1}'); do
echo "$mysql_exec -uroot -p$mysql_pwd -e \"kill $line\"" >> $file_sh
done
chmod +x $file_sh
sh $file_sh # 執行 kill
> $file_sh # 清空臨時腳本
加入 crontab 定時執行,如每分鐘檢查:
* * * * * /path/kill_locked.sh
此為療標方案,長期應優化: