查询事务
SELECT * FROM information_schema.INNODB_TRXG;
查询正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
查询等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
查询进程
show full PROCESSLIST;
查询是否锁表
show OPEN TABLES where In_use > 0;
查看执行慢于多少秒的SQL会记录到日志文件中
mysql> show variables like 'long_query_time';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| long_query_time | 1 |
+-----------------+-------+
1 row in set (0.00 sec)
这里value=1, 表示1秒
查看mysql正在执行的SQL语句
1)我们先通过status命令查看Mysql运行状态
mysql> status;
--------------
mysql Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1
Connection id: 5253971
Current database:
Current user: root@10.100.2.44
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.6.28-cdb2016-log 20180130
Protocol version: 10
Connection: 10.100.2.12 via TCP/IP
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
TCP port: 3306
Uptime: 324 days 21 hours 40 min 2 sec
Threads: 794 Questions: 9943084367 Slow queries: 86565 Opens: 374570 Flush tables: 1 Open tables: 512 Queries per second avg: 354.204
--------------
在上面显示列表的最后一条,我们来查看Slow queries这一项的值,如果多次查看的值大于0的话,说明有些查询sql命令执行时间过长。
2)这时再通过show processlist命令来查看当前正在运行的SQL,从中找出运行慢的SQL语句,找到执行慢的语句后,再用explain命令查看这些语句的执行计划。
mysql> show processlist;
+---------+-------------+-------------------+-------+------------------+----------+-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+---------+-------------+-------------------+-------+------------------+----------+-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+
| 38 | tencentroot | :55883 | NULL | Binlog Dump GTID | 28070125 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL |
| 60039 | tencentroot | :60501 | NULL | Sleep | 16 | | NULL |
| 4693581 | tencentroot | :42223 | NULL | Sleep | 0 | | NULL |
| 4825829 | root | 10.100.2.44:58140 | wxqyh | Sleep | 43 | | NULL |
| 4825831 | root | 10.100.2.44:58144 | wxqyh | Sleep | 43 | | NULL |
| 4825833 | root | 10.100.2.44:58148 | wxqyh | Sleep | 43 | | NULL |
| 4825835 | root | 10.100.2.44:58152 | wxqyh | Sleep | 43 | | NULL |
| 5253325 | root | 10.100.2.4:54602 | wxqyh | Query | 1 | Sending data | SELECT p.id,p.org_id,p.person_id,p.ranges,p.children_count,p.parent_id, u.user_name FROM tb_qy_mana |
.......
+---------+-------------+-------------------+-------+------------------+----------+-----------------------------------------------------------------------+----------------------------------------------------------------------------------------------------+
796 rows in set (0.00 sec)
或者
mysql> select * from information_schema.`PROCESSLIST` where info is not null;
+---------+------+-------------------+--------------------+---------+------+--------------+----------------------------------------------------------------------------------------------------------------------------+
| ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO |
+---------+------+-------------------+--------------------+---------+------+--------------+----------------------------------------------------------------------------------------------------------------------------+
| 5253186 | root | 10.100.2.23:45704 | wxqyh | Query | 0 | Sending data | select count(id) as all_user from tb_qy_user_info where ORG_ID= '4fe5564c-92df-4016-914e-ac439133e672' and USER_STATUS='2' |
| 5253971 | root | 10.100.2.44:58820 | information_schema | Query | 0 | executing | select * from information_schema.`PROCESSLIST` where info is not null |
+---------+------+-------------------+--------------------+---------+------+--------------+----------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
简单说一下各列的含义和用途,
id列 , 不用说了吧,一个标识,你要 kill 一个语句的时候很有用。
user列, 显示单前用户,如果不是 root ,这个命令就只显示你权限范围内的 sql 语 句。
host 列,显示这个语句是从哪个 ip 的哪 个端口上发出的。呵呵,可以用来追踪出问题语句的用户。
db 列,显示这个进程目前连接的是 哪个数据库 。
command 列,显示当前连接的执行的命令,一般就是休眠( sleep ),查询( query ),连接( connect )。
time 列,此这个状态持续的时间,单位是秒。
state 列,显示使用当前连接的 sql 语句的状态,很重要的列,后续会有所有的状态的描述,请注意, state 只是语句执行中的某一个状态,一个 sql 语 句,已查询为例,可能需要经过 copying to tmp table ,Sorting result , Sending data 等状态才 可以完成,
info 列,显示这个 sql 语 句,因为长度有限,所以长的 sql 语句就显示不全,但是一个判断问题语句的重要依据。
中止掉上面查到的某个线程
kill id; - 示例: mysql>kill 277801;
当MySQL繁忙的时候运行show processlist,会发现有很多行输出,每行输出对应一个MySQL连接。怎么诊断发起连接的进程是哪个?它当前正在干嘛呢?
首先,需要通过TCP Socket而不是Unix Socket连接MySQL,这样在show processlist的输出中就会有来源端口号。如下,
mysql> show processlist;
+——–+——–+—————–+——+———+——+——-+——————+
| Id | User | Host | db | Command | Time | State | Info |
+——–+——–+—————–+——+———+——+——-+——————+
| 277801 | mydbuser | localhost:35558 | mydb | Sleep | 1 | | NULL |
| 277804 | mydbuser | localhost:35561 | mydb | Sleep | 1 | | NULL |
| 277805 | mydbuser | localhost:35562 | mydb | Sleep | 0 | | NULL |
+——–+——–+—————–+——+———+——+——-+——————+
在Host列有来源IP和端口号,然后我们从连接机器查看端口号是谁打开的,
[root@localhost ~]# netstat -ntp | grep 35558
… 124.115.0.68:35558 ESTABLISHED 18783/httpd
可知进程18783发起的MySQL连接来源端口是35558,然后就可以用strace观察这个进程了。