SQL运维脚本实战核心是用Shell固化备份、巡检、慢查分析、空间监控等动作,强调自动判断、安全执行与结果反馈;备份脚本含磁盘检查、校验与自动清理;慢查脚本每小时抓取TOP10并归档清空;空间预警脚本监控大表、碎片率及增长异常;巡检脚本5秒内输出多维度健康状态报告。

SQL运维脚本实战,核心是用Shell脚本把重复、易错的数据库管理动作固化下来,比如备份、巡检、慢查分析、空间监控——不是写个SQL就行,关键在“自动判断+安全执行+结果反馈”。
备份脚本:带校验与自动清理
单纯 mysqldump 不够,要防导出失败、磁盘打满、旧备份堆积。脚本里必须包含:
- 执行前检查磁盘剩余空间(df -h /backup | awk 'NR==2 {print $5}' | sed 's/%//'),低于15%直接退出并告警
- 导出后用 mysqlcheck --check --databases 或简单 gzip -t 校验压缩包完整性
- 按日期命名(如 backup_20240615_1423.sql.gz),并用 find /backup -name "*.sql.gz" -mtime +7 -delete 自动清理7天前文件
慢查询自动抓取与归档
不依赖人工登录看 slow_log 表,用脚本每小时扫描一次:
- 启用 slow_query_log=ON + long_query_time=1,确保日志格式为 log_output='FILE'
- 脚本调用 mysqldumpslow -s t -t 10 /var/lib/mysql/slow.log 提取TOP10耗时SQL
- 把结果追加到当日归档文件(如 /opt/dblog/slow_20240615.log),再清空原 slow.log(echo "" > /var/lib/mysql/slow.log)避免日志膨胀
表空间异常预警脚本
专盯大表、碎片率高、增长过快的表,避免半夜收到“磁盘已满”报警:
- 用 SQL 查询 information_schema.TABLES,筛选 data_length + index_length > 2G 且 DATA_FREE / (DATA_LENGTH + INDEX_LENGTH) > 0.3 的表
- 对比前一天的 table_rows,对单日增长超20%的表发企业微信/钉钉通知
- 输出建议语句:ALTER TABLE xxx ENGINE=InnoDB ROW_FORMAT=DYNAMIC; 或 OPTIMIZE TABLE xxx;(加判断,只对非从库执行)
一键巡检脚本(日常上线前必跑)
整合多个健康指标,5秒内给出“绿/黄/红”状态报告:
- 连接数:Threads_connected 是否接近 max_connections 的85%
- 复制延迟:Seconds_Behind_Master 是否持续>30秒(主从架构下)
- 错误日志关键词扫描:grep -i "error\|warning\|aborted" /var/log/mysqld.log | tail -5
- 最后输出汇总行:✅ 连接正常|✅ 复制同步|✅ 错误日志干净 或 ❌ 连接数过高(当前192/200)










