一键生成 MySQL 全面健康报告!DBA 都在偷偷用的巡检脚本开源了!
你是否遇到过这些场景?
-
数据库突然慢如蜗牛,却不知道从哪查起?
-
新接手一个老系统,连有没有主键、有没有开 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,咱们一起进行改进,把它加入我们公共的运维工具箱吧。
如有您有需要,可以关注我的微信公众号“数据库干货铺”,也欢迎点赞、转发、留言!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)