云服务器数据备份，别等数据丢了才想起这件事
老实说，写这篇文章的起因是，前两天"微博崩了"冲上了热搜。没错，就是那个你每天刷的微博。一搜原因——某地数据中心出现故障。你看，连微博这种体量的平台，数据中心的故障说翻车就翻车。如果你的网站、你的业务、你辛辛苦苦积累的数据也跑在云服务器上，你有想过"万一"吗？目录 为什么你的数据比你想象的更脆弱 常见的"备份幻觉"——你以为备份了，其实没有 一套靠谱的云服务器备份方案长什么样 不同的场景，不同的策略（附方案对比） 总结——别让自己墙了自己 为什么你的数据比你想象的更脆弱先讲一个真实的故事。2019年，我一个朋友的电商网站，用的是某家云厂商的服务器。一天凌晨三点，他接到报警——服务器连不上了。进控制台一看，系统盘数据全部丢失，厂商说是"宿主机硬件故障"。你猜结果怎么着？他没有做任何备份。是的，零备份。三年的商品数据、客户订单、历史记录，全部归零。那个站到现在都没再起来。有人可能会说："这种事概率很低吧？"你看，这就是典型的幸存者偏差。数据丢失的概率确实不高，但一旦发生，就是100%的灾难。你觉得微博的运维团队不够专业吗？他们当然专业，可数据中心的故障该来还是来了。试想一下： 服务器硬盘突然挂了 手误执行了 rm -rf / 被勒索病毒加密了数据 云厂商的"永久存储"出故障了 数据库被删表了 这些场景，你遇到过几个？我从业这么些年，一个都没落下地见过。常见的"备份幻觉"——你以为备份了，其实没有我做服务器导购这些年，跟上千个站长聊过。聊到数据备份，我发现大家普遍存在几种幻觉：幻觉一：云厂商帮我备份了这是最大的坑。绝大多数云厂商的"快照"服务，不是默认开启的，而且是要收费的。很多人稀里糊涂配了一台服务器，以为"云上的东西就安全了"——你信不信，真出问题的时候，云厂商的免责条款比你想象的还硬。幻觉二：我有RAID，不怕RAID 10确实可以防单块硬盘故障，但不防以下场景： 软件层面的误删（rm -rf 了解一下？） 勒索病毒加密 整个服务器被释放或误操作销毁 数据中心级别的故障（微博这次的教训还不够？） RAID不是备份，是可用性保障。 这是两个完全不同的概念。幻觉三：我有主从复制就够了MySQL主从复制、Redis主从复制，这些都很好。但如果你在主库上执行了一条 DROP TABLE，这条SQL会乖乖地同步到从库去执行。从库也会被删，不是吗？一套靠谱的云服务器备份方案长什么样好了，批评完了，说点干货。一份靠谱的备份方案，我把它总结为 "3-2-1-1 原则"：3 份副本 · 2 种介质 · 1 份异地 · 1 份离线怎么理解？1. 3 份副本原始数据 + 本地备份 + 异地备份，一共3份。鸡蛋不要放在一个篮子里。2. 2 种介质不要只用一种介质存所有备份。比如： - 本地磁盘 + 对象存储（OSS/S3） - 本地磁盘 + 另一台服务器 - 云硬盘快照 + 对象存储3. 1 份异地备份如果你的服务器在北京，备份最好放在上海或广州。同一个数据中心出故障，你的备份也跟着完蛋——微博这次就是最好的反面教材。4. 1 份离线备份（冷备）对关键数据，定期备份到本地甚至刻录到光盘、存到移动硬盘。平时断开网络连接，这样勒索病毒再怎么猖狂也够不到它。听起来麻烦？对比一下数据全部丢失的代价，这一点麻烦不算什么。不同的场景，不同的策略我直接给你几个现成的方案，你根据自己的情况选： 场景 推荐方案 预算 恢复时间 个人博客/小站 宝塔面板自动备份 + 阿里云OSS 免费~几十元/月 30分钟 企业官网 云快照（每日）+ 数据库定时导出到OSS 几十~几百元/月 1小时 电商/交易系统 云快照（每日）+ 主从复制 + 异地备份（跨区域） 几百~千元/月 15分钟 核心金融数据 上面全部 + 离线冷备 + 灾备机房 千元以上 分钟级 多说一句：不要只看成本，要看 "数据丢了你会不会破产"。一个网站一天的流水可能几万块，一个月花几百块做备份，这不香吗？实操：怎么用云服务器自建备份下面说点具体的，以最常用的阿里云和腾讯云为例。方案一：定时快照（小白推荐）# 使用云厂商的 API 自动创建快照 # 阿里云：在控制台设置"自动快照策略" # 腾讯云：在控制台设置"定期快照" 控制台点几下就行，不需要技术背景。方案二：数据库自动备份到对象存储#!/bin/bash # 数据库每日备份脚本 # 使用方法：crontab 里每天凌晨执行 DB_NAME="your_database" DB_USER="root" DB_PASS="your_password" OSS_BUCKET="my-backup-bucket" # 导出数据库 mysqldump -u$DB_USER -p$DB_PASS $DB_NAME > /tmp/${DB_NAME}_$(date +%Y%m%d).sql # 压缩 gzip /tmp/${DB_NAME}_$(date +%Y%m%d).sql # 上传到对象存储（这里用阿里云OSS为例） ossutil cp /tmp/${DB_NAME}_$(date +%Y%m%d).sql.gz oss://$OSS_BUCKET/ # 删除7天前的本地备份 find /tmp -name "${DB_NAME}_*.sql.gz" -mtime +7 -delete 这段脚本我用五六年了，从来没有出过问题。你只需要改一下数据库信息和OSS配置，放到crontab里就行了。方案三：全站文件备份#!/bin/bash # 全站文件打包备份到 OSS SITE_DIR="/var/www/html" BACKUP_DIR="/backup" DATE=$(date +%Y%m%d) # 打包网站文件 tar -czf $BACKUP_DIR/site_$DATE.tar.gz $SITE_DIR # 上传到 OSS ossutil cp $BACKUP_DIR/site_$DATE.tar.gz oss://my-backup-bucket/site/ # 保留最近30天的备份，清理旧的 find $BACKUP_DIR -name "site_*.tar.gz" -mtime +30 -delete 总结数据备份这件事，说简单很简单——几个脚本、一个定时任务、一块对象存储。说难也难——难在意识。你看微博这次，数据中心的故障谁能预料到？但如果你有异地备份，你就能在4小时内恢复业务。没有？那就只能看着自己几年的心血付之一炬。古人说："宜未雨而绸缪，毋临渴而掘井。"别等数据丢了才想起备份这件事。供你参考。希望对你有帮助。（全文完）