查看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
字段)