最近的项目刚开始上线,以前没觉得什么,现在客户都反应系统反应太慢,需要解决,于是我在服务器查看了一下CPU占用情况,果然,mysql数据库就占了百分之九十六七,所以想到了必须要使CPU占用率降下来。
(1)show processlist; 结果如下
mysql> show processlist; +--------+-----------------+--------------------+------+---------+---------+-----------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +--------+-----------------+--------------------+------+---------+---------+-----------------------------+------------------+ | 4522 | event_scheduler | localhost | NULL | Daemon | 2315739 | Waiting for next activation | NULL | | 258137 | CMAbutler | 10.14.85.121:55035 | CMA | Sleep | 5337 | | NULL | | 258138 | CMAbutler | 10.14.85.121:55036 | NULL | Sleep | 5360 | | NULL | | 260446 | root | localhost | NULL | Query | 0 | NULL | show processlist | | 264040 | root | localhost | CMA | Sleep | 0 | | NULL | +--------+-----------------+--------------------+------+---------+---------+-----------------------------+------------------+ 5 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 语句就显示不全,但是一个判断问题语句的重要依据。
常见问题 :
一般是睡眠连接过多,严重消耗mysql 服务器资源 ( 主要是 cpu, 内存 ) ,并可能导致 mysql 崩溃。
(2)首先查看等待时间
mysql> show global variables like 'wait_timeout'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | wait_timeout | 28800 | +---------------+-------+ 1 row in set (0.00 sec)
(3)重设值
mysql> set global wait_timeout=200;