前言:

在数据库运维过程中,我们时常会关注数据库的链接情况,比如总共有多少链接、有多少活跃链接、有没有执行时间过长的链接等。数据库的各种异常也能通过链接情况间接反应出来,特别是数据库出现死锁或严重卡顿的时候,我们首先应该查看数据库是否有异常链接,并杀掉这些异常链接。本篇文章将主要介绍如何查看数据库链接及如何杀掉异常链接的方法。

1.查看数据库链接

查看数据库链接最常用的语句就是 show processlist 了,这条语句可以查看数据库中存在的线程状态。普通用户只可以查看当前用户发起的链接,具有 PROCESS 全局权限的用户则可以查看所有用户的链接。

show processlist 结果中的 Info 字段仅显示每个语句的前 100 个字符,如果需要显示更多信息,可以使用 show full processlist 。同样的,查看 information_schema.processlist 表也可以看到数据库链接状态信息。

  1. # 普通用户只能看到当前用户发起的链接
  2. mysql> select user();
  3. +--------------------+
  4. | user() |
  5. +--------------------+
  6. | testuser@localhost |
  7. +--------------------+
  8. 1 row in set (0.00 sec)
  9. mysql> show grants;
  10. +----------------------------------------------------------------------+
  11. | Grants for testuser@% |
  12. +----------------------------------------------------------------------+
  13. | GRANT USAGE ON *.* TO 'testuser'@'%' |
  14. | GRANT SELECT, INSERT, UPDATE, DELETE ON `testdb`.* TO 'testuser'@'%' |
  15. +----------------------------------------------------------------------+
  16. 2 rows in set (0.00 sec)
  17. mysql> show processlist;
  18. +--------+----------+-----------+--------+---------+------+----------+------------------+
  19. | Id | User | Host | db | Command | Time | State | Info |
  20. +--------+----------+-----------+--------+---------+------+----------+------------------+
  21. | 769386 | testuser | localhost | NULL | Sleep | 201 | | NULL |
  22. | 769390 | testuser | localhost | testdb | Query | 0 | starting | show processlist |
  23. +--------+----------+-----------+--------+---------+------+----------+------------------+
  24. 2 rows in set (0.00 sec)
  25. mysql> select * from information_schema.processlist;
  26. +--------+----------+-----------+--------+---------+------+-----------+----------------------------------------------+
  27. | ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO |
  28. +--------+----------+-----------+--------+---------+------+-----------+----------------------------------------------+
  29. | 769386 | testuser | localhost | NULL | Sleep | 210 | | NULL |
  30. | 769390 | testuser | localhost | testdb | Query | 0 | executing | select * from information_schema.processlist |
  31. +--------+----------+-----------+--------+---------+------+-----------+----------------------------------------------+
  32. 2 rows in set (0.00 sec)
  33. # 授予了PROCESS权限后,可以看到所有用户的链接
  34. mysql> grant process on *.* to 'testuser'@'%';
  35. Query OK, 0 rows affected (0.01 sec)
  36. mysql> flush privileges;
  37. Query OK, 0 rows affected (0.00 sec)
  38. mysql> show grants;
  39. +----------------------------------------------------------------------+
  40. | Grants for testuser@% |
  41. +----------------------------------------------------------------------+
  42. | GRANT PROCESS ON *.* TO 'testuser'@'%' |
  43. | GRANT SELECT, INSERT, UPDATE, DELETE ON `testdb`.* TO 'testuser'@'%' |
  44. +----------------------------------------------------------------------+
  45. 2 rows in set (0.00 sec)
  46. mysql> show processlist;
  47. +--------+----------+--------------------+--------+---------+------+----------+------------------+
  48. | Id | User | Host | db | Command | Time | State | Info |
  49. +--------+----------+--------------------+--------+---------+------+----------+------------------+
  50. | 769347 | root | localhost | testdb | Sleep | 53 | | NULL |
  51. | 769357 | root | 192.168.85.0:61709 | NULL | Sleep | 521 | | NULL |
  52. | 769386 | testuser | localhost | NULL | Sleep | 406 | | NULL |
  53. | 769473 | testuser | localhost | testdb | Query | 0 | starting | show processlist |
  54. +--------+----------+--------------------+--------+---------+------+----------+------------------+
  55. 4 rows in set (0.00 sec)

