python自动结束mysql慢查询会话的实例代码


Posted in Python onOctober 27, 2019

生产环境的有些sql查询写得太复杂,或是表很大,对应索引未建立或建立不合理,或是查询未充分使用索引等,就有可能出现慢查询,一些慢查询需要修改程序,可能没那么快能解决,这时如果有个脚本能自动检测符合条件的慢查询会话并结束,那么是很方便的,当然运维人员也可顺便弄个检测慢查询并告警的脚本。

涉及知识点

  • mysql慢查询会话查询
  • schedule定时任务调度
  • pymysql执行sql

代码分解

mysql慢查询

#会话查询,只能查询所有会话,不能按条件过滤,不过比较好记
show PROCESSLIST;
#从information_schema中查询会话,可以按条件过滤
SELECT
 *
FROM
 information_schema.`PROCESSLIST`;
#查询符合条件的慢会话,id是会话ID,info是正在执行的sql,time是会话持续时间,杀会话时注意要做好过滤
SELECT
 id,
 info,
 time
FROM
 information_schema.`PROCESSLIST`
WHERE
 info LIKE '%select * from table%'
AND time > 10;
#直接使用sql批量杀会话,拼接kill xxx;后,拷贝了在控制台执行
SELECT
 concat('KILL ', id, ';')
FROM
 information_schema.`PROCESSLIST`
WHERE
 info LIKE '%select * from table%'
AND time > 10;

脚本主入口

if __name__ == '__main__':
 #每5秒执行检查任务
 schedule.every(5).seconds.do(kill_slow)
 #此处固定写法,意思是每秒钟schedule看下是否有pending的任务,有就执行
 while True:
  schedule.run_pending()
  time.sleep(1)
schedule的其它示例
import schedule
import time
def job(message='stuff'):
 print("I'm working on:", message)
#每10分钟
schedule.every(10).minutes.do(job)
#每小时
schedule.every().hour.do(job, message='things')
#每天10点30分
schedule.every().day.at("10:30").do(job)
while True:
 schedule.run_pending()
 time.sleep(1)

pymysql使用

# 连接数据库,设置结果集用dict返回,autocommit自动提交事务
db = pymysql.connect(host='localhost', db='dbname',
      user='root', passwd='admin',
      port=3306, charset='utf8',
      cursorclass=pymysql.cursors.DictCursor, autocommit=True)
cursor = db.cursor()

查询符合条件的慢会话并结束

def kill_slow():
  cursor.execute(
    """
    SELECT
      id,
      info,
      time
    FROM
      information_schema.`PROCESSLIST`
    WHERE
      info LIKE '%select * from table%'
    AND time > 10;
    """)
  slow_sessions = cursor.fetchall()
  for slow_session in slow_sessions:
    print("slow session detected, kill it:\n id:%s\nsql:%s" % (
      slow_session[0], slow_session[1]))
    cursor.execute("kill %s", slow_session[0])

完整代码

import time
import pymysql
import schedule
# 连接数据库,设置结果集用dict返回,autocommit自动提交事务
db = pymysql.connect(host='localhost', db='dbname',
           user='root', passwd='admin',
           port=3306, charset='utf8',
           cursorclass=pymysql.cursors.DictCursor, autocommit=True)
cursor = db.cursor()
def kill_slow():
  cursor.execute(
    """
    SELECT
      id,
      info,
      time
    FROM
      information_schema.`PROCESSLIST`
    WHERE
      info LIKE '%select * from table%'
    AND time > 10;
    """)
  slow_sessions = cursor.fetchall()
  for slow_session in slow_sessions:
    print("slow session detected, kill it:\n id:%s\nsql:%s" % (
      slow_session[0], slow_session[1]))
    cursor.execute("kill %s", slow_session[0])
if __name__ == '__main__':
  # 每5秒执行检查任务
  schedule.every(5).seconds.do(kill_slow)
  # 此处固定写法,意思是每秒钟schedule看下是否有pending的任务,有就执行
  while True:
    schedule.run_pending()
    time.sleep(1)

总结

以上所述是小编给大家介绍的python自动结束mysql慢查询会话的实例代码,希望对大家有所帮助!

Python 相关文章推荐
python调用短信猫控件实现发短信功能实例
Jul 04 Python
Linux下编译安装MySQL-Python教程
Feb 02 Python
python2.7的编码问题与解决方法
Oct 04 Python
python3+PyQt5重新实现QT事件处理程序
Apr 19 Python
Python 在字符串中加入变量的实例讲解
May 02 Python
详解Python 装饰器执行顺序迷思
Aug 08 Python
浅析python中numpy包中的argsort函数的使用
Aug 30 Python
Python实现DDos攻击实例详解
Feb 02 Python
Python 自动登录淘宝并保存登录信息的方法
Sep 04 Python
Python 中判断列表是否为空的方法
Nov 24 Python
浅谈django框架集成swagger以及自定义参数问题
Jul 07 Python
python pip如何手动安装二进制包
Sep 30 Python
python实现输入任意一个大写字母生成金字塔的示例
Oct 27 #Python
python 爬虫百度地图的信息界面的实现方法
Oct 27 #Python
python用类实现文章敏感词的过滤方法示例
Oct 27 #Python
通过字符串导入 Python 模块的方法详解
Oct 27 #Python
python实现树的深度优先遍历与广度优先遍历详解
Oct 26 #Python
python图的深度优先和广度优先算法实例分析
Oct 26 #Python
python单例模式原理与创建方法实例分析
Oct 26 #Python
You might like
谈谈从phpinfo中能获取哪些值得注意的信息
2017/03/28 PHP
js prototype 格式化数字 By shawl.qiu
2007/04/02 Javascript
IE 上下滚动展示模仿Marquee机制
2009/12/20 Javascript
Javascript模块化编程(一)AMD规范(规范使用模块)
2013/01/17 Javascript
JQuery加载图片自适应固定大小的DIV
2013/09/12 Javascript
checkbox全选所涉及到的知识点介绍
2013/12/31 Javascript
Firefox下无法正常显示年份的解决方法
2014/09/04 Javascript
node.js中的fs.mkdir方法使用说明
2014/12/17 Javascript
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
javascript跨域原因以及解决方案分享
2015/04/08 Javascript
javascript操作ul中li的方法
2015/05/14 Javascript
javascript实现选中复选框后相关输入框变灰不可用的方法
2015/08/11 Javascript
快速学习jQuery插件 Form表单插件使用方法
2015/12/01 Javascript
javascript中的面向对象
2017/03/30 Javascript
Angularjs 实现移动端在线测评效果(推荐)
2017/04/05 Javascript
简单实现js轮播图效果
2017/07/14 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
2017/09/08 Javascript
详解angularjs 学习之 scope作用域
2018/01/15 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
JS使用new操作符创建对象的方法分析
2019/05/30 Javascript
layui文件上传控件带更改后数据传值的方法
2019/09/23 Javascript
js实现坦克大战游戏
2020/02/24 Javascript
Python实现修改文件内容的方法分析
2018/03/25 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
python 利用已有Ner模型进行数据清洗合并代码
2019/12/24 Python
通过python检测字符串的字母
2020/02/18 Python
python简单实现9宫格图片实例
2020/09/03 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
CSS类名支持中文命名的示例
2014/04/04 HTML / CSS
Backcountry旗下的户外商品闪购网站:steep&cheap
2016/09/22 全球购物
别名指示符是什么
2012/10/08 面试题
比赛口号大全
2014/06/10 职场文书
老乡会致辞
2015/07/28 职场文书
2016十一国庆节慰问信
2015/12/01 职场文书