低权限(无权限)时如何在mysql客户端控制台的大量输出中快速定位mysql死锁或慢sql

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

你可能感兴趣的:(mysql,sql,数据库死锁)