python定时发送mysql慢日志

脚本说明:

  每天定时发送前一天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脚本,其他数据库可以给其他路径和库名称

添加到计划任务中每天定时执行

输出:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值