外贸独立站数据库定时异地多副本备份实操教程
动手前先准备好这些环境
你需要一台已运行外贸独立站的服务器(以Linux CentOS/Ubuntu为例),并且能通过SSH登录。
本地或远程至少准备两个不同地区的存储位置,比如阿里云OSS、腾讯云COS、AWS S3,或者异地服务器上的FTP/SFTP目录。
核心工具包括:mysqldump(通常随MySQL安装)、rclone(用于同步到云存储)。
如果服务器还没有rclone,执行以下命令安装:
curl https://rclone.org/install.sh | sudo bash
然后用 rclone config 配置远程存储。
每个存储位置会生成一个配置名(例如 backup_oss、backup_cos),后续脚本直接引用。
编写一键备份并分发多副本的脚本
在 /opt/scripts/ 下创建文件 db_backup.sh,内容如下(请替换数据库信息):
#!/bin/bash
# 数据库连接信息
DB_USER="your_db_user"
DB_PASS="your_db_password"
DB_NAME="your_db_name"
# 临时备份目录
BACKUP_DIR="/var/backup/db"
DATE=$(date +%Y%m%d_%H%M%S)
# 备份文件名
FILE="${DB_NAME}_${DATE}.sql"
# 创建目录
mkdir -p $BACKUP_DIR
# 导出数据库
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/$FILE
# 压缩(可选,节省空间)
gzip $BACKUP_DIR/$FILE
# 上传到多个异地存储
rclone copy $BACKUP_DIR/${FILE}.gz backup_oss:/my-site-backup/
rclone copy $BACKUP_DIR/${FILE}.gz backup_cos:/my-site-backup/
# 删除10天前的本地备份(保留策略)
find $BACKUP_DIR -name "*.gz" -mtime +10 -delete
重要提示:直接将密码写在脚本里有风险,建议改用 --defaults-extra-file 读取配置文件,具体用法可参考MySQL官方文档。
上传前记得用 chmod +x /opt/scripts/db_backup.sh 赋予执行权限。
通过crontab设置定时任务
执行 crontab -e 进入编辑器,添加以下行(每天凌晨3点执行一次):
0 3 * * * /opt/scripts/db_backup.sh >> /var/log/db_backup.log 2>&1
保存后cron会自动生效。
由于cron执行时的环境变量有限,脚本中所有命令尽量使用绝对路径(如 /usr/bin/mysqldump),或者先在脚本开头 export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin。
避坑指南:这几个问题最容易翻车
- 权限不足:MySQL用户需要LOCK TABLES权限,如果使用普通用户,可在mysqldump后加
--single-transaction(针对InnoDB)。 - 备份文件太大:压缩是必须的,否则占用空间和传输时间长。如果数据库超过1GB,考虑使用
mydumper替代。 - rclone传输失败:首次配置后先手动执行一次
rclone copy 源文件 目标:路径测试。如果网络不稳定,脚本中可加入重试逻辑(例如用--retries 3)。 - 保留策略冲突:本地和远端都要定期清理,避免存储成本无限增长。建议远端保留30天,本地保留7天。
- 跨时区问题:如果你的cron机器时区不是UTC,按本地时间写即可,注意服务器时区保持一致。
验证备份是否真的可用
不要等事故发生时才发现备份无效!
手动执行一次脚本:
bash /opt/scripts/db_backup.sh
检查 /var/backup/db 下是否生成 .sql.gz 文件;
登录各个云存储控制台,确认文件是否存在。
最关键的一步:尝试恢复到一个测试数据库,用 gunzip < 文件.sql.gz | mysql -u 用户 -p 测试库名,然后查看表数据是否完整。
如果一切正常,你的外贸独立站数据库就实现了“每日定时 + 异地多副本”的保险机制。
建议把验证恢复这个过程也做成脚本,每月自动运行一次,并能发送通知。