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 相关文章推荐
简单的连接MySQL与Python的Bottle框架的方法
Apr 30 Python
Pycharm设置界面全黑的方法
May 23 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
Dec 05 Python
python区分不同数据类型的方法
Oct 14 Python
python SVD压缩图像的实现代码
Nov 05 Python
python turtle 绘制太极图的实例
Dec 18 Python
爬虫代理池Python3WebSpider源代码测试过程解析
Dec 20 Python
pytorch实现Tensor变量之间的转换
Feb 17 Python
python3+opencv生成不规则黑白mask实例
Feb 19 Python
PYQT5 vscode联合操作qtdesigner的方法
Mar 24 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
Apr 20 Python
Github 使用python对copilot做些简单使用测试
Apr 14 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
S900/ ETON E1-XM 收音机
2021/03/02 无线电
smarty缓存用法分析
2014/12/16 PHP
PHP中引用类型和值类型功能与用法示例
2019/02/26 PHP
从新浪弄下来的全屏广告代码 与使用说明
2007/03/15 Javascript
js常见表单应用技巧
2008/01/09 Javascript
用js解决数字不能换行问题
2010/08/10 Javascript
jquery select多选框的左右移动 具体实现代码
2013/07/03 Javascript
js open() 与showModalDialog()方法使用介绍
2013/09/10 Javascript
js+html5通过canvas指定开始和结束点绘制线条的方法
2015/06/05 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
2015/09/11 Javascript
angularJS 如何读写缓冲的方法(推荐)
2016/08/06 Javascript
JavaScript 继承详解(六)
2016/10/11 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
axios对请求各种异常情况处理的封装方法
2018/09/25 Javascript
vue实例的选项总结
2020/06/09 Javascript
javascript实现拼图游戏
2021/01/29 Javascript
详解Python的Django框架中inclusion_tag的使用
2015/07/21 Python
python读写json文件的简单实现
2017/04/11 Python
Python外星人入侵游戏编程完整版
2020/03/30 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
kali中python版本的切换方法
2019/07/11 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
2020/02/07 Python
Python 实现一行输入多个数字(用空格隔开)
2020/04/29 Python
Python 使用 PyQt5 开发的关机小工具分享
2020/07/16 Python
H5页面适配iPhoneX(就是那么简单)
2019/12/02 HTML / CSS
HMV日本官网:全球知名的音乐、DVD和电脑游戏零售巨头
2016/08/13 全球购物
中国海淘族值得信赖的海淘返利网站:55海淘
2017/01/16 全球购物
考试作弊被抓检讨书
2014/01/10 职场文书
工程专业求职自荐书范文
2014/02/08 职场文书
优秀少先队大队辅导员事迹材料
2014/05/04 职场文书
文明寝室标语
2014/06/13 职场文书
科学发展观演讲稿
2014/09/11 职场文书
学校机关党总支领导班子整改工作方案
2014/10/26 职场文书
研讨会通知
2015/04/27 职场文书
大学文艺委员竞选稿
2015/11/19 职场文书
解析Redis Cluster原理
2021/06/21 Redis