# 开源网站源码备份教程|数据库定期导出保存方法
## 前言介绍
网站数据是数字资产的核心,无论是个人博客、企业官网还是电商平台,源码文件与数据库共同构成了网站的完整运行基础。一旦遭遇服务器故障、黑客攻击、误操作删除或勒索病毒,没有备份就意味着数据永久丢失。本教程将手把手教你使用开源工具实现网站源码的完整备份和数据库的自动定期导出,确保你的网站数据在任意时刻都能被完整恢复。教程涵盖Linux服务器环境下的操作,适用于WordPress、Typecho、Discuz等主流开源程序。
## 前置准备
1. **服务器环境要求**:已安装Linux操作系统(CentOS 7/8、Ubuntu 18.04/20.04均可),拥有root或sudo权限的账户。
2. **必要软件**:确认服务器已安装以下软件包——rsync(用于增量备份)、mysqldump(用于数据库导出)、crontab(用于定时任务)。若未安装,执行命令 `yum install rsync mysql -y`(CentOS)或 `apt install rsync mysql-client -y`(Ubuntu)。
3. **备份存储空间**:准备一个独立于网站服务器的存储位置,可以是另一台服务器、云存储(如阿里云OSS、腾讯云COS)或本地NAS。本教程以本地磁盘 `/backup` 目录为例,实际使用时请替换为你的远程存储挂载点。
4. **数据库访问信息**:记录网站数据库的数据库名、用户名和密码。通常可在网站根目录的配置文件中找到,例如WordPress的 `wp-config.php` 文件中包含 `DB_NAME`、`DB_USER`、`DB_PASSWORD` 参数。
5. **网站根目录路径**:确认网站源码存放的绝对路径,例如 `/var/www/html` 或 `/data/wwwroot/default`。
## 分步操作步骤
### 第一步:创建备份目录结构
在服务器上建立规范化的备份目录,便于管理不同时间点的备份文件。
1. 使用SSH登录服务器,执行以下命令创建主备份目录:
```bash
sudo mkdir -p /backup
```
2. 进入备份目录,创建按日期命名的子目录结构:
```bash
cd /backup
sudo mkdir -p $(date +%Y%m%d)/{files,database}
```
这条命令会生成类似 `20231015/files` 和 `20231015/database` 的目录结构,`files` 存放源码备份,`database` 存放数据库导出文件。
3. 设置目录权限,确保备份脚本有写入权限:
```bash
sudo chmod -R 755 /backup
```
### 第二步:编写源码备份脚本
使用rsync工具实现网站源码的增量备份,只传输变化的部分,节省带宽和时间。
1. 创建脚本文件:
```bash
sudo nano /usr/local/bin/backup-files.sh
```
2. 在打开的编辑器中粘贴以下内容(将 `/var/www/html` 替换为你的实际网站路径):
```bash
#!/bin/bash
# 网站源码备份脚本
SOURCE_DIR="/var/www/html" # 网站源码目录
BACKUP_DIR="/backup/$(date +%Y%m%d)/files"
# 创建当天的备份目录
mkdir -p $BACKUP_DIR
# 使用rsync进行增量备份,--delete参数删除源端已不存在的文件
rsync -avz --delete $SOURCE_DIR/ $BACKUP_DIR/
# 输出完成信息
echo "源码备份完成:$BACKUP_DIR"
```
3. 保存文件(Ctrl+O,回车)并退出(Ctrl+X)。
4. 赋予脚本执行权限:
```bash
sudo chmod +x /usr/local/bin/backup-files.sh
```
### 第三步:编写数据库备份脚本
使用mysqldump工具导出数据库为SQL文件,支持压缩存储。
1. 创建数据库备份脚本:
```bash
sudo nano /usr/local/bin/backup-database.sh
```
2. 粘贴以下内容(替换数据库名、用户名和密码为实际值):
```bash
#!/bin/bash
# 数据库备份脚本
DB_NAME="your_database_name" # 数据库名称
DB_USER="your_database_user" # 数据库用户名
DB_PASS="your_database_password" # 数据库密码
BACKUP_DIR="/backup/$(date +%Y%m%d)/database"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 导出数据库并压缩为.gz格式
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_$(date +%Y%m%d_%H%M%S).sql.gz
# 检查导出是否成功
if [ $? -eq 0 ]; then
echo "数据库备份成功:$BACKUP_DIR/${DB_NAME}_$(date +%Y%m%d_%H%M%S).sql.gz"
else
echo "数据库备份失败!"
exit 1
fi
```
3. 保存并退出编辑器。
4. 赋予执行权限:
```bash
sudo chmod +x /usr/local/bin/backup-database.sh
```
### 第四步:创建统一备份主脚本
将源码和数据库备份整合到一个脚本中,便于统一管理。
1. 创建主脚本:
```bash
sudo nano /usr/local/bin/backup-all.sh
```
2. 粘贴以下内容:
```bash
#!/bin/bash
# 网站完整备份主脚本
LOG_FILE="/var/log/backup.log"
echo "===== 备份开始:$(date) =====" >> $LOG_FILE
# 执行源码备份
/usr/local/bin/backup-files.sh >> $LOG_FILE 2>&1
if [ $? -eq 0 ]; then
echo "源码备份成功" >> $LOG_FILE
else
echo "源码备份失败" >> $LOG_FILE
fi
# 执行数据库备份
/usr/local/bin/backup-database.sh >> $LOG_FILE 2>&1
if [ $? -eq 0 ]; then
echo "数据库备份成功" >> $LOG_FILE
else
echo "数据库备份失败" >> $LOG_FILE
fi
echo "===== 备份结束:$(date) =====" >> $LOG_FILE
echo "" >> $LOG_FILE
```
3. 保存退出,赋予执行权限:
```bash
sudo chmod +x /usr/local/bin/backup-all.sh
```
### 第五步:设置定时自动备份
通过crontab实现每天自动执行备份任务。
1. 编辑当前用户的crontab文件:
```bash
sudo crontab -e
```
2. 在文件末尾添加以下内容(每天凌晨3点执行备份):
```
0 3 * * * /usr/local/bin/backup-all.sh
```
- 格式说明:分钟(0-59) 小时(0-23) 日(1-31) 月(1-12) 星期(0-7) 命令
- 示例:`0 3 * * *` 表示每天3:00执行
- 若需每小时执行:`0 * * * *`
- 若需每周一执行:`0 3 * * 1`
3. 保存退出,crontab会自动加载配置。验证定时任务是否生效:
```bash
sudo crontab -l
```
应显示你刚添加的那一行。
### 第六步:测试备份脚本
手动执行一次备份,验证所有脚本是否正常工作。
1. 手动运行主备份脚本:
```bash
sudo /usr/local/bin/backup-all.sh
```
2. 检查备份目录是否生成文件:
```bash
ls -la /backup/$(date +%Y%m%d)/files/
ls -la /backup/$(date +%Y%m%d)/database/
```
files目录下应有网站源码文件,database目录下应有`.sql.gz`格式的压缩包。
3. 查看日志文件确认执行状态:
```bash
cat /var/log/backup.log
```
应显示“备份成功”的相关信息。
### 第七步:配置远程同步(可选但强烈推荐)
将本地备份同步到远程服务器或云存储,防止服务器硬件故障导致备份丢失。
1. 安装rsync(若未安装):
```bash
sudo yum install rsync -y # CentOS
sudo apt install rsync -y # Ubuntu
```
2. 创建远程同步脚本:
```bash
sudo nano /usr/local/bin/sync-remote.sh
```
3. 粘贴以下内容(替换远程服务器IP、用户名和路径):
```bash
#!/bin/bash
# 远程同步脚本
REMOTE_USER="root"
REMOTE_HOST="192.168.1.100"
REMOTE_PATH="/remote_backup/"
LOCAL_PATH="/backup/"
rsync -avz --delete $LOCAL_PATH ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}
if [ $? -eq 0 ]; then
echo "远程同步成功"
else
echo "远程同步失败"
fi
```
4. 设置SSH免密登录(避免脚本执行时输入密码):
```bash
ssh-keygen -t rsa # 连续回车生成密钥
ssh-copy-id root@192.168.1.100 # 输入远程服务器密码
```
5. 将远程同步加入crontab,在备份完成后执行:
```bash
sudo crontab -e
```
添加一行(在备份任务之后30分钟执行):
```
30 3 * * * /usr/local/bin/sync-remote.sh
```
## 常见问题
**问题1:备份脚本执行报错“mysqldump: command not found”**
原因:系统未安装MySQL客户端工具。解决方法:执行 `yum install mysql -y`(CentOS)或 `apt install mysql-client -y`(Ubuntu)。若使用MariaDB,安装 `mariadb-client`。
**问题2:数据库备份文件大小为0字节**
原因:数据库用户名或密码错误,或数据库不存在。解决方法:检查脚本中的 `DB_NAME`、`DB_USER`、`DB_PASS` 是否与网站配置文件一致。可先手动执行 `mysqldump -u用户名 -p密码 数据库名` 测试连接。
**问题3:crontab定时任务未执行**
原因:crontab服务未启动或脚本路径错误。解决方法:执行 `systemctl status crond` 检查服务状态,若未运行则执行 `systemctl start crond`。同时确认脚本路径为绝对路径,且脚本有执行权限。
**问题4:rsync同步速度慢或中断**
原因:网络不稳定或文件数量过大。解决方法:在rsync命令中添加 `--progress` 参数查看进度,或使用 `--bwlimit=1000` 限制带宽(单位KB/s)。对于大文件,考虑先压缩再传输。
**问题5:备份占用磁盘空间过大**
原因:未设置备份保留策略。解决方法:在备份脚本末尾添加清理逻辑,例如删除7天前的备份:`find /backup -type d -mtime +7 -exec rm -rf {} \;`。将此命令加入crontab每天执行一次。
## 收尾总结
通过本教程,你已经完成了网站源码与数据库的自动化备份体系搭建。核心流程包括:创建备份目录结构、编写rsync增量备份脚本、使用mysqldump导出数据库、通过crontab实现每日定时执行,以及可选的远程同步方案。这套方案具备以下优势:增量备份节省存储空间、定时任务无需人工干预、远程同步防止单点故障、日志记录便于排查问题。
建议每周手动检查一次备份文件是否完整,可尝试在测试环境恢复备份数据验证可用性。对于重要网站,还可以增加备份频率(如每6小时一次)或使用多版本备份策略。记住,没有备份的数据不是真正的数据,只有经过验证的备份才是可靠的保障。