📥 MySQLHealthCheck 采集脚本

在 MySQL 主机上跑一次 → 输出一份 txt → 上传到本服务 → 自动生成 docx 巡检报告

下载

mysqlHealthCheckV3.0.sh
Bash · 支持 MySQL 5.7 / 8.0 / 8.4 / MariaDB 10.3+ · 单文件 · ~60 KB · 不引入任何外部依赖
下载脚本
谁该跑这个脚本? 你的 客户 / 同事 / 自己,在 MySQL 主机本机 上跑(需要能本地连到 MySQL)。脚本只读取信息、不写任何业务表。跑完输出一份 MySQLHealthCheck_<IP>_<时间戳>.txt,把它拷回来上传到本服务即可。

三步走

  1. 把脚本传到 MySQL 主机

    下载后用 scp / rsync / 跳板机粘贴等方式放到目标主机任意目录:

    # 在你本地电脑上:
    scp mysqlHealthCheckV3.0.sh dba@<db-host>:~/
    
    # 登到目标主机后:
    chmod +x ~/mysqlHealthCheckV3.0.sh
  2. 在主机上跑脚本

    推荐 交互式(终端会提示输用户名 / 密码 / 端口等):

    ./mysqlHealthCheckV3.0.sh

    自动化 命令行参数(适合 Ansible / CI / 批量):

    ./mysqlHealthCheckV3.0.sh \
      --user dbadmin --password 'xxx' \
      --host 127.0.0.1 --port 3306 \
      --output-dir ./reports
    
    # 跑完产出 ./reports/MySQLHealthCheck_<IP>_<时间戳>.txt

    更多参数(默认值适合大部分场景):

    参数含义默认
    --userMySQL 用户名(需 SELECT / PROCESS / REPLICATION CLIENT 只读权限)dbadmin
    --password密码;不传则交互输入(交互)
    --host / --portMySQL 连接地址127.0.0.1 / 3306
    --socketsocket 文件路径;可替代 host/port(自动发现)
    --defaults-filemy.cnf 路径(自动发现)
    --mysql-cmdmysql 客户端路径(自动发现)
    --output-dir输出目录当前目录
    --slow-log-lines采集慢日志末尾几行5000
    --error-log-lines采集 error log 末尾几行500
    --backup-paths探测备份产物的路径(逗号分隔)/backup, /data/backup, ...
    --test-login只做登录预检,不采集
    --non-interactive强制非交互(缺参数即报错退出)

    查看完整参数:./mysqlHealthCheckV3.0.sh --help

  3. 把 txt 上传到本服务

    回到 首页,拖拽 txt 到上传区,自动按复制拓扑分组 → 每个集群一份 docx 巡检报告。

    多节点集群:把所有节点的 txt 一起上传,服务端会按 Master_Host / slave IP is / server_id 三种信号自动识别拓扑。

MySQL 账号权限

采集脚本只读,需要这些权限:

-- 建议建一个专门的只读账号,host 限制在 127.0.0.1 或跳板机
CREATE USER 'dbadmin'@'127.0.0.1' IDENTIFIED BY '<复杂密码>';

GRANT SELECT, PROCESS, REPLICATION CLIENT, SHOW DATABASES,
      SHOW VIEW, REPLICATION SLAVE
   ON *.* TO 'dbadmin'@'127.0.0.1';

FLUSH PRIVILEGES;

权限对应用途:

⚠️ 不要用 root! root 高权限本身就是 P0 安全隐患。专门建只读账号 + host 限制到 127.0.0.1 / 跳板机 IP 是基线规范。

采集的内容(12 大类)

分类包含
① 操作系统与硬件hostname、CPU、内存、磁盘、网卡、kernel 版本、网络连接数
② MySQL 基础信息版本、编译平台、启动时间、当前时间、插件、字符集
③ MySQL Variables全量 SHOW VARIABLES(buffer pool / log / replication / sql_mode 等)
④ 主从复制SLAVE STATUS、MASTER STATUS、BINARY LOGS、GTID、并行复制配置、semi-sync
⑤ 数据库容量TOP 10 大表 / 大索引、库容量、碎片率、非 utf8 表、BLOB 分布、自增主键使用率
⑥ 用户与权限mysql.user 全表、密码过期、host=% 用户、登录失败计数(host_cache)
⑦ 会话与锁PROCESSLIST、INNODB LOCKS / LOCK WAITS / TRX、metadata_locks
⑧ InnoDB 引擎SHOW ENGINE INNODB STATUS、Buffer Pool 状态、关键指标(含 HLL)
⑨ 性能(sys 库)TOP 20 SQL(按 latency / count)、全表扫描、临时表溢出、磁盘排序、未使用 / 冗余索引
⑩ 日志slow_query_log 状态 + 末尾 5000 行;error_log 状态 + 末尾 500 行
⑪ 备份与 binlog探测 xtrabackup / mariabackup / mysqldump,crontab、备份目录、binlog 目录
⑫ 安全合规Audit Plugin、TLS/SSL 状态、空密码用户、旧认证插件、SQL_MODE

所有项都是只读查询;脚本不修改任何业务数据,不创建表,不写 mysql 系统库。

常见问题

Q1:在云数据库(RDS / PolarDB / 阿里云 DMS)上能跑吗?

部分能。脚本会自动跳过没权限的部分(比如 SHOW ENGINE INNODB STATUS 有些云需要超管权限)。但 OS 层信息(CPU / 内存 / 文件系统)拿不到 — 云数据库就别看 OS 部分。

Q2:脚本会写任何东西到数据库吗?

不会。全部是只读 SELECT / SHOW。最多在 OS 上创建一个 MySQLHealthCheck_*.txt 输出文件。

Q3:跑一次要多久?

典型 5-30 秒。大库(>100 GB 或 >10000 表)可能 1-2 分钟(卡在 information_schema 大查询)。

Q4:登录预检

不确定参数对不对,先试一下不真采集:

./mysqlHealthCheckV3.0.sh --test-login --non-interactive \
  --user dbadmin --password 'xxx' --host 127.0.0.1 --port 3306

输出 MySQL 登录测试成功 就 OK。

Q5:脱敏(交付给第三方时)

采集出来的 txt 含 hostname / IP / 库名 / 表名等。要交付给客户/外部,建议过一遍 sed

# 把 hostname 替换成 masked-hostname
sed -i 's/your-real-host\.example\.com/masked-hostname/g' \
    MySQLHealthCheck_*.txt

本服务的集群识别已经做了脱敏兼容(v5.0.2+),即使 hostname 全部脱敏,也能根据 Master_Server_Id 匹配主从。

Q6:版本兼容性

MySQL 5.6 / 5.7 / 8.0 / 8.4 全支持;MariaDB 10.3+ 也能跑(部分 8.0 专属字段会显示空)。

← 返回首页