你是否遇到过这些场景?

  • 数据库突然慢如蜗牛,却不知道从哪查起?

  • 新接手一个老系统,连有没有主键、有没有开 binlog 都不清楚?

  • 安全审计来了,被问“有没有空密码账户?”、“root 能不能远程登录?”,一脸懵?

  • 想做一次全面体检,但手动敲几十条 SQL 太麻烦,还容易漏?

别慌!今天,我们开源一个超实用的MySQL自动巡检工具——只需1条命令,自动生成包含50+关键指标的HTML健康报告,覆盖性能、安全、容量、高可用、备份建议等11大维度!

💡 无需安装依赖(除 pymysql),支持手动输入账号密码,绝不泄露敏感信息!

1. 这份报告能告诉你什么?

我们的脚本不是简单跑几个 SHOW STATUS,而是真正站在 DBA + 运维 + 安全 的角度,深度扫描你的 MySQL 实例:

  • ✅ 实例基础信息:版本、运行时间、字符集、时区

  • ✅ 连接与线程:当前连接数、最大连接使用率、线程缓存命中率

  • ✅ 性能瓶颈:QPS/TPS、全表扫描次数、磁盘临时表比例、排序溢出

  • ✅ InnoDB 健康度:缓冲池命中率、脏页比例、死锁次数

  • ✅ 安全风险:空密码账户、匿名用户、root 远程登录、SSL 是否启用

  • ✅ 主从复制状态:IO/SQL 线程、延迟、错误信息(自动识别)

  • ✅ 表结构隐患:无主键表、超大表(>5GB)、高碎片表 Top20

  • ✅ 日志与备份建议:慢查询、binlog 是否开启、保留策略是否合理

  • ✅ 配置合规性检查:innodb_flush_log_at_trx_commit、sync_binlog 等关键参数是否安全

🎯 所有结果以可视化 HTML 报告呈现,红绿灯式预警,一目了然!

2.  如何使用?3 步搞定!

第1步:安装依赖(仅需一次)

pip install pymysql

第2步:保存脚本为 mysql_inspect.py

我已经迭代了个4个大版本十余个小版本,兼容MySQL5.6至MySQL8.4,其他低版本暂未测试过,感兴趣的可以自己测试。(联系我可以提供完整代码)

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""MySQL 全面巡检脚本 v4.2 (增强 InnoDB Status 展示)✅ 修复 IndexError✅ 完整展示 InnoDB Status 关键段落✅ 兼容 MySQL 5.6 / 5.7 / 8.0 / 8.4"""import pymysqlimport osimport sysimport getpassimport datetimefrom collections import OrderedDictREPORT_DIR = 'report'os.makedirs(REPORT_DIR, exist_ok=True)def prompt_host_resources():    print("\n💻 请输入主机资源配置(用于参数合理性分析):")    cpu_cores_str = input("CPU 核数 (默认: 8): ").strip() or "8"    memory_gb_str = input("内存大小 (GB, 默认: 16): ").strip() or "16"    disk_tb_str = input("数据盘总容量 (TB, 默认: 2): ").strip() or "2"

第3步:运行脚本

python3 mysql_inspect.py

然后按提示输入:

💻 请输入主机资源配置(用于参数合理性分析):CPU 核数 (默认: 8): 4内存大小 (GB, 默认: 16): 8数据盘总容量 (TB, 默认: 2): 1📝 请输入 MySQL 连接信息:Host (默认: 127.0.0.1): 192.168.1.15Port (默认: 3306): 3307User: opsPassword:

🔒 密码输入时不会回显,安全可靠!

📁 报告自动保存到 report/ 目录,打开即看!

3.  报告内容如下

  • 基础信息

  • 安全风险

  • 性能概览

  • innodb基础监控度检查

  • InnoDB status的信息,包含信号量、死锁信息、缓冲池等内容

  • 事务及锁分析

  • 连接相关健康度检查

  • 主从复制状态检查

实现代码已经特别做了兼容

slave_status = None    replica_rows = run_query(conn, "SHOW REPLICA STATUS")    if not replica_rows:        replica_rows = run_query(conn, "SHOW SLAVE STATUS")    if replica_rows:        cursor = conn.cursor()        cursor.execute("SHOW SLAVE STATUS")        if cursor.description:            cols = [d[0] for d in cursor.description]            slave_status = dict(zip(cols, replica_rows[0]))        cursor.close()    if slave_status:        io_running = slave_status.get('Slave_IO_Running', 'No')        sql_running = slave_status.get('Slave_SQL_Running', 'No')        seconds_behind = slave_status.get('Seconds_Behind_Master', None)        relay_space = slave_status.get('Relay_Log_Space', 0)        data['replication'] = {            'io_running': io_running,            'sql_running': sql_running,            'seconds_behind': seconds_behind,            'relay_log_space_mb': round(int(relay_space) / 1024 / 1024, 2),            'master_host': slave_status.get('Master_Host', 'N/A')        }    else:        data['replication'] = None

  • 参数检查

  • 存储使用情况

  • 表结构隐患: 关注无主键表及自增主键即将耗尽问题

注: 如需导出为 PDF、邮件发送、或定时任务调度,也可以继续扩展。

4.  小结

数据库稳定是业务的生命线。与其等到故障发生再救火,不如定期巡检、防患未然。为什么推荐这个脚本?主要有如下几个特点:

  • 兼容性强:支持 MySQL 5.6 / 5.7 / 8.0 / 8.4

  • 无需额外权限:仅需 SELECT + PROCESS 权限(普通监控账号即可)

  • 零依赖:不依赖 Ansible、SaltStack 或任何外部工具

  • 安全友好:密码通过 getpass 隐藏输入,不记录在历史命令中

  • 开箱即用:HTML 报告自带响应式样式,手机也能看!

快把这个巡检脚本转发给你的DBA,咱们一起进行改进,把它加入我们公共的运维工具箱吧。

如有您有需要,可以关注我的微信公众号“数据库干货铺”,也欢迎点赞、转发、留言!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