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解析发往本机的数据包示例 (解析数据包)
Jan 16 Python
python正则表达式re之compile函数解析
Oct 25 Python
Python中实现变量赋值传递时的引用和拷贝方法
Apr 29 Python
实例讲解Python中浮点型的基本内容
Feb 11 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
Jul 15 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
Aug 09 Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 Python
python中open函数的基本用法示例
Sep 07 Python
python自动打开浏览器下载zip并提取内容写入excel
Jan 04 Python
python实现图片九宫格分割的示例
Apr 25 Python
Python爬虫框架之Scrapy中Spider的用法
Jun 28 Python
Python 中 Shutil 模块详情
Nov 11 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
PHP4实际应用经验篇(1)
2006/10/09 PHP
php UTF8 文件的签名问题
2009/10/30 PHP
php的日期处理函数及uchome的function_coomon中日期处理函数的研究
2011/01/12 PHP
PHP获取数组中某元素的位置及array_keys函数应用
2013/01/29 PHP
PHP APC配置文件2套和参数详解
2014/06/11 PHP
PHP使用NuSOAP调用Web服务的方法
2015/07/18 PHP
WordPress中创建用户角色的相关PHP函数使用详解
2015/12/25 PHP
PHP中如何判断exec函数执行成功?
2016/08/04 PHP
如何判断图片地址是否失效
2007/02/02 Javascript
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
js预载入和JavaScript Image()对象使用介绍
2011/08/28 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
js数组的操作详解
2013/03/27 Javascript
jQuery 获取遍历获取table中每一个tr中的第一个td的方法
2016/10/05 Javascript
最原始的jQuery注册验证方式
2016/10/11 Javascript
javascript阻止事件冒泡和浏览器的默认行为
2017/01/21 Javascript
JavaScript数据结构之链表的实现
2017/03/19 Javascript
详解Angular2响应式表单
2017/06/14 Javascript
bootstrap表格内容过长时用省略号表示的解决方法
2017/11/21 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
2018/03/28 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
2019/05/05 Javascript
Vue+Element自定义纵向表格表头教程
2020/10/26 Javascript
一分钟学会JavaScript中的try-catch
2020/12/14 Javascript
[05:23]DOTA2-DPC中国联赛2月1日Recap集锦
2021/03/11 DOTA
python实现斐波那契数列的方法示例
2017/01/12 Python
python遍历一个目录,输出所有的文件名的实例
2018/04/23 Python
用python处理图片之打开\显示\保存图像的方法
2018/05/04 Python
python 同时运行多个程序的实例
2019/01/07 Python
python队列Queue的详解
2019/05/10 Python
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
类的返射机制中的包及核心类
2016/09/12 面试题
恐龙的灭绝教学反思
2014/02/12 职场文书
《小猪家的桃花树》教学反思
2014/04/11 职场文书
观看焦裕禄观后感
2015/06/09 职场文书