WordPress 自动备份与恢复方案
数据是网站最宝贵的资产。无论是服务器故障、误操作还是被黑客入侵,一套可靠的备份方案都能让你快速恢复网站。本文将介绍在搬瓦工 VPS 上实现 WordPress 自动备份的多种方案,包括命令行脚本备份、插件备份和远程存储同步,以及完整的灾难恢复流程。
一、备份策略设计
一个合理的备份策略应遵循 3-2-1 原则:
- 3 份备份:至少保留 3 份数据副本。
- 2 种介质:存储在至少 2 种不同的存储介质上。
- 1 份异地:至少 1 份备份存储在异地(不同于服务器所在的数据中心)。
WordPress 备份需要包含两部分:
- 数据库:包含所有文章、页面、评论、设置等内容数据。
- 文件:包含主题、插件、上传的媒体文件和配置文件。
二、命令行自动备份脚本
2.1 创建备份目录
mkdir -p /root/backups/wordpress
mkdir -p /root/backups/wordpress/db
mkdir -p /root/backups/wordpress/files
2.2 编写完整备份脚本
创建 /root/wp-backup.sh:
#!/bin/bash
# WordPress 自动备份脚本
# 用法: ./wp-backup.sh [full|db|files]
set -euo pipefail
# 配置变量
WP_PATH="/var/www/html"
BACKUP_DIR="/root/backups/wordpress"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30
# 数据库配置(从 wp-config.php 自动读取)
DB_NAME=$(grep "DB_NAME" $WP_PATH/wp-config.php | cut -d "'" -f 4)
DB_USER=$(grep "DB_USER" $WP_PATH/wp-config.php | cut -d "'" -f 4)
DB_PASS=$(grep "DB_PASSWORD" $WP_PATH/wp-config.php | cut -d "'" -f 4)
DB_HOST=$(grep "DB_HOST" $WP_PATH/wp-config.php | cut -d "'" -f 4)
BACKUP_TYPE=${1:-full}
echo "[$DATE] 开始 WordPress $BACKUP_TYPE 备份..."
# 数据库备份
backup_db() {
echo "正在备份数据库..."
DB_FILE="$BACKUP_DIR/db/db_${DATE}.sql.gz"
mysqldump -u"$DB_USER" -p"$DB_PASS" -h"$DB_HOST" \
--single-transaction \
--routines \
--triggers \
--add-drop-table \
"$DB_NAME" | gzip > "$DB_FILE"
echo "数据库备份完成: $DB_FILE ($(du -h $DB_FILE | cut -f1))"
}
# 文件备份
backup_files() {
echo "正在备份文件..."
FILES_FILE="$BACKUP_DIR/files/files_${DATE}.tar.gz"
tar -czf "$FILES_FILE" \
--exclude="$WP_PATH/wp-content/cache" \
--exclude="$WP_PATH/wp-content/upgrade" \
-C "$(dirname $WP_PATH)" "$(basename $WP_PATH)"
echo "文件备份完成: $FILES_FILE ($(du -h $FILES_FILE | cut -f1))"
}
# 清理旧备份
cleanup() {
echo "清理 ${RETENTION_DAYS} 天前的旧备份..."
find "$BACKUP_DIR" -type f -mtime +$RETENTION_DAYS -delete
echo "清理完成"
}
# 执行备份
case $BACKUP_TYPE in
full)
backup_db
backup_files
;;
db)
backup_db
;;
files)
backup_files
;;
*)
echo "用法: $0 [full|db|files]"
exit 1
;;
esac
cleanup
echo "[$DATE] 备份全部完成!"
echo "备份目录总大小: $(du -sh $BACKUP_DIR | cut -f1)"
chmod +x /root/wp-backup.sh
2.3 设置定时任务
crontab -e
添加以下定时任务:
# 每天凌晨 3 点备份数据库
0 3 * * * /root/wp-backup.sh db >> /var/log/wp-backup.log 2>&1
# 每周日凌晨 4 点全量备份
0 4 * * 0 /root/wp-backup.sh full >> /var/log/wp-backup.log 2>&1
三、使用 WP-CLI 备份
WP-CLI 提供了便捷的数据库导出功能:
# 导出数据库
wp db export /root/backups/wordpress/db/wp_db_$(date +%Y%m%d).sql --allow-root
# 压缩导出的数据库
wp db export - --allow-root | gzip > /root/backups/wordpress/db/wp_db_$(date +%Y%m%d).sql.gz
# 查看数据库大小
wp db size --allow-root
四、远程存储同步
4.1 使用 Rclone 同步到云存储
Rclone 支持数十种云存储服务,是异地备份的最佳工具:
# 安装 Rclone
curl https://rclone.org/install.sh | bash
# 配置远程存储(交互式配置)
rclone config
以 Backblaze B2 为例,配置完成后同步备份:
# 同步备份文件到 B2 存储
rclone sync /root/backups/wordpress remote:wp-backup --progress
# 查看远程备份文件
rclone ls remote:wp-backup
# 检查同步状态
rclone check /root/backups/wordpress remote:wp-backup
将远程同步添加到备份脚本末尾或单独设置定时任务:
# 每天凌晨 5 点同步到远程存储
0 5 * * * rclone sync /root/backups/wordpress remote:wp-backup --log-file=/var/log/rclone.log 2>&1
4.2 使用 rsync 同步到另一台服务器
如果你有多台搬瓦工 VPS,可以使用 rsync 在服务器间同步备份:
# 配置免密钥 SSH 登录到备份服务器
ssh-keygen -t ed25519 -f ~/.ssh/backup_key -N ""
ssh-copy-id -i ~/.ssh/backup_key.pub user@备份服务器IP
# 使用 rsync 同步
rsync -avz --delete \
-e "ssh -i ~/.ssh/backup_key" \
/root/backups/wordpress/ \
user@备份服务器IP:/root/backups/wordpress-remote/
五、增量备份方案
全量备份占用大量磁盘空间,增量备份可以大幅节省存储:
#!/bin/bash
# 增量备份脚本 - 使用 rsync 和硬链接
BACKUP_DIR="/root/backups/wordpress/incremental"
WP_PATH="/var/www/html"
DATE=$(date +%Y%m%d_%H%M%S)
LATEST_LINK="$BACKUP_DIR/latest"
mkdir -p "$BACKUP_DIR/$DATE"
rsync -a --delete \
--link-dest="$LATEST_LINK" \
--exclude="wp-content/cache" \
"$WP_PATH/" "$BACKUP_DIR/$DATE/"
# 更新 latest 链接
rm -f "$LATEST_LINK"
ln -s "$BACKUP_DIR/$DATE" "$LATEST_LINK"
echo "增量备份完成: $BACKUP_DIR/$DATE"
六、恢复流程
6.1 恢复数据库
# 解压数据库备份
gunzip /root/backups/wordpress/db/db_20260328_030000.sql.gz
# 使用 WP-CLI 导入
wp db import /root/backups/wordpress/db/db_20260328_030000.sql --allow-root
# 或使用 mysql 命令导入
mysql -u wp_user -p wordpress_db < /root/backups/wordpress/db/db_20260328_030000.sql
6.2 恢复文件
# 解压文件备份到临时目录
mkdir -p /tmp/wp-restore
tar -xzf /root/backups/wordpress/files/files_20260328_040000.tar.gz -C /tmp/wp-restore
# 恢复文件(保留原有权限)
rsync -a --delete /tmp/wp-restore/html/ /var/www/html/
# 修复文件权限
chown -R www-data:www-data /var/www/html
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
# 清理临时文件
rm -rf /tmp/wp-restore
6.3 完整恢复后的检查
# 检查 WordPress 核心文件完整性
wp core verify-checksums --allow-root
# 刷新固定链接
wp rewrite flush --allow-root
# 清理缓存
wp cache flush --allow-root
# 检查网站是否正常
curl -sI https://your-domain.com | head -5
七、备份监控与通知
为备份脚本添加邮件通知功能,确保备份失败时能及时发现:
#!/bin/bash
# 在备份脚本末尾添加通知
MAIL_TO="your-email@example.com"
# 检查备份是否成功
if [ $? -eq 0 ]; then
SUBJECT="[成功] WordPress 备份完成 - $(date +%Y-%m-%d)"
BODY="WordPress 备份已成功完成。\n备份大小: $(du -sh $BACKUP_DIR | cut -f1)\n磁盘剩余: $(df -h / | awk 'NR==2{print $4}')"
else
SUBJECT="[失败] WordPress 备份失败 - $(date +%Y-%m-%d)"
BODY="WordPress 备份失败,请立即检查!\n错误日志: /var/log/wp-backup.log"
fi
echo -e "$BODY" | mail -s "$SUBJECT" "$MAIL_TO"
总结
可靠的备份是网站运营的生命线。本文介绍了从简单的命令行脚本到完整的 3-2-1 备份方案。对于大多数搬瓦工 VPS 上的 WordPress 站点,推荐使用命令行脚本进行每日数据库备份和每周全量备份,再通过 Rclone 同步到云存储实现异地备份。定期测试恢复流程,确保备份真正可用。备份到位后,可以继续学习 安全加固教程 和 速度优化指南,全面提升网站质量。选购搬瓦工 VPS 请查看 全部方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣,通过 bwh81.net 进入官网购买。