数据丢失的代价,你可能算不清楚
新乡一家做外贸的电池企业,官网+产品展示+客户询盘系统,积累了三年的客户数据。某天服务器硬盘坏了,没有备份。三年客户数据,没了。重新收集?客户联系方式、沟通记录、报价历史,这些丢了等于丢了三年生意。老板后来花了6万块找数据恢复公司,只找回了一部分。
这不是个例。据我们服务新乡企业的经验,超过60%的中小企业没有完善的网站备份方案。有些说"服务器有RAID不用担心",有些说"云服务器不会丢数据"。这些认知都是错的。RAID防的是单盘故障,防不了误删、被黑、勒索病毒。云服务器确实有底层冗余,但你自己在后台误操作删了数据库,云厂商可不背锅。
备份策略的核心原则就一句话:3-2-1。3份数据副本,2种存储介质,1份异地存放。下面展开讲怎么做。
备份什么?不是只备份数据库
很多人以为备份就是导出数据库,其实不够。一个完整的网站备份应该包含:
1. 代码文件:包括你自己开发的代码和配置文件(nginx.conf、php.ini等)。代码一般用Git管理,仓库本身就是备份,但本地的配置文件容易忘。
2. 上传文件:用户上传的图片、文档、附件。这些通常存在 /uploads/ 目录下,数据量大但价值高,丢了找不回来。
3. 数据库:这是最核心的。MySQL用 mysqldump --single-transaction --routines --triggers dbname > backup.sql 导出完整数据库。别用 --lock-tables ,会锁表影响线上业务。
4. SSL证书和密钥:丢了要重新申请,浪费时间。
怎么备份?三种方案按需选
方案A:Shell脚本+定时任务(免费,适合技术型团队)
写一个bash脚本,每天凌晨2点打包网站文件、导出数据库、上传到对象存储。新乡高新区一家生物医药公司用的就是这个方案,脚本核心逻辑如下:
#!/bin/bash
DATE=$(date +%Y%m%d)
mysqldump -u root -p'密码' --single-transaction dbname > /tmp/db_$DATE.sql
tar -czf /tmp/site_$DATE.tar.gz /var/www /tmp/db_$DATE.sql
# 上传到阿里云OSS
ossutil cp /tmp/site_$DATE.tar.gz oss://backup-bucket/site_$DATE.tar.gz
# 删除7天前的本地备份
find /tmp -name 'site_*.tar.gz' -mtime +7 -delete
配合crontab定时执行:0 2 * * * /opt/backup.sh >> /var/log/backup.log 2>&1
方案B:宝塔面板自带备份(省心,适合非技术老板)
宝塔面板的计划任务里有"备份网站"和"备份数据库"选项,设置每天备份一次,自动上传到阿里云OSS或七牛云。操作全程图形化,不用碰命令行。年费200左右(对象存储费用),比请人写脚本划算。
方案C:云服务商快照(最省事,但有限制)
阿里云、腾讯云都支持磁盘快照,设置自动快照策略,每天凌晨拍一个快照。恢复时回滚磁盘即可。但注意:快照恢复是整盘回滚,不能只恢复某个文件或某张表。适合数据量小、结构简单的网站。原阳一家预制菜企业用快照方案,月费30块,图个省事。
备份频率:根据数据变化量决定
不是所有数据都需要每天备份。数据库每天备份一次(高峰期可以每6小时一次),上传文件每周备份一次(变化不大的话),代码通过Git实时版本管理。
封丘一家金银花经销商的网站,订单数据实时写入数据库,每天产生200-300条新数据。他们用的策略是:数据库每6小时增量备份+每天全量备份,文件每周备份。这样最坏情况只丢6小时的订单数据,可以接受。
最关键的一步:恢复演练
备份做了,从没恢复过,出事的时候大概率恢复不了。要么备份文件损坏了不知道,要么恢复流程不熟悉手忙脚乱。
每季度做一次恢复演练。把备份文件拉到一台测试服务器上,按真实流程恢复一遍,验证数据完整性。新乡经开区有家汽车零部件企业,做了第一次恢复演练才发现备份脚本有bug——数据库导出时没加 --single-transaction 参数,导出的数据有不一致。幸亏是演练发现的,不是出事才发现。
记住一句话:没验证过的备份等于没备份。花半天做一次恢复演练,值。