0
点赞
收藏
分享

微信扫一扫

编写Python脚本监控MySQL死锁

guanguans 2023-04-28 阅读 52

脚本内容如下

#!/usr/bin/env python3.6
# coding: utf-8
import subprocess
import requests
import re
import os
import datetime
import pickle

# 数据库连接信息
HOST = "你的host"
USER = "root"
PASSWORD = "你的密码"
PORT = 3306

# 企业微信机器人的 webhook key
WEBHOOK_KEY = "你的key"

# 已处理过的死锁信息集合
processed_deadlocks = set()

# 缓存文件路径
CACHE_FILE_PATH = "/data/monitor-script/c-deadlock.cache"

# 如果缓存文件存在,则读取其中的内容
if os.path.exists(CACHE_FILE_PATH):
    with open(CACHE_FILE_PATH, 'rb') as f:
        processed_deadlocks = pickle.load(f)
else:
    processed_deadlocks = {}

# 执行 SHOW ENGINE INNODB STATUS 命令并得到输出结果
output = subprocess.check_output(
    f"mysql -h {HOST} -P {PORT} -u {USER} -p'{PASSWORD}' -e 'SHOW ENGINE INNODB STATUS\G'",
    shell=True,
)

# 从输出结果中提取死锁信息
deadlocks = re.findall(r"LATEST DETECTED DEADLOCK\n-+\n(.+?)\n-+\n", output.decode(), flags=re.MULTILINE|re.DOTALL)

# 遍历每个死锁信息
for deadlock in deadlocks:
    # 如果该死锁信息没有被处理过,则发送通知到企业微信机器人,并将其添加到已处理集合和发送列表中
    if deadlock not in processed_deadlocks:
        # 发送通知到企业微信机器人
        url = f"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={WEBHOOK_KEY}"
        data = {
            "msgtype": "text",
            "text": {"content": f"发现新的死锁事务:\n{deadlock}"}
        }
        response = requests.post(url, json=data)
        
        # 将该死锁信息添加到已处理集合和发送列表中

        processed_deadlocks[deadlock] = True
        # 将更新后的缓存写入文件中
        with open(CACHE_FILE_PATH, 'wb') as f:
          pickle.dump(processed_deadlocks, f)

报警内容

编写Python脚本监控MySQL死锁_脚本

举报

相关推荐

0 条评论