数据库备份恢复完全指南:从策略制定到灾难恢复

数据是企业的核心资产。本文将介绍数据库备份恢复的完整方案,确保数据安全。

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)实现高可用。

发表评论