查看当前连接情况
查询语句:
show processlist;
select * from information_schema.processlist;
官方描述:http://dev.mysql.com/doc/refman/5.7/en/show-processlist.html
查询权限
如果使用root用户则可以查看mysql的所有连接,如果普通用户,仅能查看当前用户的连接。
例如:
root用户查看连接如下:有root用户的连接,有developer用户的连接。
developer用户查看连接:仅有当前用户的连接。
查出的信息有,线程id,用户,客户端ip,连接的db库,连接命令,连接时间,状态,sql语句详细信息。
最大连接数
# 查看当前最大连接数
show variables like '%max_connections%';
# 设置当前服务最大连接数,mysql重启失效
set GLOBAL max_connections = 2000;
my.cnf配置文件增加max_connections=2000
配置,重启mysql生效。
如果要修改,两个都要修改。
线程id
线程id可以使用SELECT CONNECTION_ID();
查询得到。
这里指的线程id为mysql自己为每一个线程标示的id,非服务器系统线程id。
系统线程id可以通过表performance_schema.threads查询出来。
比如我们要查询上面线程id为30655的系统线程id。
SELECT * FROM performance_schema.threads where PROCESSLIST_ID = 30655;
查询结果如下:
表performance_schema.threads的PROCESSLIST_ID即等于表information_schema.processlist的ID。
查询结果中有一个字段THREAD_OS_ID,这个2310的id才是系统线程id。
可以进入linux系统查看:
ps -ef | grep mysqld
上图中标出的为mysql进程的PID。然后查找SPID:
ps -T -p 6059
标示出的即为我们查找的msyql里面线程id为30655的系统线程id2310。
删除连接
根据information_schema.processlist的ID可以删除这个连接。
使用PHP创建一个长连接。
然后我们删除它。
kill 31085;
再查看这个连接已经不存在了。
实时监控mysql链接
比如下面watch.sh,实时监控指定数据库中,链接时间大于60秒的链接。可以根据自己需要去修改sql。
cmd="select * from information_schema.processlist where db = 'database_name' and time > 60 order by TIME desc;"
watch -n 0.01 -t "mysql -h127.0.0.1 -u[user] -p[passwd] -e \"$cmd\" | tee -a ./processlist.log"
执行
chmod +x ./watch.sh
./watch.sh
命令运行可以看到当前链接列表
批量删除链接
使用PHP创造100个连接:
$dsn = 'mysql:dbname=dbname;host=host';
$user = 'user';
$password = 'password';
try {
for($i=1;$i<=100;$i++){
$dbh[$i] = new \PDO($dsn, $user, $password);
}
} catch (\PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
sleep(300);
kill.sh
HOST_NAME=mysql
PORT=3306
DB_NAME=default
USER_NAME=default
PASSWD='secret'
# 删除链接的时候要特别注意,尽量别用root,可能会把别的链接关闭了,比如主从复制进程,其他链接池等别的进程。
con="mysql -h $HOST_NAME -P$PORT -D$DB_NAME -u$USER_NAME -p$PASSWD -s -e"
sql="select id from information_schema.processlist where db = '$DB_NAME' AND time > 10 order by time desc limit 1000;"
rows=$($con "${sql}")
for row in $rows
do
kill_sql="kill $row;"
echo $kill_sql
$($con "${kill_sql}")
done
执行
chmod +x ./kill.sh
./kill.sh