脚本内容如下
#!/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 STATUSG'",
shell=True,
)
# 从输出结果中提取死锁信息
deadlocks = re.findall(r"LATEST DETECTED DEADLOCKn-+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)
报警内容
服务器租用托管,机房租用托管,主机租用托管,https://www.e1idc.com