通过 show processlist 所得结果,我们可以清晰了解各线程链接的详细信息。具体字段含义还是比较容易理解的,下面具体来解释下各个字段代表的意思:

  • Id:就是这个链接的唯一标识,可通过 kill 命令,加上这个Id值将此链接杀掉。
  • User:就是指发起这个链接的用户名。
  • Host:记录了发送请求的客户端的 IP 和 端口号,可以定位到是哪个客户端的哪个进程发送的请求。
  • db:当前执行的命令是在哪一个数据库上。如果没有指定数据库,则该值为 NULL 。
  • Command:是指此刻该线程链接正在执行的命令。
  • Time:表示该线程链接处于当前状态的时间。
  • State:线程的状态,和 Command 对应。
  • Info:记录的是线程执行的具体语句。

当数据库链接数过多时,筛选有用信息又成了一件麻烦事,比如我们只想查某个用户或某个状态的链接。这个时候用 show processlist 则会查找出一些我们不需要的信息,此时使用 information_schema.processlist 进行筛选会变得容易许多,下面展示几个常见筛选需求:

  1. # 只查看某个ID的链接信息
  2. select * from information_schema.processlist where id = 705207;
  3. # 筛选出某个用户的链接
  4. select * from information_schema.processlist where user = 'testuser';
  5. # 筛选出所有非空闲的链接
  6. select * from information_schema.processlist where command != 'Sleep';
  7. # 筛选出空闲时间在600秒以上的链接
  8. select * from information_schema.processlist where command = 'Sleep' and time > 600;
  9. # 筛选出处于某个状态的链接
  10. select * from information_schema.processlist where state = 'Sending data';
  11. # 筛选某个客户端IP的链接
  12. select * from information_schema.processlist where host like '192.168.85.0%';

2.杀掉数据库链接

如果某个数据库链接异常,我们可以通过 kill 语句来杀掉该链接,kill 标准语法是:KILL [CONNECTION | QUERY] processlist_id;

KILL 允许使用可选的 CONNECTION 或 QUERY 修饰符:

  • KILL CONNECTION 与不含修改符的 KILL 一样,它会终止该 process 相关链接。
  • KILL QUERY 终止链接当前正在执行的语句,但保持链接本身不变。

杀掉链接的能力取决于 SUPER 权限:

  • 如果没有 SUPER 权限,则只能杀掉当前用户发起的链接。
  • 具有 SUPER 权限的用户,可以杀掉所有链接。

遇到突发情况,需要批量杀链接时,可以通过拼接 SQL 得到 kill 语句,然后再执行,这样会方便很多,分享几个可能用到的杀链接的 SQL :

  1. # 杀掉空闲时间在600秒以上的链接,拼接得到kill语句
  2. select concat('KILL ',id,';') from information_schema.`processlist`
  3. where command = 'Sleep' and time > 600;
  4. # 杀掉处于某个状态的链接,拼接得到kill语句
  5. select concat('KILL ',id,';') from information_schema.`processlist`
  6. where state = 'Sending data';
  7. select concat('KILL ',id,';') from information_schema.`processlist`
  8. where state = 'Waiting for table metadata lock';
  9. # 杀掉某个用户发起的链接,拼接得到kill语句
  10. select concat('KILL ',id,';') from information_schema.`processlist`
  11. user = 'testuser';

这里提醒下,kill 语句一定要慎用!特别是此链接执行的是更新语句或表结构变动语句时,杀掉链接可能需要比较长时间的回滚操作。

总结:

本篇文章讲解了查看及杀掉数据库链接的方法,以后怀疑数据库有问题,可以第一时间看下数据库链接情况。

