文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL查看及杀掉链接方法大全

2024-12-03 11:12

关注

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

[[381236]]

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

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

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

 

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

2.杀掉数据库链接

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

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

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

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

 

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

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

总结:

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

来源:MySQL技术内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