1. MAN备份Shell脚本实战指南
在数据库运维领域,备份是保障数据安全的生命线。今天要分享的是一个针对MAN(MySQL Archive Navigator)数据库的自动化备份解决方案,通过Shell脚本实现定时全量+增量备份的完整流程。这个脚本在我负责的电商平台数据库集群中稳定运行了三年,经历过多次真实的数据恢复验证。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 备份方案设计思路
2.1 核心需求分析
- 全量备份:每周日凌晨2点执行完整的数据库dump
- 增量备份:每天凌晨1点捕获binlog变化
- 备份保留策略:全量备份保留4周,增量备份保留7天
- 空间优化:采用gzip压缩,预计节省60%存储空间
- 完整性校验:每个备份文件生成MD5校验码
2.2 技术选型对比
bash复制# 备份工具对比表
| 工具 | 备份速度 | 恢复便利性 | 对业务影响 | 适用场景 |
|-------------|----------|------------|------------|-------------------|
| mysqldump | 中 | 高 | 中 | 中小型数据库 |
| xtrabackup | 快 | 高 | 低 | 大型InnoDB数据库 |
| mysqlpump | 快 | 中 | 低 | 多线程备份需求 |
最终选择mysqldump方案,主要考虑:
- MAN数据库平均体积在50GB以内
- 业务允许每天有15分钟的性能波动窗口
- 运维团队对mysqldump恢复流程最熟悉
3. 脚本实现详解
3.1 基础环境配置
bash复制#!/bin/bash
# 定义关键路径变量
BACKUP_DIR="/data/backups/man"
LOG_FILE="/var/log/man_backup.log"
CONFIG_FILE="/etc/man.cnf"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
重要提示:确保备份目录有足够空间,建议预留3倍数据库体积的空间
3.2 全量备份函数实现
bash复制full_backup() {
echo "[$(date)] Starting full backup..." >> $LOG_FILE
DUMP_FILE="${BACKUP_DIR}/full_${TIMESTAMP}.sql.gz"
mysqldump --defaults-file=$CONFIG_FILE \
--single-transaction \
--flush-logs \
--master-data=2 \
--all-databases \
| gzip > $DUMP_FILE
# 生成校验文件
md5sum $DUMP_FILE > ${DUMP_FILE}.md5
# 清理旧备份
find $BACKUP_DIR -name "full_*.sql.gz" -mtime +28 -delete
}
关键参数说明:
--single-transaction:保证备份一致性--flush-logs:完成备份后刷新binlog--master-data=2:记录主库binlog位置
3.3 增量备份实现
bash复制incremental_backup() {
LAST_BINLOG=$(mysql --defaults-file=$CONFIG_FILE -e "SHOW MASTER STATUS" | awk 'NR==2{print $1}')
POSITION=$(mysql --defaults-file=$CONFIG_FILE -e "SHOW MASTER STATUS" | awk 'NR==2{print $2}')
mysqlbinlog --read-from-remote-server \
--host=localhost \
--raw \
--stop-position=$POSITION \
$LAST_BINLOG \
| gzip > "${BACKUP_DIR}/incr_${TIMESTAMP}.binlog.gz"
# 清理旧增量备份
find $BACKUP_DIR -name "incr_*.binlog.gz" -mtime +7 -delete
}
4. 完整脚本整合
4.1 主控制逻辑
bash复制main() {
# 创建备份目录
[ -d "$BACKUP_DIR" ] || mkdir -p $BACKUP_DIR
# 判断备份类型
if [ $(date +%u) -eq 7 ] && [ $(date +%H) -eq 2 ]; then
full_backup
else
incremental_backup
fi
# 空间检查
DISK_USAGE=$(df -h $BACKUP_DIR | awk 'NR==2{print $5}' | tr -d '%')
[ $DISK_USAGE -gt 90 ] && send_alert "Backup disk space over 90%"
}
# 执行入口
main "$@"
4.2 邮件报警功能
bash复制send_alert() {
local subject="MAN Backup Alert: $1"
local body="Check backup system immediately!\n\n$(df -h)\n\n$(ls -lh $BACKUP_DIR)"
echo -e "$body" | mailx -s "$subject" dba-team@example.com
}
5. 实战问题排查手册
5.1 常见错误及解决方案
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| mysqldump: Got error: 1045 | 认证失败 | 检查my.cnf中的[client]段配置 |
| mysqlbinlog: unknown variable | 版本不兼容 | 添加--no-defaults参数 |
| gzip: stdout: No space left | 磁盘空间不足 | 扩展存储或清理旧备份 |
| md5sum: cannot open file | 文件权限问题 | 设置正确的备份目录权限(750) |
5.2 性能优化技巧
-
并行压缩:用pigz替代gzip可提升30%压缩速度
bash复制
apt install pigz mysqldump ... | pigz > backup.sql.gz -
网络备份:添加SSH隧道实现异地备份
bash复制mysqldump ... | gzip | ssh user@backup-server "cat > /remote/backup.sql.gz" -
备份验证:定期自动验证备份可恢复性
bash复制gunzip -c backup.sql.gz | mysql -u test -p test_db
6. 进阶扩展方案
6.1 备份加密方案
bash复制# 使用openssl进行AES256加密
mysqldump ... | gzip | openssl enc -aes-256-cbc -salt -out backup.sql.gz.enc -k password
# 解密恢复
openssl enc -d -aes-256-cbc -in backup.sql.gz.enc -k password | gunzip | mysql ...
6.2 多云存储集成
bash复制# 上传到AWS S3
aws s3 cp backup.sql.gz s3://my-bucket/man-backups/
# 阿里云OSS上传
ossutil cp backup.sql.gz oss://bucket-name/
这个脚本在实际生产环境中需要特别注意两点:一是确保备份文件的权限设置合理,防止数据泄露;二是建议在从库上执行备份操作,避免影响主库性能。我在某次大促期间就因为没有及时调整备份时间窗口,导致高峰期出现了短暂的连接阻塞。后来我们通过增加延迟从库专门用于备份,完美解决了这个问题。
