首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python 持续查杀符合条件的sql会话

python 持续查杀符合条件的sql会话

原创
作者头像
保持热爱奔赴山海
发布于 2024-07-04 07:59:06
发布于 2024-07-04 07:59:06
3260
举报
文章被收录于专栏:数据库相关数据库相关

生产上,某些情况下,可能会出现异常sql大量查询数据库,占用大量的cpu或者磁盘IO,这种情况下需要适当的止损。

如果有proxy的话,一般可以在proxy层面通过sql指纹进行限流或者熔断(例如proxysql就可以对指定的sql指纹进行阻断)。

如果没有proxy,则可以考虑在数据库层面添加持续kill会话的脚本,

下面就是一个持续kill符合条件的sql会话的例子:

代码语言:txt
AI代码解释
复制
import datetime
import time as t_time

import mysql.connector


def kill_sessions(instance_host, instance_port, user, passwd, kill_condition, interval, time_range):
    try:
        mydb = mysql.connector.connect(
            host=instance_host,
            port=instance_port,
            user=user,
            passwd=passwd,
            ssl_disabled=True,
        )
    except Exception as e:
        print(f"Error initializing connection: {e}")

    start_time = t_time.time()
    while True:
        current_time = t_time.time()
        elapsed_time = current_time - start_time  # 计算已经过去的时间
        # 如果已经超过time_range指定的秒数,则退出循环
        if elapsed_time > time_range:
            print("已运行超过指定的阈值,退出循环。")
            break

        try:
            # 查询活动会话
            sql = ("SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO "
                   "FROM information_schema.processlist "
                   "WHERE 1=1 AND ID != CONNECTION_ID() and " + kill_condition)

            cursor = mydb.cursor()
            cursor.execute(sql)
            processes = cursor.fetchall()

            for process in processes:
                id, user, host, db, command, time, state, info = process
                if True:
                    print(
                        f"{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}, "
                        f"ID: {id},user: {user},host:{host},db: {db}, Command: {command},"
                        f"state: {state},Time: {time}s, Info: {info}")
                    try:
                        kill_query = f"KILL {id}"
                        cursor.execute(kill_query)
                    except Exception as e:
                        print(str(e))
        except mysql.connector.Error as err:
            print(f"Database error: {err}")
            
        t_time.sleep(interval)


if __name__ == "__main__":
    kill_sessions('192.168.31.181',
                  3306,
                  'dts',
                  '123456',
                  "time > 1 and info like '%select%sleep%' ",
                  0.5,
                  60)


