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程序中实现分布式进程的教程
Apr 28 Python
Python中用于计算对数的log()方法
May 15 Python
Django框架中的对象列表视图使用示例
Jul 21 Python
Python yield 使用方法浅析
May 20 Python
使用python实现链表操作
Jan 26 Python
用python标准库difflib比较两份文件的异同详解
Nov 16 Python
python实现Flappy Bird源码
Dec 24 Python
通过cmd进入python的实例操作
Jun 26 Python
PyTorch中Tensor的维度变换实现
Aug 18 Python
Python常用数据类型之间的转换总结
Sep 06 Python
用于ETL的Python数据转换工具详解
Jul 21 Python
python 进制转换 int、bin、oct、hex的原理
Jan 13 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
在windows iis5下安装php4.0+mysql之我见
2006/10/09 PHP
php使用pear_smtp发送邮件
2016/04/15 PHP
PhpStorm配置Xdebug调试的方法步骤
2019/02/02 PHP
跟着JQuery API学Jquery 之三 筛选
2010/04/09 Javascript
Javascript insertAfter() 实现函数代码
2011/10/12 Javascript
JavaScript学习笔记(一) js基本语法
2011/10/25 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
通过JS动态创建一个html DOM元素并显示
2014/10/15 Javascript
基于jquery编写分页插件
2016/03/07 Javascript
JavaScript中setTimeout和setInterval函数的传参及调用
2016/03/11 Javascript
JavaScript设计模式之单体模式全面解析
2016/09/09 Javascript
微信小程序 开发工具快捷键整理
2016/10/31 Javascript
使用Ajax与服务器(JSON)通信实例
2016/11/04 Javascript
基于LayUI实现前端分页功能的方法
2017/07/22 Javascript
Angular实现下载安装包的功能代码分享
2017/09/05 Javascript
React Native使用百度Echarts显示图表的示例代码
2017/11/07 Javascript
vue input输入框模糊查询的示例代码
2018/05/22 Javascript
JS实现的小火箭发射动画效果示例
2018/12/08 Javascript
JavaScript实现的鼠标跟随特效示例【2则实例】
2018/12/22 Javascript
Vue起步(无cli)的啊教程详解
2019/04/11 Javascript
浅谈javascript如何获取文件后缀名
2020/08/07 Javascript
node.js如何操作MySQL数据库
2020/10/29 Javascript
使用python开发vim插件及心得分享
2014/11/04 Python
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
Django unittest 设置跳过某些case的方法
2018/12/26 Python
使用python脚本自动创建pip.ini配置文件代码实例
2019/09/20 Python
简单了解Python读取大文件代码实例
2019/12/18 Python
Python 支持向量机分类器的实现
2020/01/15 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
2020/04/26 Python
Python txt文件如何转换成字典
2020/11/03 Python
Python操作Excel的学习笔记
2021/02/18 Python
远程学习的教学用品和家庭学习资源:Really Good Stuff
2020/04/27 全球购物
2014年后备干部工作总结
2014/12/08 职场文书
离职信范本
2015/06/23 职场文书
六一儿童节新闻稿
2015/07/17 职场文书
python如何进行基准测试
2021/04/26 Python