脚本说明:
每天定时发送前一天mysql慢日志top10信息到企微
流程:
1、数据库从库编写慢日志切割脚本,每天定时将慢日志切割后放到共享目录中;
2、使用python脚本读取慢日志目录中慢日志,进行分析后提取出top10,格式化后发送到企微。
在从库上编写慢日志切割脚本
[root@mysql-02 bin]# cat cutter_slow_log.sh
#!/bin/bash
#date:2021-03-29
#此脚本用于mysql慢日志切割
slowlog=/data/mysql5.7/var/slow-query.log
u=`awk -F' ' '{print $1}' /opt/scripts/bin/.myuser`
p=`awk -F' ' '{print $2}' /opt/scripts/bin/.myuser`
mv $slowlog /db_backup/slow/slow-query.`date +%Y%m%d`.log # 将当前慢日志移动到指定路径下
/usr/local/mysql/bin/mysqladmin -u$u -p$p -P22809 -h127.0.0.1 flush-logs slow # 把慢日志文件移动以后,不重启服务不会生成新的日志文件,通过此条命令来刷新日志,会重新生成日志文件。
# 由于本人用的是mysql5.6版本,版本不支持日志类型指定,5.6以上的版本可以 mysqladmin -u$u -p$p --socket=/tmp/mysql.sock flush-logs slow 指定日志类型
# 数据库用户名密码
[root@mysql-02 bin]# cat .myuser
root dlfjladjf
提取慢日志格式化发送到钉钉
#!/usr/bin/env python
#!coding=utf-8
import json
import os
import sys
import datetime
import re
# 测试企微机器人
from pip._vendor import requests
boturl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key="
headers = {'Content-Type': 'application/json;charset=utf-8'}
def msg(text):
json_text= {
"msgtype": "text",
"text": {
"content": text
},
}
print(requests.post(boturl, json.dumps(json_text), headers=headers).content)
# 用户参数慢日志存放路径
user_input_dir = sys.argv[1]
user_input_database_name = sys.argv[2]
def Slow(user_slow_dir):
user_slow_dir = str(user_slow_dir)
# 进入目录
os.chdir(user_slow_dir)
# 获取今天日期匹配慢日志文件名称
now = datetime.datetime.now()
TodayTime = now.strftime("%Y%m%d")
Slow_Log_Time = (datetime.date.today() + datetime.timedelta(days = -1)).strftime("%Y-%m-%d")
# 使用宿主机mysql日志分析命令对日志进行分析
# 先判断文件是否存在不存在发送消息直接正常退出程序
if os.path.exists('slow-query.%s.log' % (TodayTime)):
print('文件存在')
else:
msg(user_input_database_name + ' 慢日志文件不存在,请检查数据库服务器/opt/scripts/bin/cutter_slow_log.sh脚本')
exit(0)
os.system("/usr/local/mysql/bin/mysqldumpslow -a -s c -t 11 slow-query.%s.log > slow-mysql.log" % (TodayTime))
# 打开分析后日志文件
slow2 = open('slow-mysql.log', 'r')
# 读取日志
slow3 = slow2.read()
# 根据字符串切割日志
slow3 = slow3.split('Count:')
# 通过钉钉机器人发送日志开始时间信息
msg('=' + '\r'
+ '=' * 2 + '\r'
+ '=' * 3 + '\r'
+ '=' * 4 + '\r'
+ '=' * 5 + '\r'
+ '=' * 6 + '\r'
+ '=' * 7 + '\r'
+ '=' * 8 + '\r'
+ '=' * 9 + '\r'
+ '慢sql日期:' + Slow_Log_Time + '\r'
+ '数据库名称: ' + user_input_database_name)
# msg('数据库名称: ' + user_input_database_name)
# 日志输出前十条
num = 1
while num < 11:
data = ""
# 匹配单条日志
slow_log = slow3[num]
# 对单条日志新型格式话并存入data变量
slow_log_num = re.search(r'.?(\d+)?', slow_log)
slow_log_mum = slow_log_num.group()
data += str('日志数量: ' + str(slow_log_mum) + '\r')
slow_log_time = re.search(r'Time=\d+(\.\d+)?', slow_log)
slow_log_time = slow_log_time.group()
data += str('执行时间: ' + str(slow_log_time) + '\r')
slow_log_lock = re.search(r'Lock=\d+(\.\d+)?', slow_log)
slow_log_lock = slow_log_lock.group()
data += str('锁定时间: ' + str(slow_log_lock) + '\r')
slow_log_rwos = re.search(r'Rows=\d+(\.\d+)?', slow_log)
slow_log_rwos = slow_log_rwos.group()
data += str('返回记录值: ' + str(slow_log_rwos) + '\r')
slow_log_user_ip = re.search(r'(\[.*\])', slow_log)
slow_log_user_ip = slow_log_user_ip.group()
slow_log_user_ip = slow_log_user_ip.replace('[', '').replace(']', '')
data += str('执行用户及IP: ' + str(slow_log_user_ip) + '\r')
slow_log_command = re.search(r'SELECT.*', slow_log, re.I|re.S)
slow_log_command = slow_log_command.group()
data += str('SQL命令: ' + str(slow_log_command) + '\r')
# 通过钉钉发送格式化后的日志信息
msg(data)
num += 1
# 关闭文件
slow2.close()
# 调用函数
Slow(user_input_dir)
执行脚本:
python /opt/script/bin/slow.py "/pod-log/mysql_backup/172.16.105.147/slow/" "xxx从库"
给两个参数,一个是慢日志文件路径,一个是数据库名称。
给这两个参数是为了复用py脚本,其他数据库可以给其他路径和库名称
添加到计划任务中每天定时执行
输出: