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中空格字符串处理的技巧总结
Aug 10 Python
人生苦短我用python python如何快速入门?
Mar 12 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
在python 中实现运行多条shell命令
Jan 07 Python
Python根据欧拉角求旋转矩阵的实例
Jan 28 Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 Python
Python中bisect的使用方法
Dec 31 Python
TensorFlow实现checkpoint文件转换为pb文件
Feb 10 Python
Python实现PS滤镜中的USM锐化效果
Dec 04 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
Dec 11 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
Jan 23 Python
python 中的jieba分词库
Nov 23 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通过文件头检测文件类型通用代码类(zip,rar等)
2010/10/19 PHP
CodeIgniter框架URL路由总结
2014/09/03 PHP
PHP异常处理Exception类
2015/12/11 PHP
Yii框架日志操作图文与实例详解
2019/09/09 PHP
laravel 关联关系遍历数组的例子
2019/10/10 PHP
javascript 基础篇3 类,回调函数,内置对象,事件处理
2012/03/14 Javascript
jQuery.parseJSON(json)将JSON字符串转换成js对象
2014/07/27 Javascript
javascript解决IE6下hover问题的方法
2015/07/28 Javascript
js 动态给元素添加、移除事件的实现方法
2016/07/19 Javascript
Node.js的Mongodb使用实例
2016/12/30 Javascript
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
2017/12/18 jQuery
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
layui-laydate时间日历控件使用方法详解
2018/11/15 Javascript
JS温故而知新之变量提升和时间死区
2019/01/27 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
Python中的闭包总结
2014/09/18 Python
Python生成8位随机字符串的方法分析
2017/12/05 Python
Python tkinter label 更新方法
2018/10/11 Python
python中的列表与元组的使用
2019/08/08 Python
python日志模块logbook使用方法
2019/09/19 Python
tensorflow实现在函数中用tf.Print输出中间值
2020/01/21 Python
tensorflow pb to tflite 精度下降详解
2020/05/25 Python
python如何求100以内的素数
2020/05/27 Python
python实现图片转换成素描和漫画格式
2020/08/19 Python
python实现单机五子棋
2020/08/28 Python
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
乌克兰珠宝大卖场:Zlato.ua
2020/09/27 全球购物
顺丰快递Java软件工程师面试题
2015/07/31 面试题
学生会主席事迹材料
2014/01/28 职场文书
美容院营销方案
2014/03/05 职场文书
少先队学雷锋活动月总结
2014/03/09 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书
文明礼仪主题班会
2015/08/13 职场文书
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL
Python语言中的数据类型-序列
2022/02/24 Python