在日常运维工作中,数据库备份就像给重要文件买保险。今天咱们就用最通俗的方式,聊聊如何用Shell脚本给数据库系上"安全带"。本文以MySQL为例,手把手教你打造自动化备份方案。
一、为什么需要备份脚本
想象你的数据库突然崩溃,而最近的手动备份还是上周的。这时候有个自动备份脚本,就像在口袋里随时备着的创可贴。Shell脚本的优势在于:
- 轻量级,直接在Linux系统运行
- 可以设置定时任务自动执行
- 能灵活控制备份策略
- 恢复过程可视化操作
不过要注意,Shell脚本不适合超大型数据库(比如TB级别),这时候可能需要专业备份工具。
二、基础备份脚本实现
我们先来个"基础款"备份脚本(记得替换你的数据库信息):
#!/bin/bash
# 基础版MySQL备份脚本
# 使用mysqldump工具进行全量备份
DB_USER="root"
DB_PASS="yourpassword"
DB_NAME="mydatabase"
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 执行备份命令
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/${DB_NAME}_${DATE}.sql
# 检查是否成功
if [ $? -eq 0 ]; then
echo "[$(date)] 备份成功: ${DB_NAME}_${DATE}.sql"
else
echo "[$(date)] 备份失败!"
exit 1
fi
这个脚本每天生成一个SQL文件,但很快就会把磁盘塞满。接下来我们升级成"豪华版"。
三、高级备份方案
真正的生产环境需要更多功能:
#!/bin/bash
# 增强版MySQL备份脚本
# 功能:全量备份+压缩+过期清理+邮件通知
# 配置区
DB_USER="root"
DB_PASS="yourpassword"
DB_NAME=("db1" "db2" "db3") # 支持多数据库
BACKUP_DIR="/var/backups/mysql"
MAX_DAYS=7 # 保留最近7天备份
MAIL_TO="admin@example.com"
# 创建日期目录
DATE=$(date +%Y%m%d)
BACKUP_PATH="$BACKUP_DIR/$DATE"
mkdir -p $BACKUP_PATH
# 备份每个数据库
for db in ${DB_NAME[@]}; do
# 备份并压缩
FILENAME="${BACKUP_PATH}/${db}_${DATE}.sql.gz"
mysqldump -u$DB_USER -p$DB_PASS $db | gzip > $FILENAME
# 校验备份文件
if [ -s $FILENAME ]; then
echo "[$(date)] $db 备份成功: $(du -h $FILENAME | cut -f1)"
else
echo "[$(date)] $db 备份失败!" | mail -s "MySQL备份警报" $MAIL_TO
exit 1
fi
done
# 清理旧备份
find $BACKUP_DIR -type d -mtime +$MAX_DAYS -exec rm -rf {} \;
# 发送完成通知
echo "MySQL备份完成,磁盘使用情况:" > /tmp/backup_report
df -h $BACKUP_DIR >> /tmp/backup_report
mail -s "MySQL备份报告" $MAIL_TO < /tmp/backup_report
这个版本新增了三大功能:
- 多数据库支持
- 自动压缩节省空间
- 智能清理过期备份
四、恢复数据库的正确姿势
备份是为了恢复,来看看怎么"复活"数据:
#!/bin/bash
# MySQL数据库恢复脚本
# 参数检查
if [ $# -ne 2 ]; then
echo "用法: $0 数据库名 备份文件.sql[.gz]"
exit 1
fi
DB_USER="root"
DB_PASS="yourpassword"
DB_NAME=$1
BACKUP_FILE=$2
# 判断是否是压缩文件
if [[ $BACKUP_FILE == *.gz ]]; then
gunzip -c $BACKUP_FILE | mysql -u$DB_USER -p$DB_PASS $DB_NAME
else
mysql -u$DB_USER -p$DB_PASS $DB_NAME < $BACKUP_FILE
fi
# 检查恢复结果
if [ $? -eq 0 ]; then
echo "[$(date)] 恢复成功: $DB_NAME <= $BACKUP_FILE"
else
echo "[$(date)] 恢复失败!"
exit 1
fi
使用示例:
# 恢复压缩过的备份
./restore.sh mydb /var/backups/mysql/20230801/mydb_20230801.sql.gz
# 恢复普通SQL文件
./restore.sh mydb /var/backups/mysql/mydb_20230801.sql
五、定时任务配置
让备份自动运行才是终极目标:
# 编辑crontab
crontab -e
# 添加以下内容(每天凌晨2点执行)
0 2 * * * /path/to/your/backup_script.sh >> /var/log/mysql_backup.log 2>&1
# 查看任务列表
crontab -l
六、避坑指南
- 权限问题:确保mysql用户有备份目录写入权限
- 密码安全:不要在命令行直接暴露密码,建议使用配置文件
- 空间监控:备份前检查磁盘剩余空间
- 恢复测试:定期验证备份文件可恢复性
- 网络备份:重要数据建议同步到远程存储
七、进阶方案
对于企业级需求,可以考虑:
- 增量备份:通过binlog实现
- 远程备份:使用scp/rsync同步到其他服务器
- 加密备份:用gpg加密敏感数据
- 多云存储:同时备份到不同云服务商
八、总结
Shell脚本就像数据库的"贴身保镖",本文从基础到进阶演示了完整的备份恢复方案。记住几个关键点:
- 备份策略要匹配业务需求
- 自动化是王道
- 定期验证备份有效性
- 重要数据多重备份
最后送大家一句话:没测试过的备份等于没备份,今天就去验证你的备份方案吧!
评论