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中使用Inotify监控文件实例
Feb 14 Python
深入讲解Python中的迭代器和生成器
Oct 26 Python
用生成器来改写直接返回列表的函数方法
May 25 Python
python数据类型_字符串常用操作(详解)
May 30 Python
python 中的int()函数怎么用
Oct 17 Python
详解Python3.6安装psutil模块和功能简介
May 30 Python
python使用opencv驱动摄像头的方法
Aug 03 Python
使用python Fabric动态修改远程机器hosts的方法
Oct 26 Python
Python操作mongodb数据库的方法详解
Dec 08 Python
Python3.6实现带有简单界面的有道翻译小程序
Apr 16 Python
TensorFlow梯度求解tf.gradients实例
Feb 04 Python
Anaconda的安装及其环境变量的配置详解
Apr 22 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优于Node.js的五大理由分享
2012/09/15 PHP
PHP中strtr字符串替换用法详解
2014/11/26 PHP
网页的分页下标生成代码(PHP后端方法)
2016/02/03 PHP
PHP常见加密函数用法示例【crypt与md5】
2019/01/27 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
jquery text,radio,checkbox,select操作实现代码
2009/07/09 Javascript
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
五个jQuery图片画廊插件 推荐
2011/05/12 Javascript
Nodejs获取网络数据并生成Excel表格
2020/03/31 NodeJs
浅谈javascript基础之客户端事件驱动
2016/06/10 Javascript
微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
2016/12/08 Javascript
Node.js的Mongodb使用实例
2016/12/30 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
浅谈gulp创建完整的项目流程
2017/12/20 Javascript
快速解决vue-cli在ie9+中无效的问题
2018/09/04 Javascript
JavaScript从原型到原型链深入理解
2019/06/03 Javascript
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
Python 字典dict使用介绍
2014/11/30 Python
利用Python实现简单的相似图片搜索的教程
2015/04/23 Python
深入解析Python中的上下文管理器
2016/06/28 Python
Python中类型检查的详细介绍
2017/02/13 Python
python中import与from方法总结(推荐)
2019/03/21 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
使用Python实现分别输出每个数组
2019/12/06 Python
给Python学习者的文件读写指南(含基础与进阶)
2020/01/29 Python
Python中itertools的用法详解
2020/02/07 Python
使用 django orm 写 exists 条件过滤实例
2020/05/20 Python
pytorch随机采样操作SubsetRandomSampler()
2020/07/07 Python
Node.js 和 Python之间该选择哪个?
2020/08/05 Python
Volcom英国官方商店:美国殿堂级滑板、冲浪、滑雪服装品牌
2019/03/13 全球购物
Lucene推荐的分页方式是什么?
2015/12/07 面试题
个人总结格式范文
2015/03/09 职场文书
2015年社会治安综合治理工作总结
2015/04/10 职场文书
《角的度量》教学反思
2016/02/18 职场文书
古诗之爱国古诗5首
2019/09/20 职场文书
HTML5之高度塌陷问题的解决
2022/06/01 HTML / CSS