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写日志封装类实例
Jun 28 Python
Python外星人入侵游戏编程完整版
Mar 30 Python
Python定义一个跨越多行的字符串的多种方法小结
Jul 19 Python
python将处理好的图像保存到指定目录下的方法
Jan 10 Python
python从子线程中获得返回值的方法
Jan 30 Python
Python编译为二进制so可执行文件实例
Dec 23 Python
Python pandas如何向excel添加数据
May 22 Python
Pytest实现setup和teardown的详细使用详解
Apr 17 Python
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
May 27 Python
浅谈pytorch中的dropout的概率p
May 27 Python
bat批处理之字符串操作的实现
Mar 16 Python
基于Python实现射击小游戏的制作
Apr 06 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/js获取客户端mac地址的实现代码
2013/07/08 PHP
功能强大的php文件上传类
2016/08/29 PHP
JavaScript Cookie 直接浏览网站分网址
2009/12/08 Javascript
javascript动态添加表格数据行(ASP后台数据库保存例子)
2010/05/08 Javascript
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
初学Jquery插件制作 在SageCRM的查询屏幕隐藏部分行的功能
2011/12/26 Javascript
js arguments对象应用介绍
2012/11/28 Javascript
jQuery阻止同类型事件小结
2013/04/19 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
2013/04/23 Javascript
常用的JavaScript模板引擎介绍
2015/02/28 Javascript
javascript动态创建表格及添加数据实例详解
2015/05/13 Javascript
JavaScript中的cacheStorage使用详解
2015/07/29 Javascript
不得不分享的JavaScript常用方法函数集(下)
2015/12/25 Javascript
js实现tab选项卡切换功能
2017/01/13 Javascript
详解vue mixins和extends的巧妙用法
2017/12/20 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
2018/03/12 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
vue和webpack安装命令详解
2018/06/15 Javascript
vue select选择框数据变化监听方法
2018/08/24 Javascript
深入解析Python中的urllib2模块
2015/11/13 Python
python实现日常记账本小程序
2018/03/10 Python
Spanx塑身衣官网:美国知名内衣品牌
2017/01/11 全球购物
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
有机婴儿毛毯和衣服:Monica + Andy
2020/03/01 全球购物
上班迟到检讨书
2014/01/10 职场文书
跟单业务员岗位职责
2014/03/08 职场文书
解除劳动合同协议书范本2014
2014/09/25 职场文书
护士长2014年终工作总结
2014/11/11 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
拔河比赛队名及霸气口号
2015/12/24 职场文书
小学班级标语口号大全
2015/12/26 职场文书
无线电通信名词解释
2022/02/18 无线电
python工具dtreeviz决策树可视化和模型可解释性
2022/03/03 Python
 Redis 串行生成顺序编码的方法实现
2022/04/03 Redis
详细聊一聊mysql的树形结构存储以及查询
2022/04/05 MySQL
PyTorch中permute的使用方法
2022/04/26 Python