蓝易云:MySQL运维常用脚本
发布时间:2025-12-24 00:15       
MySQL 运维常用脚本:把巡检、备份、慢日志、复制、Binlog 清理做成“可复制交付”🙂
运维的本质是把不确定性变成 可观测、可回滚、可审计。下面给你一套高频脚本模板,尽量做到“复制就能用”,并把每段命令解释清楚。

分析说明表:你真正要跑的 5 类脚本 ✅
| 场景 | 目标 | 输出 | 风险点 |
|---|---|---|---|
| 快速巡检 | 判断实例健康/负载 | QPS、连接、InnoDB、慢查询趋势 | 读多,风险低 |
| 一致性备份 | 可恢复、可验证 | 压缩备份包 + 校验 + 备份日志 | 密码泄露/锁表 |
| 复制巡检 | 发现延迟与断链 | 复制线程、延迟秒数、错误原因 | SQL 兼容差异 |
| 慢日志摘要 | 找 Top SQL | 频次/耗时/锁等待榜单 | 采样偏差 |
| Binlog 清理 | 控盘控成本 | 仅保留 N 天 | 误删导致无法追溯 |
0)先把凭据“脱敏化”:使用 .my.cnf(避免脚本明文密码)🔐
# ~/.my.cnf
[client]
user=ops_ro
password=你的密码
host=127.0.0.1
port=3306
解释:
[client]:mysql 客户端默认读取该段配置,脚本无需再写-p密码。user/password/host/port:统一连接参数,减少“脚本里到处散落密码”的合规风险。- 建议权限:
ops_ro仅授予SELECT, PROCESS, REPLICATION CLIENT等只读/观测权限,做到 最小权限。
1)脚本:快速巡检(一分钟知道 MySQL 现在稳不稳)📈
mysql -N -e "
SELECT NOW();
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Threads_running';
SHOW GLOBAL STATUS LIKE 'Questions';
SHOW GLOBAL STATUS LIKE 'Slow_queries';
SHOW ENGINE INNODB STATUS\G
"
解释:
mysql -N -e:-e直接执行 SQL;-N去掉列名,便于脚本解析。SELECT NOW():确认连通性与数据库时间(排查时区/漂移也有用)。Threads_connected/Threads_running:连接数/正在执行数,判断是否“线程爆表”。Questions:累计请求数,可配合间隔采样计算 QPS(做趋势更准)。Slow_queries:累计慢查询数,用于判断慢查询是否在上升。SHOW ENGINE INNODB STATUS\G:InnoDB 核心状态(死锁、buffer、IO、事务),\G纵向输出更可读。
2)脚本:一致性备份(mysqldump 版本)🧰
BACKUP_DIR=/data/backup/mysql
TS=$(date +%F_%H%M%S)
mkdir -p "$BACKUP_DIR"
mysqldump --single-transaction --routines --events --triggers \
--set-gtid-purged=OFF --all-databases \
| gzip -1 > "$BACKUP_DIR/full_${TS}.sql.gz"
sha256sum "$BACKUP_DIR/full_${TS}.sql.gz" > "$BACKUP_DIR/full_${TS}.sha256"
解释:
BACKUP_DIR/TS:把备份文件标准化命名,方便保留策略与回滚定位。mkdir -p:目录不存在则创建;幂等执行,不会因目录已存在报错。mysqldump --single-transaction:对 InnoDB 走一致性快照,避免全库锁表(核心参数)。--routines --events --triggers:把存储过程/事件/触发器一并备份,避免“只恢复数据,业务却跑不起来”。--set-gtid-purged=OFF:在 GTID 场景更稳妥,避免把 GTID 强行写入备份导致恢复冲突(尤其跨环境)。--all-databases:整库级备份;若你只备某个库,可替换为--databases db1 db2。| gzip -1:边导出边压缩,-1更快(运维更看重“窗口短”)。sha256sum:生成校验文件,后续验证“备份是否被截断/损坏”。备份不校验,就像买了保险不签字。
备份流程图(可直接渲染)🧠
准备备份目录/时间戳
执行 mysqldump 一致性导出
实时 gzip 压缩落盘
生成 sha256 校验
抽样做恢复演练
进入保留策略/归档
3)脚本:复制巡检(兼容 MySQL 8/旧版本)🔁
mysql -e "SHOW REPLICA STATUS\G" 2>/dev/null | egrep "Replica_IO_Running|Replica_SQL_Running|Seconds_Behind_Source|Last_Error" \
|| mysql -e "SHOW SLAVE STATUS\G" | egrep "Slave_IO_Running|Slave_SQL_Running|Seconds_Behind_Master|Last_Error"
解释:
SHOW REPLICA STATUS\G:MySQL 8 常用命令(术语从 Slave/Master 迁移到 Replica/Source)。2>/dev/null:若该命令不支持(旧版本会报错),把错误吞掉,避免干扰输出。||:前者失败则执行后者,实现“一条命令兼容两代语法”。egrep ...:只筛关键字段:<span style="color:red">IO/SQL Running</span>:复制线程是否在跑。Seconds_Behind_*:延迟秒数(注意它不是绝对准确,但足够做告警门槛)。Last_Error:断链/冲突时的根因线索。
4)脚本:慢日志摘要(不装工具也能跑)🐢
SLOW_LOG=/var/log/mysql/mysql-slow.log
mysqldumpslow -s t -t 20 "$SLOW_LOG"
解释:
SLOW_LOG:慢日志文件路径(以你的实例实际配置为准)。mysqldumpslow:MySQL 自带汇总工具(常见发行版会带),能按模板归并相似 SQL。-s t:按总耗时排序(谁最耗时先抓谁)。-t 20:输出前 20 条,避免信息过载。运维不是收集癖,是决策支持。
5)脚本:Binlog 清理(优先“保留策略”,别手滑)🧹
RETENTION_DAYS=7
mysql -e "PURGE BINARY LOGS BEFORE (NOW() - INTERVAL ${RETENTION_DAYS} DAY);"
mysql -e "SHOW BINARY LOGS;"
已经是第一篇啦!