mysql查看连接情况(V5.7.12)

查看当前连接情况

查询语句:

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值