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 22 Python
Python json模块使用实例
Apr 11 Python
使用Pyrex来扩展和加速Python程序的教程
Apr 13 Python
在Django的模型中执行原始SQL查询的方法
Jul 21 Python
python处理xml文件的方法小结
May 02 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
May 03 Python
Python中模块pymysql查询结果后如何获取字段列表
Jun 05 Python
Python numpy中矩阵的基本用法汇总
Feb 12 Python
Django使用Channels实现WebSocket的方法
Jul 28 Python
Pytorch实现GoogLeNet的方法
Aug 18 Python
在pytorch中对非叶节点的变量计算梯度实例
Jan 10 Python
python微信公众号开发简单流程实现
Mar 09 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
Apache设置虚拟WEB
2006/10/09 PHP
filemanage功能中用到的common.js
2007/04/08 Javascript
extjs 学习笔记(二) Ext.Element类
2009/10/13 Javascript
JQuery Ajax 跨域访问的解决方案
2010/03/12 Javascript
Web前端设计模式  制作漂亮的弹出层
2010/10/29 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
JS实现来回出现文字的状态栏特效代码
2015/10/31 Javascript
JavaScript SweetAlert插件实现超酷消息警告框
2016/01/28 Javascript
js中window.open的参数及注意注意事项
2016/07/06 Javascript
jQuery实现日期联动效果实例
2016/07/26 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
获取JavaScript异步函数的返回值
2016/12/21 Javascript
js实现常见的工具条效果
2017/03/02 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
解决element UI 自定义传参的问题
2018/08/22 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
小程序文字跑马灯效果
2018/12/28 Javascript
layui使用templet格式化表格数据的方法
2019/09/16 Javascript
在react中使用vue的状态管理的方法示例
2020/05/02 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
js里面的变量范围分享
2020/07/18 Javascript
解决VUEX的mapState/...mapState等取值问题
2020/07/24 Javascript
python使用tkinter实现简单计算器
2018/01/30 Python
python3实现逐字输出的方法
2019/01/23 Python
详解Python 切片语法
2019/06/10 Python
简单了解python中对象的取反运算符
2019/07/01 Python
详解python pandas 分组统计的方法
2019/07/30 Python
Python tkinter界面实现历史天气查询的示例代码
2020/08/23 Python
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
localStorage的过期时间设置的方法详解
2018/11/26 HTML / CSS
澳大利亚家具商店:Freedom
2020/12/17 全球购物
简历的自我评价范文
2014/02/04 职场文书
延安红色之旅心得体会
2014/10/07 职场文书
2014年团队工作总结
2014/11/24 职场文书
2016高一新生军训心得体会
2016/01/11 职场文书
CSS list-style-type属性使用方法
2023/05/21 HTML / CSS