"""
在celery里面的入参例子
对sql模糊匹配 select%t_order%desc 的,执行kill操作,每次检测间隔0.5秒,持续60秒
注意:
1、interval不能太低,information_schema.processlist表高频查询会导致性能问题
2、user需要配置成最高权限的账号(或者是慢查询对应的业务账号),否则可能出现kill失败,报错提示not thread owner

{
    "instance_host": "192.168.31.181",
    "instance_port": 3306,
    "user": "dts",
    "passwd": "dts",
    "kill_condition": "time > 1 and info like '%select%t_order%desc%' ",
    "interval": 0.5,
    "time_range": 60
}
"""

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
DTS双向同步的实现思路探索
与单向增量同步类似, 模拟Slave来获取增量数据。 同时UDTS对写下去的数据做标记,当有新的Binlog Event的时候, 会先检查是否有标记。 如果有标记则说明是循环数据,直接丢弃,如果没有标记则加上标记写到对端。
保持热爱奔赴山海
2023/12/08
7501
使用python实现的类似pt-deadlock-logger的死锁邮件告警
pt-deadlock-logger 用起来不太方便,主要是和我们的平台结合不够好,因此参考它的逻辑,我们使用python重新写了个类似功能。
保持热爱奔赴山海
2024/07/03
1650
pt-kill 输出信息优化
默认情况下,pt-kill (3.3.1版本) 的执行记录如果是输出到log文件的话,日志里面是不会带上 库名、客户端地址的,类似如下:
保持热爱奔赴山海
2022/11/14
6120
pt-kill 输出信息优化
学会用 Mysql show processlist 排查问题
每次执行看到的结果应该都有变化,因为是实时的,所以我定义为:“事发现场”,每次执行就相当于现场的快照
码农编程进阶笔记
2021/07/20
4.2K0
基于查询的MySQL到ES的数据同步
个别场景下,开发提需求,需要把某个MySQL里面指定数据同步到ES中,希望能有一个通用的脚本,用于特殊场景下的补数据或者临时性的数据同步。
保持热爱奔赴山海
2024/04/01
4270
python_day16_pythom-
原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
py3study
2020/01/06
6260
python_day16_pythom-
SQLServer采集data和log的体积推送到prometheus
生产上需要采集各个库的datasize和logsize,便于DBA提前介入优化(例如数据文件最近为啥体积暴涨、事务日志为啥一直在涨or收缩失败?)
保持热爱奔赴山海
2024/10/01
1400
MySQL数据库故障分析-锁等待(一)
有一张权限表,同时执行了delete和truncate操作,并且长时间没有提交,导致metadata lock无法释放,应用登录时无法正常读取权限表,导致应用无法登录。
PHP开发工程师
2022/06/17
1.3K0
Waiting for global read lock的查杀
生产环境,假如不小心有个Waiting for global read lock 锁出现(例如flink cdc全量抽取数据),很容易造成生产事故。
保持热爱奔赴山海
2024/09/25
4560
全量SQL的采集和利用
最近看到Dmall冯光普老师的关于TopSQL的分享,于是参考他的方案在生产做了个低配版的实现(冯老师的方案中需要较强的前端编码能力,我这里改用grafana代替)。
保持热爱奔赴山海
2024/04/26
2960
MySQL查看及杀掉链接方法大全
在数据库运维过程中,我们时常会关注数据库的链接情况,比如总共有多少链接、有多少活跃链接、有没有执行时间过长的链接等。数据库的各种异常也能通过链接情况间接反应出来,特别是数据库出现死锁或严重卡顿的时候,我们首先应该查看数据库是否有异常链接,并杀掉这些异常链接。本篇文章将主要介绍如何查看数据库链接及如何杀掉异常链接的方法。
MySQL技术
2021/03/04
1.8K0
通过MySQL8的资源组限制CPU占用
在Linux系统上, mysqld可执行命令需要有CAP_SYS_NICE能力,例如,
保持热爱奔赴山海
2024/08/07
3410
通过Python实现MySQL和PG数据比对
生产上,有个需要从MySQL异构复制数据到PG中的需求。 数据同步组件用的是go-mysql-postgres (两位前同事基于社区开源的go-mysql-elasticsearch上做的PG功能补丁)。
保持热爱奔赴山海
2022/11/28
8840
通过Python实现MySQL和PG数据比对
基于d18n的数据分类分级实践
字节也开源了一个类似的产品,但是是golang sdk的形式的,需要和代码进行结合使用,具体可以自行参考github仓库。
保持热爱奔赴山海
2024/06/29
4120
OB运维 | 连接 kill 中的 session_id
或者 oceanbase.__all_virtual_processlist 中的ID进⾏kill是失败的。
爱可生开源社区
2023/03/02
8230
MySQL找出未提交事务的信息
我们经常会碰到这样的情况,某个事务执行完了未提交,后续再来一个DDL和DML操作,导致后面的session要么处于waiting for metadata lock,要么是锁等待超时。这时我们往往只能找到这个未提交的事务的事务id和session id,但是一般都处于sleep状态,不好分析事务内容到底是什么,所以通常都是粗鲁地kill这个session后解决问题,但是应用层的研发人员往往找不到到底是哪个事务引起的,后面再出现问题时还要重复kill。
用户1148526
2020/03/31
5.5K0
Waiting for table metadata lock问题处理
在使用mysql的时候,我们有时会碰到Waiting for table metadata lock的锁等待。但是这个锁等待比较特殊,在innodb_lock_wait和show engine innodb status 表里面都查不到。
老叶茶馆
2020/06/24
1.8K0
使用python脚本批量更新或删除数据
日常有些需要全表更新某个条件的字段的需求, 直接使用update会产生大事务造成主从延迟等一些列影响稳定性的事件。
保持热爱奔赴山海
2025/03/13
4160
MySQL批量删除阻塞线程
在 MySQL 数据库的日常管理和优化中,进程管理是一项重要的任务。通过监控和适时地终止异常或低效的数据库连接和查询,可以显著提升系统的性能和稳定性。下面介绍几种常见的 MySQL 进程管理场景及相应的处理策略。
DBA实战
2024/12/06
4891
MySQL批量删除阻塞线程
Mysql中的锁表语句查看方法汇总(持续更新)
Table_open_cache_overflows 就是上面说的淘汰的instance(table cache)的数量
疯狂的KK
2023/04/10
2.2K0
相关推荐
DTS双向同步的实现思路探索
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档