今天在处理RDS故障的时候,RDS实例会话很多,CPU几乎打满,作为DBA来说要先恢复业务肯定会选择把数据库活跃的慢查连接kill了,所幸RDS提供了kill全部会话的功能,但是用起来始终觉得不太舒服,经常卡着,所以想着封装一个RDS常用的接口做些常规的运维操作,先放个半成品,后面慢慢完善吧。
#!/usr/bin/env python# -*- encoding: utf-8 -*-'''@File : test.py@Time : 2020/05/18 20:57:15@Author : xuchenliang@Version : 1.0@Desc : None'''# here put the import libimport pymysqlclass RdsApi(object):def __init__(self, host=None, port=None, user=None, password=None, db=None):self.host = hostself.port = portself.user = userself.password = passwordself.db = dbdef _local_cnx(self):cnx = pymysql.connect(host=self.host,port=self.port,user=self.user,passwd=self.password,db=self.db,max_allowed_packet=1024 * 1024 * 1024,charset='utf8',cursorclass=pymysql.cursors.DictCursor)# 设置最大查询时间60scnx._read_timeout = 60return cnxdef query(self, sql_content):conn = self._local_cnx()thread_id = conn.thread_id()cursor = conn.cursor()try:cursor.execute(sql_content)result = cursor.fetchall()# 获取到thread_id,如果点击页面上的中止,那么连接对应的实例,kill相应的thread_idprint(thread_id)print(result)except Exception as err:print(err)finally:conn.close()def kill(self, sql_pattern):conn = self._local_cnx()cursor = conn.cursor()cursor.execute("SELECT id FROM INFORMATION_SCHEMA.PROCESSLIST WHERE info LIKE '{}%'".format(sql_pattern))thread_dict = cursor.fetchall()if thread_dict:for thread in thread_dict:try:cursor.execute('kill {}'.format(int(thread['id'])))print('kill {} success'.format(thread['id']))except Exception as err:print(err)continueelse:print('未匹配到会话')conn.close()if __name__ == "__main__":rds = RdsApi(host='127.0.0.1', port=3306, user='xucl', password='xuclxucl123', db='xucl')rds.kill('select SLEEP')

文章转载自mysql code tracer,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




