MySQL--SHOW PROCESSLIST
在MySQL中,可以通过SHOW PROCESSLIST命令来查看当前线程:
show processlist; +----+------+-----------+------+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+------+---------+------+-------+------------------+ | 8 | root | localhost | NULL | Sleep | 20 | | NULL | | 9 | root | localhost | NULL | Query | 0 | init | show processlist | +----+------+-----------+------+---------+------+-------+------------------+
SHOW PROCESSLIST命令的输出结果显示了有哪些线程在运行,不仅可以查看当前所有的连接数,还可以查看当前的连接状态。
输出结果列信息为:
(1)id列,用户登录mysql时,系统分配的“connection_id” (2)user列,显示当前用户。如果不是root,这个命令就只显示用户权限范围的sql语句 (3)host列,显示这个语句是从哪个ip的哪个端口上发的,可以用来跟踪出现问题语句的用户 (4)db列,显示这个进程目前连接的是哪个数据库 (5)command列,显示当前连接的执行的命令,一般取值为休眠(sleep),查询(query),连接(connect) (6)time列,显示这个状态持续的时间,单位是秒 (7)state列,显示使用当前连接的sql语句的状态 (8)info列,显示这个sql语句,是判断问题语句的一个重要依据。
SHOW FULL PROCESSLIST用来显示完整的Info列信息,等价于:
select * from information_schema.processlist;
循环输入日志
输出执行时间超过1秒的进程
#=============================================## ## mysql config ## mysql_host="127.0.0.1" mysql_port=3306 mysql_user="root" mysql_password="root" process_log="/export/mysql_tools/show_mysql_process/${mysql_host}-$(date "+%Y%m%d").log" tmp_process_log="/export/mysql_tools/show_mysql_process/${mysql_host}-$(date "+%Y%m%d").tmp" show_process_script=" SELECT * FROM information_schema.processlist WHERE COMMAND NOT IN('Sleep','Binlog Dump') AND ID<>CONNECTION_ID() AND TIME>0 \G " ##=============================================## ## loop running for i in `seq 1000`; do echo "============$(date "+%Y-%m-%d %H:%M:%S")=============">>"${process_log}" /usr/bin/mysql \ --host="${mysql_host}" \ --port=${mysql_port} \ --user="${mysql_user}" \ --password="${mysql_password}" \ --database="mysql" \ --batch \ --execute="${show_process_script}" \ 1>"${tmp_process_log}" \ 2>/dev/null cat "${tmp_process_log}" |sed 's/[ ][ ]*/ /g'|sed 's/^[ \t]*//g'|grep -v "^$">>"${process_log}" sleep 1 done ##=============================================##