服务器数据丢失,最常见的原因是误删、程序升级出错和磁盘故障,外部攻击反而排在后面。阿里云 ECS 有一定的数据可靠性,但它不会替你保留历史版本。想回到某个时间点,前提是之前已经做过备份。这篇文章比较快照、镜像和异地同步三种方法,最后用两个恢复案例说明具体操作。

先确定备份哪些内容
动手前先想清楚要保存什么。一台 ECS 通常有三类内容,需要分开看:
- 系统盘:操作系统、已装的软件和配置文件。
- 数据盘:网站文件、用户上传的内容、业务日志。
- 数据库:如果装在 ECS 上,数据文件可能落在系统盘或数据盘里,要单独处理。如果用的是阿里云 RDS,直接使用 RDS 自带的备份功能即可。
三类内容的变化速度差别很大。系统盘基本不动,快照就够用。数据盘和数据库每天都在写入,备份频率要跟上。
方法一:用快照备份磁盘
快照是云盘在某个时刻的数据副本。恢复快,适合整盘回滚。在 ECS 控制台的快照页面选中云盘,就可以手动创建快照。
长期运行的业务,建议配置自动快照策略。设定执行时间(比如每天凌晨 3 点)和保留天数(比如 7 天),再绑定到对应的系统盘和数据盘。过期的快照会自动删除,存储费用不会一直涨。具体菜单名称以控制台实际界面为准。
快照记录的是拍摄那一刻的磁盘状态。数据库正在写入时直接拍快照,拿到的数据文件可能不完整。两种办法:一是挑业务低峰期拍;二是先用数据库工具导出一份逻辑备份,再拍快照。一台实例挂了多块盘,还可以使用快照一致性组,让这些盘在同一时间点生成快照。
方法二:制作自定义镜像
镜像适合保存配置好的环境。比如一台 Web 服务器已经装好 Nginx、PHP 和应用代码,做成自定义镜像后,扩容新机器可以直接从镜像启动,不用逐项配置。在实例详情页选择“创建自定义镜像”即可。
镜像主要包含系统盘内容,数据盘不一定会打包进去。制作前最好先停止实例,避免文件在写入途中被打包。另外要记住,镜像通常不含最新的业务数据,它不能代替数据备份。
方法三:把数据同步到 OSS 或其他地域
快照和镜像都放在阿里云的同一地域里。遇到地域级故障、账号被封,或者需要长期保存时,就得把备份复制到别处。常见做法是用定时任务导出数据库和关键文件,再上传到对象存储 OSS。
阿里云提供命令行工具 ossutil,可以把本地文件上传到 OSS Bucket。下面这个脚本每天导出一次 MySQL 数据库,上传到 OSS,并清理本地 7 天前的旧文件:
#!/bin/bash
# 数据库账号密码写在 /root/.my.cnf 中,权限设为 600,不写进脚本
DATE=$(date +%F)
BACKUP_DIR=/data/backup
mkdir -p $BACKUP_DIR
mysqldump --defaults-extra-file=/root/.my.cnf --single-transaction appdb \
| gzip > $BACKUP_DIR/appdb_$DATE.sql.gz
ossutil cp $BACKUP_DIR/appdb_$DATE.sql.gz oss://my-backup-bucket/db/
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
用 crontab -e 添加 0 2 * * * /root/backup.sh,就能每天凌晨 2 点执行。--single-transaction 对 InnoDB 表能在不锁表的情况下导出一致的数据。如果库里还有 MyISAM 表,这个参数无法保证一致性,需要另外安排处理。
OSS Bucket 保持私有读写,不要设成公共读。可以开启版本控制,再配置生命周期规则,让 30 天前的旧备份转为低频存储或直接删除,控制费用。
案例:两个恢复场景
案例一:升级插件后数据库表损坏。一家小型电商店铺把 WordPress 和 MySQL 装在同一台 ECS 上,同时开着自动快照(保留 7 天)和上面的导出脚本(本地留 7 天,OSS 留 30 天)。某次插件升级后,数据库表结构出了问题。店主没有整盘回滚,而是从 OSS 下载前一天凌晨的 SQL 文件,先导入测试库确认没问题,再导入生产库。最后只需人工补录前一天凌晨到故障发生之间的订单,影响控制在几小时内。
案例二:误删上传目录。运营人员在数据盘上误执行了删除命令,/data/uploads 目录被清空。团队在快照列表里找到当天凌晨的快照,用它创建一块新云盘,挂到另一台临时 ECS 上,再把 uploads 目录复制回原服务器。整个过程原服务器没有停机。相比整盘回滚,这种做法更稳妥。整盘回滚会让快照之后写入的数据全部消失,单独恢复目录则只动到目标位置。
恢复时的操作要点
- 整盘回滚:先停止实例,再在快照页面执行回滚。快照拍摄时间之后的数据都会丢失,操作前一定要确认。
- 单文件或单目录恢复:用快照创建新云盘,挂到临时实例上,把需要的文件复制出来。原系统不受影响。
- 数据库恢复:从 OSS 下载导出文件,用
mysql命令导入测试库,检查通过后再切到生产库。
备份策略的基本原则
可以参考“3-2-1 规则”来安排备份:
- 至少保留 3 份数据副本,包括原始数据和两份备份。
- 副本分布在 2 种不同的存储介质上,比如云盘快照和 OSS 对象存储。
- 至少 1 份副本放在异地,即不同地域或不同账号。
没恢复过的备份,就无法确定是否有效。建议每个月用最近的快照创建一台测试实例,看看网站能否正常打开,数据库能否正常查询。提前演练一次,比出事后才发现备份文件损坏省事得多。
快照负责整盘快速回滚,镜像负责复制环境,OSS 或异地存储负责长期保存和灾难恢复。按数据变化的快慢选择组合,再定期验证能否恢复,备份才真正派得上用场。