GeekTop
  • 首页
  • 关于

GeekTop

不止代码

使用 Python 监控 MySQL 慢查询日志

使用 Python 监控 MySQL 慢查询日志

2015年11月12日 Alex Comments 0 Comment

生产环境里有时会出现一些比较耗时的查询,我们希望能在第一时间知道具体是哪些查询拖慢数据库。当检测到有慢查询日至产生的时候,就发送邮件通知管理员。因此我的一个想法就是去轮询MySQL慢查询日志。当然,这么做的前提是慢查询日志是打开的。当时花了 2 个小时实现的这个功能,现在看起来还是比较有用的,现在把我饿方法贴出来,如果谁有更好的方法,可一起交流一下。

这个后台监控脚本分为 3 个模块来实现:

  • 日至检测模块
  • 邮件发送模块
  • 计时模块,同时把上面两个模块整合在一起

先看日至检测模块:

# 传入文件的路径,以及上次读区日志的位置
# 返回一条慢SQL和本次读取日志的位置
def read_file(file_path, pre_pos=0):
    next_pos = pre_pos + 1
    cur_pos = 0
    slow_sql = ''
    with open(file_path, 'r') as f:
        for line in f:
            if re.match('^#', line) and re.search('Time', line):
                cur_pos = cur_pos + 1
                if cur_pos == next_pos:
                    slow_sql = slow_sql + line
                    for line in f:
                        if re.match('^#', line) and re.search('Time', line):
                            cur_pos = cur_pos + 1
                            slow_sql = slow_sql + line
                        else:
                            slow_sql = slow_sql + line
                    return slow_sql, cur_pos
        return None

# 统计慢SQL的行数
def sql_count(file_path):
    row_cnt = 0
    with open(file_path, 'r') as f:
        for line in f:
            if re.match('^#', line) and re.search('Time', line):
                row_cnt = row_cnt + 1
        return row_cnt

接下来是邮件发送模块,这里我使用了第三方封装好的邮件发送的模块,系统原生的比较难用:

from envelopes import Envelope

def send_mail(mail_list, subject, mail_body):
    envelope = Envelope(
        from_addr=('abc@abc.com', 'MySQL数据库监控'),
        to_addr=(mail_list),
        cc_addr=(['abc@abc.com']),
        subject=subject,
        text_body=mail_body
    )
    # 发送附件
    # envelope.add_attachment('/Users/light.zhang/test.jpg')
    envelope.send('smtp.abc.com', login='abc@abc.com', password='lumulu2tipep', tls=True)

最后一个地方是把这连个模块融合到一起,同时又计时功能:

# 主程序
def main():
    # configure the logging system
    logging.basicConfig(
        filename='app.log',
        level=logging.INFO,
        format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s %(funcName)s',
        filemode='w'
    )
    assert slow_log_path != ''
    mail_list = collect_mail_address('./mail_address.txt')
    log_pos = 0
    while True:
        return_val = rl.read_file(slow_log_path, log_pos)
        logging.info('logging')
        if return_val is not None:
            slow_sql, log_pos = return_val
            now = int(time.time())
            timeArray = time.localtime(now)
            str_time = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
            subject = 'SLOW SQL Statement %s' % str_time
            sd.send_mail(mail_list, subject, slow_sql)
            print(subject)
        time.sleep(180)

肯定有可以改进的地方,欢迎吐槽。


运维
devops, MySQL

Post navigation

NEXT
使用 ipset 管理大批量 IP 地址
PREVIOUS
解决 MySQL 异常关闭的问题

发表回复 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

最近文章

  • 姥姥
  • 设计一个可扩展的用户模型
  • 使用 Apple 的 Keychain 保存 SSH 的 passphase
  • 解决 ABA 问题
  • 关于 macOS 上面部分 emoji 无法显示的问题
  • 这些年我技术栈的变化
  • 搬瓦工、狗云、hostodo、oracle对比测试
  • Google Drive 无法上传文件
  • 使用 socks5 代理 git ssh 协议
  • 到底要不要“润”
  • 可复用的代码
  • 关于疫情的一点点反思
  • 我的风控策略(投资篇)
  • 我的风控策略(生活篇)
  • Spring Boot是如何处理异常的
  • 编码与解码
  • 基于统计的图像目标检索
  • 有限状态机和状态模式
  • API安全设计
  • 用户密码的存储策略

近期评论

  • ǝɔɐǝԀʎzɐɹϽ发表在《可复用的代码》
  • Alex发表在《可复用的代码》
  • ǝɔɐǝԀʎzɐɹϽ发表在《到底要不要“润”》
  • ǝɔɐǝԀʎzɐɹϽ发表在《可复用的代码》
  • ǝɔɐǝԀʎzɐɹϽ发表在《我的风控策略(生活篇)》
  • ǝɔɐǝԀʎzɐɹϽ发表在《如何写出简洁优雅的代码》
  • 张志亮发表在《如何写出简洁优雅的代码》

分类

  • AI (2)
  • Java应用安全之道 (1)
    • 加密与解密 (1)
  • Odoo (2)
  • Python (1)
  • 图像处理 (1)
  • 年鉴 (1)
  • 数据库 (10)
  • 编程 (14)
    • Spring (1)
  • 读书笔记 (2)
  • 运维 (5)
  • 随笔 (10)

归档

  • 2023年1月 (2)
  • 2022年8月 (1)
  • 2022年7月 (4)
  • 2022年6月 (2)
  • 2022年5月 (2)
  • 2022年4月 (3)
  • 2021年10月 (1)
  • 2021年7月 (1)
  • 2021年5月 (1)
  • 2020年11月 (1)
  • 2020年7月 (1)
  • 2020年3月 (2)
  • 2020年2月 (1)
  • 2019年1月 (1)
  • 2018年12月 (2)
  • 2018年11月 (2)
  • 2017年4月 (1)
  • 2016年11月 (1)
  • 2016年9月 (1)
  • 2016年7月 (1)
  • 2016年5月 (3)
  • 2016年4月 (2)
  • 2016年3月 (1)
  • 2016年2月 (2)
  • 2015年12月 (1)
  • 2015年11月 (2)
  • 2015年8月 (1)
  • 2015年4月 (1)
  • 2015年3月 (1)

标签

Database devops Java MySQL PostgreSQL Python shell Spring SpringBoot Spring Security 安全 年鉴 总结 编程 随笔
© 2015-2023   Geektop.net All Rights Reserved.