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中__call__方法示例分析
Oct 11 Python
python获取mp3文件信息的方法
Jun 15 Python
python获取局域网占带宽最大3个ip的方法
Jul 09 Python
Python中模块与包有相同名字的处理方法
May 05 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
Sep 11 Python
Python文件和流(实例讲解)
Sep 12 Python
3个用于数据科学的顶级Python库
Sep 29 Python
django 将model转换为字典的方法示例
Oct 16 Python
python获取地震信息 微信实时推送
Jun 18 Python
Python实现剪刀石头布小游戏(与电脑对战)
Dec 31 Python
如何创建一个Flask项目并进行简单配置
Nov 18 Python
Python3 用matplotlib绘制sigmoid函数的案例
Dec 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
提升PHP执行速度全攻略(上)
2006/10/09 PHP
用PHP调用数据库的存贮过程!
2006/10/09 PHP
PHP Curl出现403错误的解决办法
2014/05/29 PHP
ThinkPHP模板输出display用法分析
2014/11/26 PHP
CI框架中通过hook的方式实现简单的权限控制
2015/01/07 PHP
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
js获取鼠标点击的位置实现思路及代码
2014/05/09 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
javascript 实现动态侧边栏实例详解
2016/11/11 Javascript
Thinkphp5微信小程序获取用户信息接口的实例详解
2017/09/26 Javascript
vue.js $refs和$emit 父子组件交互的方法
2017/12/20 Javascript
Vue组件全局注册实现警告框的实例详解
2018/06/11 Javascript
mpvue项目中使用第三方UI组件库的方法
2018/09/30 Javascript
Angular脚手架开发的实现步骤
2019/04/09 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
vue-router的钩子函数用法实例分析
2019/10/26 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
2020/02/06 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
2020/02/16 Javascript
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
Python内置模块turtle绘图详解
2017/12/09 Python
Python实现聊天机器人的示例代码
2018/07/09 Python
Python3实现腾讯云OCR识别
2018/11/27 Python
Python中logging.NullHandler 的使用教程
2018/11/29 Python
对python周期性定时器的示例详解
2019/02/19 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
Python插入Elasticsearch操作方法解析
2020/01/19 Python
Python中格式化字符串的四种实现
2020/05/26 Python
python中常见错误及解决方法
2020/06/21 Python
财政局党的群众路线教育实践活动整改方案
2014/09/21 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
结婚典礼致辞
2015/07/28 职场文书
2016年小学党支部创先争优活动总结
2016/04/05 职场文书
求职信:求职应该注意的问题
2019/04/24 职场文书
一文读懂go中semaphore(信号量)源码
2021/04/03 Golang
《乙女游戏世界对路人角色很不友好》OP主题曲无字幕动画MV公开
2022/04/05 日漫