查看mysql的查看死鎖的方式很多,但很多時候我們普通開發者的權限比較低,無法執行某命令。比如本次就準備使用
SHOW ENGINE INNODB STATUS;
命令,但客戶端提示權限不夠。后來本人找到了另一條低權限的命令
show full PROCESSLIST;
但是show full PROCESSLIST;
這個命令的輸出信息太多了,我們公司很多個庫都部署在同一個mysql實例中,所以其他庫的進程信息也輸出到控制臺了。在當我們登錄mysql客戶端后,沒辦法使用linux平臺的grep
這些正則過濾命令,要從這么多的輸出信息中找出我們關心的數據有點頭大。經過我的九牛二虎之力終于發現了一個快捷方式,它不需要進入到mysql客戶端內部,直接在linux 的shell環境中。
mysql -P {port} -u {user} -p{password} -h {host} {dbname} -e 'SHOW full PROCESSLIST;' > ~/proccess-info.txt
其中{port}
是mysql服務的端口,{user}
是用戶名 ,{password}
是此用戶的密碼(注意這里的密碼和前面的-p
是挨著一起的,兩者間沒有空格), {host}
是mysql服務器的ip或主機名 ,~/proccess-info.txt
是輸出的文件名
此時將mysql的進程信息輸出到mysql 你就可以使用grep命令過濾出你需要的死鎖信息了
cat ~/proccess-info.txt | grep {dbname} | grep Locked
第一行就是死鎖的線程id,然后就可以在mysql的客戶端中使用kill命令殺掉這個線程
(注意是mysql的客戶端中使用kill,不是linux的shell終端中,linux的kill命令只能殺進程而無法殺線程,這里輸出的這個390033是mysql的一個線程id,只能在mysql的客戶端中起作用)
當然上面的兩步查找死鎖線程可以合成一步處理,
mysql -P {port} -u {user} -p{password} -h {host} {dbname} -e 'SHOW full PROCESSLIST;' | grep {dbname} | grep Locked
另外我們也可以查看慢sql,通過sort查看耗時較長的sql
cat ~/draft/mysql_proc.txt | grep {dbname} | sed 's/\t/,/g' | sort -t',' -k6,6nr | head -n 10
其中-k6,6nr
表示對第6列數字進行降序排序(第6列式耗時Time
字段)