数据是企业的核心资产。本文将介绍数据库备份恢复的完整方案,确保数据安全。
1. 备份策略
3-2-1备份原则
# 3份数据副本
- 生产数据
- 本地备份
- 异地备份
# 2种存储介质
- 本地磁盘
- 磁带/云存储
# 1份异地备份
- 物理隔离
- 防火防盗
备份类型
- 完全备份:备份整个数据库
- 增量备份:备份自上次备份以来的变化
- 差异备份:备份自上次完全备份以来的变化
2. MySQL备份
逻辑备份(mysqldump)
# 备份整个数据库
mysqldump -u root -p --all-databases > full_backup.sql
# 备份单个数据库
mysqldump -u root -p mydb > mydb_backup.sql
# 压缩备份
mysqldump -u root -p mydb | gzip > mydb_backup.sql.gz
# 恢复
mysql -u root -p mydb < mydb_backup.sql
gunzip < mydb_backup.sql.gz | mysql -u root -p mydb
物理备份(xtrabackup)
# 安装xtrabackup
apt install percona-xtrabackup-80
# 完全备份
xtrabackup --backup --target-dir=/backup/full
# 增量备份
xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/full
xtrabackup --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1
# 恢复
xtrabackup --prepare --target-dir=/backup/full
xtrabackup --prepare --apply-log-only --target-dir=/backup/full --incremental-dir=/backup/inc1
xtrabackup --prepare --apply-log-only --target-dir=/backup/full --incremental-dir=/backup/inc2
# 复制回数据目录
xtrabackup --copy-back --target-dir=/backup/full
定时备份脚本
#!/bin/bash
# mysql_backup.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/mysql"
DB_NAME="mydb"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份
mysqldump -u root -pPASSWORD $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz
# 保留7天备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
# 上传到云存储
aws s3 cp $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz s3://my-backups/mysql/
3. PostgreSQL备份
pg_dump逻辑备份
# 备份数据库
pg_dump -U postgres -d mydb > mydb_backup.sql
# 自定义格式(支持压缩和并行)
pg_dump -U postgres -d mydb -Fc > mydb_backup.dump
# 恢复
pg_restore -U postgres -d mydb mydb_backup.dump
pg_basebackup物理备份
# 基础备份
pg_basebackup -U postgres -D /backup/base -Ft -z -P
# 恢复
# 1. 停止PostgreSQL
# 2. 恢复数据目录
tar -xzf base.tar.gz -C $PGDATA
# 3. 启动PostgreSQL
归档模式
# postgresql.conf配置
wal_level = replica
archive_mode = on
archive_command = 'cp %p /backup/wal/%f'
# 恢复
restore_command = 'cp /backup/wal/%f %p'
recovery_target_time = '2025-01-15 10:00:00'
4. MongoDB备份
mongodump/mongorestore
# 备份
mongodump --host localhost --port 27017 --out /backup/mongodb
# 恢复
mongorestore --host localhost --port 27017 /backup/mongodb/mydb
文件系统快照
# LVM快照
lvcreate --size 10G --snapshot --name mongodb_snap /dev/vg0/mongodb
# 备份快照
mongodump --out /mnt/snapshot/backup
# 删除快照
lvremove /dev/vg0/mongodb_snap
5. 备份自动化
Crontab定时任务
# 每天凌晨2点备份
0 2 * * * /usr/local/bin/backup.sh
# 每小时备份
0 * * * * /usr/local/bin/backup.sh
监控与告警
#!/bin/bash
# backup_check.sh
if [ ! -f /backup/latest.sql.gz ]; then
echo "Backup failed!" | mail -s "Backup Alert" [email protected]
fi
6. 灾难恢复
恢复流程
1. 评估损失
2. 选择恢复点
3. 准备恢复环境
4. 执行恢复
5. 验证数据完整性
6. 切换流量
恢复测试
# 定期恢复测试
# 1. 克隆生产环境
# 2. 执行恢复
# 3. 验证数据一致性
# 4. 记录恢复时间(RTO)
7. 云备份方案
AWS RDS
# 自动备份
aws rds modify-db-instance \
--db-instance-identifier mydb \
--backup-retention-period 7
# 手动快照
aws rds create-db-snapshot \
--db-instance-identifier mydb \
--db-snapshot-identifier mydb-snapshot-20250115
阿里云RDS
# 备份设置
# 控制台 -> RDS -> 备份恢复 -> 备份设置
# 下载备份
# 控制台 -> RDS -> 备份恢复 -> 数据备份 -> 下载
8. 备份验证
# 验证备份完整性
gzip -t backup.sql.gz
# 验证数据一致性
mysqlcheck -u root -p --all-databases
# 恢复测试
# 在测试环境恢复并验证
9. 最佳实践
- 定期备份:自动化备份任务
- 异地存储:云存储或异地机房
- 加密备份:敏感数据加密
- 定期恢复测试:确保备份可用
- 监控备份:告警备份失败
10. 检查清单
- [ ] 备份策略已制定
- [ ] 自动化备份已配置
- [ ] 异地备份已实施
- [ ] 备份加密已启用
- [ ] 恢复测试已完成
- [ ] RTO/RPO已定义
- [ ] 备份监控已配置
- [ ] 文档已更新
总结
数据库备份是最后一道防线。关键要点:
- 3-2-1原则:3份副本,2种介质,1份异地
- 自动化:定时自动备份
- 验证:定期恢复测试
- 监控:备份状态监控
📖 进阶方案:学习使用Barman(PostgreSQL)、Percona XtraBackup(MySQL)、以及数据库复制(Replication)实现高可用。