MySQL查看及杀掉链接方法大全的更多相关文章

  1. MySql查看与修改auto_increment方法(转)

    add by zhj:  在创建表时,如果没有显式的指定AUTO_INCREMENT的值,那它默认是1 原文:https://blog.csdn.net/fdipzone/article/detail ...

  2. mysql查看死锁及解锁方法

    解除正在死锁的状态有两种方法: 第一种: 1.查询是否锁表 show OPEN TABLES where In_use > 0; 2.查询进程(如果您有SUPER权限,您可以看到所有线程.否则, ...

  3. mysql查看被锁住的表,正在进行的进程,已经杀掉进程的方法

    mysql查看被锁的进程 //查看所有进程show processlist; //查询是否锁表show OPEN TABLES where In_use > 0; //查看被锁住的 SELECT ...

  4. Docker MySql 查看版本的三种方法

    目录 Docker MySql 查看版本的三种方法 1.mysql -V命令查看版本 2.status命令查看版本 3.version命令查看版本 Docker MySql 查看版本的三种方法 1.m ...

  5. MySQL查看、创建和删除索引的方法

    本文实例讲述了MySQL查看.创建和删除索引的方法.分享给大家供大家参考.具体如下: 1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别 ...

  6. 查看Linux 、Nginx、 MySQL 、 PHP 版本的方法

    参考:查看Linux .Apache . MySQL . PHP 版本的方法 1.查看Linux版本: uname -a: more /etc/issue; cat /proc/version; 2. ...

  7. ubuntu查看mysql版本的几种方法

    ubuntu查看mysql版本的几种方法 mysql 1:在终端下:mysql -V(大写) //代码 $ mysql -V mysql Ver 14.14 Distrib 5.5.46, for d ...

  8. MySQL查看用户权限的两种方法

    http://yanue.net/post-96.html MySQL查看用户权限命令的两方法: 一. 使用MySQL grants MySQL grant详细用法见:http://yanue.net ...

  9. linux下查看mysql版本的四种方法

    Linux查看MySQL版本的四种方法 1 在终端下执行 mysql -V 2 在help中查找 mysql --help |grep Distrib 3 在mysql 里查看 select vers ...

随机推荐

  1. 在C#中使用 CancellationToken 处理异步任务

    在 .NET Core 中使用异步编程已经很普遍了, 你在项目中随处可见 async 和 await,它简化了异步操作,允许开发人员,使用同步的方式编写异步代码,你会发现在大部分的异步方法中,都提供了 ...

  2. vue文本滚动组件

    看了好多网上的文本组件,发现好多都有这样那样的问题:特别是滚动的时候失真的感觉,今天整合了文本滚动的方式用CSS的 animation写出一套组件:VUE项目直接用.感觉有用的朋友关注下   效果图, ...

  3. INTERSPEECH2020 语音情感分析论文之我见

    摘要:本文为大家带来InterSpeech2020 语音情感分析25篇论文中的其中8篇的总结. 本文分享自华为云社区<INTERSPEECH2020 语音情感分析论文总结一>,原文作者:T ...

  4. 自己挖的坑自己填--jxl进行Excel下载堆内存溢出问题

    今天在进行使用 jxl 进行 Excel 下载时,由于数据量大(4万多条接近5万条数据的下载),数据结构过于负责,存在大量大对象(虽然在对象每次用完都设置为null,但还是存在内存溢出问题),加上本地 ...

  5. InlineHook

    前言 IATHOOK局限性较大,当我们想HOOK一个普通函数,并不是API,或者IAT表里并没有这个API函数(有可能他自己LoadLibrary,自己加载的),那我们根本就从导入表中找不到这个函数, ...

  6. 「HTML+CSS」--自定义加载动画【007】

    前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...

  7. PhpStorm/WebStorm实用技巧

    我常用的IDE设置和功能 1) 使用IDE管理远程主机 Tools -> Deployment -> Browse Remote Host 其中功能十分强大 自己去探索 关键提示: 手动/ ...

  8. 给我一个shell我能干翻你内网

    0x00 前言 在去年小菜鸡学了点内网知识就闲着没事跑点jboss的站看看,在经历过很多次内网横向失败之后终于算是人生圆满了一把,阿三的站一般进去之后很难横向,不知道是不是我太菜的原因,反正阿三的站能 ...

  9. 用RUST写流媒体服务器实战——rtmp chunk 深入解析

    用RUST写流媒体服务器实战--rtmp chunk 深入解析 最近几个月断更了,把精力放在了新的开源项目上,一个用rust写的流媒体服务xiu. 实现过程中踩了不少坑,今天说下rtmp中的chunk ...

  10. (十六)VMware Harbor 复制镜像

    Step 1: 点击复制镜像后 Step 2: 填写复制镜像信息 Step 3:在sx628下,会多出一个镜像