文档首页> Linux命令> 蓝易云:MySQL运维常用脚本

蓝易云: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;"