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 相关文章推荐
在Mac OS上使用mod_wsgi连接Python与Apache服务器
Dec 24 Python
老生常谈python中的重载
Nov 11 Python
对Python的zip函数妙用,旋转矩阵详解
Dec 13 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
Feb 22 Python
python中pip的使用和修改下载源的方法
Jul 08 Python
Python实现二叉搜索树BST的方法示例
Jul 30 Python
python识别文字(基于tesseract)代码实例
Aug 24 Python
Django异步任务线程池实现原理
Dec 17 Python
python多线程使用方法实例详解
Dec 30 Python
python爬虫实例之获取动漫截图
May 31 Python
python中有帮助函数吗
Jun 19 Python
python 装饰器的基本使用
Jan 13 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
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
PHP类的自动加载机制实现方法分析
2019/01/10 PHP
IE浏览器PNG图片透明效果代码
2008/09/02 Javascript
jQuery 处理表单元素的代码
2010/02/15 Javascript
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
利用NodeJS的子进程(child_process)调用系统命令的方法分享
2013/06/05 NodeJs
node.js使用nodemailer发送邮件实例
2014/03/10 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
实现隔行换色效果的两种方式【实用】
2016/11/27 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
JavaScript函数中的this四种绑定形式
2017/08/15 Javascript
layer子层给父层页面元素赋值,以达到向父层页面传值的效果实例
2017/09/22 Javascript
js判断数组是否包含某个字符串变量的实例
2017/11/24 Javascript
vue实现密码显示隐藏切换功能
2018/02/23 Javascript
javascript function(函数类型)使用与注意事项小结
2019/06/10 Javascript
vue实现绑定事件的方法实例代码详解
2019/06/20 Javascript
JavaScript DOM常用操作代码汇总
2020/07/03 Javascript
Python Mysql数据库操作 Perl操作Mysql数据库
2009/01/12 Python
你眼中的Python大牛 应该都有这份书单
2017/10/31 Python
Python数据分析matplotlib设置多个子图的间距方法
2018/08/03 Python
Python3使用PySynth制作音乐的方法
2019/09/09 Python
Python搭建HTTP服务过程图解
2019/12/14 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
python 实现读取csv数据,分类求和 再写进 csv
2020/05/18 Python
美国最大的珠宝首饰网上商城:Jewelry.com
2016/07/22 全球购物
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
美国女士时尚珠宝及配饰购物网站:Icing
2018/07/02 全球购物
医学类个人求职信范文
2014/02/05 职场文书
保险经纪人求职信
2014/03/11 职场文书
考生诚信考试承诺书
2014/05/23 职场文书
2014年组织部工作总结
2014/11/14 职场文书
Redis分布式锁的7种实现
2022/04/01 Redis