在开始具体操作前,请务必记住这个黄金法则:
3 份数据副本
2 种不同存储介质
1 份异地备份
对于云主机,这通常意味着:本地备份 + 另一台云主机/云存储 + 完全离线的归档存储。
整个备份流程可以分为几个关键步骤,其核心在于将数据库数据从云主机导出,并安全地传输到异地或异质的存储中,如下图所示:
flowchart TD
A[云主机上的数据库] --> B[“第1步: 执行备份<br>(逻辑备份或物理备份)”]
B --> C[“第2步: 传输与存储<br>(SCP, Rsync到对象存储等)”]
C --> D[“第3步: 自动化与验证<br>(Cron定时任务与恢复测试)”]
D --> E[✅ 可靠的数据库备份]下面,我们来详细讲解图中的每一个步骤。
根据数据库类型的不同,备份方法主要分为逻辑备份和物理备份。
逻辑备份将数据库的结构(表、视图等)和数据转换为SQL语句或特定格式的文件,恢复时是“重放”这些语句,适合数据量不大、需要跨版本或跨引擎迁移的场景。
物理备份直接拷贝数据库的物理文件(如数据文件、日志文件),恢复速度快,适合大数据量,通常需要数据库在备份时处于一致状态。
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/
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 [复制用户]
a) 逻辑备份工具mongodump
备份整个实例 mongodump --uri="mongodb://[用户名]:[密码]@[主机]:[端口]" --out=/path/to/backup/ 备份指定数据库 mongodump --uri="..." --db=[数据库名] --out=/path/to/backup/
b) 物理备份 (拷贝文件)
关闭MongoDB服务,然后拷贝数据目录。
或者使用LVM快照功能进行在线物理备份。
永远不要将备份文件只存放在云主机本地磁盘上!如果云主机发生故障,备份也会丢失。
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/
这是最符合云原生理念的做法,成本低,可靠性高。
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/在云存储中,为备份桶(Bucket)启用版本控制,防止备份文件被意外覆盖或删除,设置生命周期策略,自动将旧备份转移到更便宜的归档存储层(如AWS Glacier、阿里云归档存储)或自动删除。
创建一个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
编辑当前用户的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
评论
嵇正浩
回复云主机备份数据库可通过定期执行SQL脚本或使用云服务提供的备份工具进行。