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中的With语句
Feb 02 Python
Python进程间通信用法实例
Jun 04 Python
TensorFlow实现AutoEncoder自编码器
Mar 09 Python
使用python进行文本预处理和提取特征的实例
Jun 05 Python
python xlsxwriter创建excel图表的方法
Jun 11 Python
Python OpenCV处理图像之图像直方图和反向投影
Jul 10 Python
Python线程障碍对象Barrier原理详解
Dec 02 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
Mar 30 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
Apr 14 Python
在django中实现choices字段获取对应字段值
Jul 12 Python
Python3读写ini配置文件的示例
Nov 06 Python
Pandas加速代码之避免使用for循环
May 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
PHP中str_replace函数使用小结
2008/10/11 PHP
window+nginx+php环境配置 附配置搭配说明
2010/12/29 PHP
一波PHP中cURL库的常见用法代码示例
2016/05/06 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
PHP批量删除jQuery操作
2017/07/23 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
2019/10/15 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
记录几个javascript有关的小细节
2007/04/02 Javascript
IE与firefox之jquery用法区别
2008/10/03 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
PHP结合jQuery实现红蓝投票功能特效
2015/07/22 Javascript
jQuery插件实现文字无缝向上滚动效果代码
2016/02/25 Javascript
javascript html5摇一摇功能的实现
2016/04/19 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
JavaScript实现反转字符串的方法详解
2017/04/27 Javascript
详解nodeJs文件系统(fs)与流(stream)
2018/01/24 NodeJs
JS运动特效之任意值添加运动的方法分析
2018/01/24 Javascript
使用Angular CLI进行Build(构建)和Serve详解
2018/03/24 Javascript
js JSON.stringify()基础详解
2019/06/19 Javascript
uni-app自定义导航栏按钮|uniapp仿微信顶部导航条功能
2019/11/12 Javascript
js实现前端界面导航栏下拉列表
2020/08/27 Javascript
Python 正则表达式入门(中级篇)
2016/12/07 Python
详解django中自定义标签和过滤器
2017/07/03 Python
详解Python判定IP地址合法性的三种方法
2018/03/06 Python
在windows下Python打印彩色字体的方法
2018/05/15 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
python实现简单图片物体标注工具
2019/03/18 Python
在Python中使用MySQL--PyMySQL的基本使用方法
2019/11/19 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
2021/01/15 Python
巴西最大的家具及装饰用品店:Mobly
2017/10/11 全球购物
LivingSocial英国:英国本地优惠
2019/02/22 全球购物
写好求职信第一句话的技巧
2013/10/26 职场文书
《小松树和大松树》教学反思
2014/02/20 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
使用Oracle跟踪文件的问题详解
2021/06/28 Oracle