今天工作中突然出现MySQL某表长期锁表,SQL造成堆积的情况,紧急使用show processlist命令查看,发现超过800个MySQL连接。怀疑发生表死锁,希望查看最前面的几条数据,尝试使用
SHOW `processlist` LIMIT 10;
SHOW `processlist` INTO OUTFILE '/tmp/process.list'
SHOW `processlist` WHERE ...
发现均不支持。 查询文档后发现几个方案:
- processlist 实际上是information_schema数据库的一张表,于是通过查表的方式一定是可以实现的:
SELECT `user`, `host`, `time`, `command`, `time`
FROM `information_schema`.`processlist`
WHERE `user` = 'me' AND `state` IS NOT NULL;
但是,作为RD线上数据库我们很可能没有足够的权限查看此表,只能使用其他方法进行查看 2. 使用mysql shell命令导出mysql -e 可以直接执行sql,并返回结果
$ mysql -uusername -p -e 'show processlist' > process.list
- 使用mysqladmin 命令,mysqladmin与mysql命令一样都是mysql官方提供的shell操作命令,提供了常用的管理工具
$ mysql -uusername -p processlist > process.list
总结
三种方案都可以解决查看所有进程的需求,但是mysqladmin命令有两个额外的配置项,我们查看mysqladmin的帮助文档可以看到:
Administration program for the mysqld daemon.
Usage: mysqladmin [OPTIONS] command command....
-c, --count=# Number of iterations to make. This works with -i
-i, --sleep=# Execute commands repeatedly with a sleep between.
-i 命令可以设置查询间隔 -c 命令可以可以设置查询次数 以此可实现更完善的数据库运行状态分析