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 相关文章推荐
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
Apr 11 Python
举例讲解Python中的Null模式与桥接模式编程
Feb 02 Python
Python做文本按行去重的实现方法
Oct 19 Python
Python解惑之True和False详解
Apr 24 Python
python 连接各类主流数据库的实例代码
Jan 30 Python
Python实现快速傅里叶变换的方法(FFT)
Jul 21 Python
对pandas里的loc并列条件索引的实例讲解
Nov 15 Python
Selenium常见异常解析及解决方案示范
Apr 10 Python
浅谈django channels 路由误导
May 28 Python
python 实现有道翻译功能
Feb 26 Python
python保存图片的四个常用方法
Feb 28 Python
python基础之//、/与%的区别详解
Jun 10 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
php empty() 检查一个变量是否为空
2011/11/10 PHP
php实现文件下载功能的几个代码分享
2014/05/10 PHP
Yii模型操作之criteria查找数据库的方法
2016/07/15 PHP
thinkphp5 模型实例化获得数据对象的教程
2019/10/18 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
2019/10/24 PHP
通过event对象的fromElement属性解决热区设置主实体的一个bug
2008/12/22 Javascript
jQuery 跨域访问问题解决方法
2009/12/02 Javascript
Javascript验证上传图片大小[前台处理]
2014/07/18 Javascript
jQuery中ajax的load()方法用法实例
2014/12/26 Javascript
Javascript中call和apply函数的比较和使用实例
2015/02/03 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
js实现大转盘抽奖游戏实例
2015/06/24 Javascript
js学习阶段总结(必看篇)
2016/06/16 Javascript
微信小程序 增、删、改、查操作实例详解
2017/01/13 Javascript
vue2导航根据路由传值,而改变导航内容的实例
2017/11/10 Javascript
JavaScript实现连连看连线算法
2019/01/05 Javascript
[08:02]DOTA2牵红线 zhou神抱得美人归
2014/03/22 DOTA
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
Python的Flask框架中配置多个子域名的方法讲解
2016/06/07 Python
Python使用cx_Oracle模块操作Oracle数据库详解
2018/05/07 Python
将pip源更换到国内镜像的详细步骤
2019/04/07 Python
Python中@property的理解和使用示例
2019/06/11 Python
python实现电子词典
2020/03/03 Python
简单了解Django项目应用创建过程
2020/07/06 Python
HTML5录音实践总结(Preact)
2020/05/07 HTML / CSS
MAC Cosmetics官方网站:魅可专业艺术彩妆
2019/04/10 全球购物
送给程序员的20个Java集合面试问题
2014/08/06 面试题
仓管员岗位职责范文
2013/11/08 职场文书
乡镇庆八一活动方案
2014/02/02 职场文书
竞聘自述材料
2014/08/25 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
公司领导九九重阳节发言稿2014
2014/09/25 职场文书
幼师大班个人总结
2015/02/13 职场文书
高考诚信考试承诺书
2015/04/29 职场文书
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python