云主机怎么备份数据库?

HCRM技术_小炮 云主机 2025-10-28 3 1

3-2-1 备份原则

在开始具体操作前,请务必记住这个黄金法则:

3 份数据副本

2 种不同存储介质

1 份异地备份

对于云主机,这通常意味着:本地备份 + 另一台云主机/云存储 + 完全离线的归档存储

整个备份流程可以分为几个关键步骤,其核心在于将数据库数据从云主机导出,并安全地传输到异地或异质的存储中,如下图所示:

flowchart TD
    A[云主机上的数据库] --> B[“第1步: 执行备份<br>(逻辑备份或物理备份)”]
    B --> C[“第2步: 传输与存储<br>(SCP, Rsync到对象存储等)”]
    C --> D[“第3步: 自动化与验证<br>(Cron定时任务与恢复测试)”]
    D --> E[✅ 可靠的数据库备份]

下面,我们来详细讲解图中的每一个步骤。

第1步:选择备份方法与执行备份

根据数据库类型的不同,备份方法主要分为逻辑备份物理备份

逻辑备份将数据库的结构(表、视图等)和数据转换为SQL语句或特定格式的文件,恢复时是“重放”这些语句,适合数据量不大、需要跨版本或跨引擎迁移的场景。

物理备份直接拷贝数据库的物理文件(如数据文件、日志文件),恢复速度快,适合大数据量,通常需要数据库在备份时处于一致状态。

1 MySQL/MariaDB 备份

a) 逻辑备份工具mysqldump (最常用)

备份单个数据库到 sql 文件
mysqldump -u [用户名] -p[密码] --single-transaction [数据库名] > backup.sql
备份所有数据库
mysqldump -u [用户名] -p[密码] --all-databases --single-transaction > full_backup.sql
压缩备份
mysqldump -u [用户名] -p[密码] --single-transaction [数据库名] | gzip > backup.sql.gz

--single-transaction对于InnoDB表,此参数可以在不锁表的情况下获得一致性备份,对业务影响最小。

b) 物理备份 (直接拷贝文件)

首先关闭MySQL或对数据库进行锁表,确保数据一致性。

然后拷贝整个数据目录(如/var/lib/mysql)。

更专业的工具是Percona XtraBackup,它可以在不锁表的情况下进行在线物理备份,是生产环境的首选。

使用 XtraBackup 进行全量备份
xtrabackup --backup --user=[用户名] --password=[密码] --target-dir=/path/to/backup/

2 PostgreSQL 备份

a) 逻辑备份工具pg_dump /pg_dumpall

备份单个数据库
pg_dump -U [用户名] -h [主机] [数据库名] > backup.sql
备份所有数据库 (使用 postgres 用户)
pg_dumpall -U [用户名] --clean > full_backup.sql

b) 物理备份

PostgreSQL 也支持文件系统级别的备份,但需要先执行pg_start_backup()pg_stop_backup() 来准备。

更现代和强大的工具是PgBaseBackup(用于设置流复制和物理备份)。

使用 pg_basebackup 进行物理备份
pg_basebackup -D /path/to/backup -Fp -P -U [复制用户]

3 MongoDB 备份

a) 逻辑备份工具mongodump

备份整个实例
mongodump --uri="mongodb://[用户名]:[密码]@[主机]:[端口]" --out=/path/to/backup/
备份指定数据库
mongodump --uri="..." --db=[数据库名] --out=/path/to/backup/

b) 物理备份 (拷贝文件)

关闭MongoDB服务,然后拷贝数据目录。

或者使用LVM快照功能进行在线物理备份。

第2步:传输备份文件到安全位置

永远不要将备份文件只存放在云主机本地磁盘上!如果云主机发生故障,备份也会丢失。

2.1 使用 SCP / Rsync 到另一台服务器

使用 SCP 传输
scp -i /path/to/your-key.pem backup.sql username@another-server-ip:/remote/backup/path/
使用 Rsync (增量传输,更高效)
rsync -avz -e "ssh -i /path/to/your-key.pem" /local/backup/path/ username@another-server-ip:/remote/backup/path/

2 上传到云存储服务 (推荐)

这是最符合云原生理念的做法,成本低,可靠性高。

AWS S3:

    aws s3 cp backup.sql.gz s3://your-bucket-name/db-backups/

阿里云 OSS:

    ossutil cp backup.sql.gz oss://your-bucket-name/db-backups/

腾讯云 COS:

    coscmd upload backup.sql.gz /db-backups/

3 启用版本控制和生命周期管理

在云存储中,为备份桶(Bucket)启用版本控制,防止备份文件被意外覆盖或删除,设置生命周期策略,自动将旧备份转移到更便宜的归档存储层(如AWS Glacier、阿里云归档存储)或自动删除。

第3步:自动化和验证

1 编写自动化备份脚本

创建一个Shell脚本 (/usr/local/bin/db_backup.sh),将以上步骤整合:

#!/bin/bash
定义变量
BACKUP_DIR="/opt/db_backups"
DB_USER="your_db_user"
DB_PASSWORD="your_db_password"
DB_NAME="your_database"
S3_BUCKET="s3://your-bucket-name"
DATE=$(date +%Y%m%d_%H%M%S)
创建备份目录
mkdir -p $BACKUP_DIR
1. 执行 MySQL 备份并压缩
mysqldump -u$DB_USER -p$DB_PASSWORD --single-transaction $DB_NAME | gzip > $BACKUP_DIR/backup_$DATE.sql.gz
2. (可选) 使用 AWS CLI 上传到 S3
aws s3 cp $BACKUP_DIR/backup_$DATE.sql.gz $S3_BUCKET/
3. 清理本地超过7天的旧备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
echo "Backup completed for $DATE"

记得给脚本执行权限chmod +x /usr/local/bin/db_backup.sh

2 使用 Crontab 定时执行

编辑当前用户的crontab
crontab -e
添加以下行,表示每天凌晨2点执行备份脚本
0 2 * * * /usr/local/bin/db_backup.sh > /var/log/db_backup.log 2>&1

1、定期测试恢复:备份的有效性只能通过恢复来验证,定期在一个隔离的环境中演练恢复流程。

2、加密与安全

* 备份文件包含敏感数据,应在传输和存储时加密。

* 使用云存储的服务器端加密(SSE-S3)或客户端加密。

* 在脚本中使用环境变量或配置文件来管理密码,不要将密码硬编码在脚本中。

3、监控与告警

* 监控备份任务是否成功运行(可以通过检查日志文件或云存储中是否有新文件来判断)。

* 设置告警,如果备份失败,及时通知运维人员。

4、多副本策略

保留多个时间点的备份(例如最近24小时、最近7天、最近4周)。

* 遵循3-2-1原则,确保至少有一份备份在另一个云厂商或离线介质上。

通过遵循以上步骤和最佳实践,您就可以为云主机上的数据库建立一个可靠、自动化的备份体系,最大程度地保障数据安全。

文章摘自:https://idc.huochengrm.cn/zj/19161.html

评论

精彩评论
  • 2025-10-28 20:37:01

    云主机备份数据库可通过定期执行SQL脚本或使用云服务提供的备份工具进行。