Linux脚本自动备份跨境网站数据:新手也能入门的教程
为什么需要自动备份跨境网站数据
跨境网站通常部署在境外服务器上,数据安全与本地运维存在时差、网络不稳定等挑战。
手动备份容易遗忘,一旦遇到服务器故障或误删除,恢复成本极高。
通过Linux脚本自动备份数据,可以每天定时将网站文件和数据库压缩归档,并传输到本地或备用存储,实现零人工干预。
本文从零开始,教会你完整搭建一套自动备份方案。
准备工作:SSH密钥与目录结构
在执行脚本之前,需要确保本地服务器和远程跨境服务器之间能够免密码连接。
步骤如下:
- 在本地生成SSH密钥对(如果已有可跳过):
ssh-keygen -t rsa -b 4096 -f ~/.ssh/cross_backup
一路回车,不设置密码短语。
- 将公钥上传到远程服务器:
ssh-copy-id -i ~/.ssh/cross_backup.pub root@your-remote-server-ip
如果无法使用ssh-copy-id,可以手动将公钥内容追加到远程服务器的~/.ssh/authorized_keys文件中。
- 测试连接:
ssh -i ~/.ssh/cross_backup root@your-remote-server-ip "echo connected"
看到connected即表示成功。
- 在本地规划备份目录:例如
/data/backups/cross_site,并创建子目录daily和logs。
编写备份脚本:自动打包并下载
以下脚本会远程打包网站文件和数据库,然后通过scp下载到本地,最后删除远程的临时压缩包。
创建文件/opt/scripts/cross_backup.sh,内容如下:
#!/bin/bash
# 跨境网站自动备份脚本
# 配置项
REMOTE_IP="your-remote-server-ip"
REMOTE_USER="root"
SSH_KEY="~/.ssh/cross_backup"
# 远程网站根目录(根据实际修改)
REMOTE_SITE_DIR="/var/www/html"
# 远程数据库信息
DB_NAME="your_db_name"
DB_USER="your_db_user"
DB_PASS="your_db_password"
# 本地备份根目录
LOCAL_BACKUP_DIR="/data/backups/cross_site"
DATE=$(date +%Y%m%d_%H%M%S)
# 远程临时打包
REMOTE_TAR="/tmp/backup_${DATE}.tar.gz"
REMOTE_SQL="/tmp/db_${DATE}.sql"
ssh -i ${SSH_KEY} ${REMOTE_USER}@${REMOTE_IP} << EOF
# 备份数据库
mysqldump -u${DB_USER} -p${DB_PASS} ${DB_NAME} > ${REMOTE_SQL}
# 打包网站文件和数据库
tar -czf ${REMOTE_TAR} -C / ${REMOTE_SITE_DIR#/} ${REMOTE_SQL#/}
rm -f ${REMOTE_SQL}
EOF
# 下载到本地
echo "正在下载备份..."
scp -i ${SSH_KEY} ${REMOTE_USER}@${REMOTE_IP}:${REMOTE_TAR} ${LOCAL_BACKUP_DIR}/daily/backup_${DATE}.tar.gz
# 删除远程临时包
ssh -i ${SSH_KEY} ${REMOTE_USER}@${REMOTE_IP} "rm -f ${REMOTE_TAR}"
echo "备份完成:${LOCAL_BACKUP_DIR}/daily/backup_${DATE}.tar.gz"
赋予执行权限:chmod +x /opt/scripts/cross_backup.sh。
首次运行建议手动执行一次,检查是否有错误。
设置定时任务:注意时区与日志
跨境网站可能涉及跨时区,使用crontab时建议统一成UTC+0或服务器所在的时区。
在本地服务器执行crontab -e,添加以下任务(假设每天凌晨3点备份):
0 3 * * * /opt/scripts/cross_backup.sh >> /data/backups/cross_site/logs/backup.log 2>&1
- 时区问题:如果本地服务器和远程服务器时区不同,在执行脚本时远程打包的文件名中的时间戳基于远程,而下载后的本地时间可能不一致。建议在脚本中使用统一的时间源,例如获取远程时间或使用UTC。可修改脚本中的
DATE=$(ssh -i ${SSH_KEY} ${REMOTE_USER}@${REMOTE_IP} "date -u +%Y%m%d_%H%M%S")获取远程UTC时间。 - 日志保留:定期清理日志,避免磁盘占满。可在crontab中添加一条
0 0 1 * * find /data/backups/cross_site/logs -mtime +30 -delete。
避坑指南:常见问题与解决办法
- SSH连接超时或拒绝:检查远程服务器是否允许密钥登录(
/etc/ssh/sshd_config中PubkeyAuthentication yes),防火墙是否放行22端口。 - mysqldump权限不足:确保远程数据库用户具有SELECT、LOCK TABLES等权限,或使用root账号。生产环境建议创建专用备份用户。
- 打包路径错误:脚本中
tar -czf ${REMOTE_TAR} -C / ${REMOTE_SITE_DIR#/},含义是以根目录为基准去除开头的/。如果网站目录是/var/www/html,则${REMOTE_SITE_DIR#/}为var/www/html。确保路径正确。 - 磁盘空间不足:远程
/tmp目录或本地备份目录空间不足会导致失败。建议设置空间报警或定期清理旧备份。 - 文件锁定问题:备份过程中如果网站有频繁写入,可能导致文件不一致。对于数据库,使用
--single-transaction(InnoDB)或锁定表;对于文件,可在业务低峰期执行。
效果验证:确保备份可恢复
- 手动执行脚本:
/opt/scripts/cross_backup.sh,观察输出和日志文件。 - 检查备份文件:查看本地
/data/backups/cross_site/daily/下是否生成backup_日期.tar.gz。 - 模拟恢复:在测试环境解压备份文件,恢复数据库和网站文件,确认能正常访问。
- 检查crontab状态:使用
crontab -l确认定时任务存在,查看日志文件/data/backups/cross_site/logs/backup.log是否每天有新的执行记录。
通过以上步骤,你的跨境网站数据即可实现每日全自动备份。
后续可以根据数据量调整备份频率、增加远程副本或云存储上传,进一步加固数据安全。
如果你在配置中遇到其他问题,欢迎在评论区留言交流。