WordPress 整站备份与迁移:文件+数据库+配置一次搬走

换 VPS 最怕的就是 WordPress 搬家翻车。小够把整站备份与迁移拆成清单:wp-content、数据库、wp-config 逐个备份,新服务器上按步骤恢复,常见坑提前避开。

我是小够。WordPress 是 VPS 建站最常见的应用,也是搬家翻车重灾区:文件拷过去了数据库没导、图片全裂、换域名后链接全错。这篇把整站备份和迁移做成一份清单,照着走就行。

整站由哪几部分组成

先搞清楚要备份什么,一共三样:网站文件(主要是 wp-content:主题、插件、上传的图片;核心文件可重装,不必备份)、数据库(文章、评论、设置全在里面,最重要)、配置(wp-config.php、Web 服务器站点配置)。三样缺一不可,少备份数据库等于白干。

备份:三条命令

DATE=$(date +%Y-%m-%d)
# 1. 打包 wp-content
tar -czf wp-content-$DATE.tar.gz -C /var/www/html wp-content
# 2. 导出数据库并压缩(SQL 文本压缩率很高)
mysqldump -u root -p wordpress_db | gzip > wordpress-db-$DATE.sql.gz
# 3. 备份配置
cp /var/www/html/wp-config.php wp-config-$DATE.php
cp /etc/nginx/sites-available/mysite.conf nginx-$DATE.conf

迁移:新服务器上按步骤恢复

第一步:环境准备

新 VPS 上装好同样的环境:Web 服务器、PHP(版本尽量和原来一致,大版本不同可能导致插件报错)、MySQL/MariaDB。主流面板和一键脚本都能搞定这步。

第二步:恢复文件和数据库

# 解压 wp-content 到新站目录
tar -xzf wp-content-$DATE.tar.gz -C /var/www/html/
# 新建数据库并导入
mysql -u root -p -e "CREATE DATABASE wordpress_db CHARACTER SET utf8mb4;"
zcat wordpress-db-$DATE.sql.gz | mysql -u root -p wordpress_db
# 放回 wp-config.php,核对数据库名、用户名、密码是否和新环境一致

第三步:换域名(如果换了域名)

这是最容易翻车的地方。WordPress 把域名写进了数据库,直接改 wp-config 不够,要用 WP-CLI 批量替换:

wp search-replace 'old-domain.com' 'new-domain.com' --all-tables

别用 phpMyAdmin 手动改——序列化数据会被破坏,主题设置直接乱码。

第四步:DNS 切换与检查

  • 域名 A 记录指向新服务器 IP,TTL 提前一天调小(比如 300 秒),切换更快
  • 检查:首页、文章页、后台登录、图片显示、评论提交,别漏核心页面,确认没有 404 和裂图

常见坑

  1. 文件权限:解压后 wp-content/uploads 权限不对,上传图片失败。chown -R www-data:www-data 来一次
  2. PHP 版本差异:老插件在新 PHP 上报错,迁移前先在原站确认 PHP 版本,尽量保持一致
  3. 数据库字符集:建库时指定 utf8mb4,不然中文变问号
  4. 忘记备份上传目录之外的定制:有人把自定义代码放在主题目录外,wp-content 之外也扫一眼
  5. DNS 缓存:切换后自己先改 hosts 验证,别干等 DNS 生效

小够的迁移建议(动手前先过一遍)

  • 迁移前在新服务器上完整演练一次,确认没问题再切 DNS
  • 老服务器保留至少一周,别急着删——万一要回滚呢
  • 定期整站备份(文件+数据库),别只备份数据库
  • 原站 PHP 版本、MySQL 版本记下来;插件列表截图,特别是有付费/授权绑定的
  • 迁得多了,把这套流程写成脚本(打包 wp-content + mysqldump 导出 + 备份配置),下次就是一条命令的事
  • DNS 的 TTL 提前一天调到 300 秒

常见问题

Q:插件备份和手动备份哪个靠谱? A:新手先用插件(如 UpdraftPlus),一键备份一键恢复;同时学手动流程,迟早用得上——插件解决不了所有问题。

Q:数据库很大,mysqldump 导不出怎么办? A:加 --single-transaction 避免锁表;实在太大分表导出或用物理备份。但大多数博客站,mysqldump 完全够用。

Q:迁移后网站变慢了? A:先查新 VPS 配置是不是比原来低,再查 PHP 版本和缓存插件。迁移本身不应该变慢,变慢说明环境有差异。

Q:一定要换 PHP 版本吗? A:不一定,但建议和原站保持一致,稳定优先。升级 PHP 是另一件事,别和迁移搅在一起,一次只动一个变量。

面板用户的迁移

用宝塔、1Panel 这类面板的,迁移更简单:新服务器装同样的面板,用自带的"网站备份"一键打包(文件+数据库),传到新服务器一键恢复。但换域名那步还是要手动做 search-replace,面板帮不了你。

数据库字符集:中文乱码的根源

-- 建库时指定字符集和排序规则
CREATE DATABASE wordpress_db
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

WordPress 官方推荐 utf8mb4,emoji 和生僻字都能存。如果原库是 utf8(注意不是 utf8mb4),导入时保持一致,别混用——混用了中文变问号,修起来很痛苦。

wp-config.php 要对的三件事

define('DB_NAME', 'wordpress_db');     // 1. 数据库名对不对
define('DB_USER', 'wpuser');           // 2. 用户名对不对
define('DB_PASSWORD', 'xxx');          // 3. 密码对不对
define('DB_HOST', 'localhost');

新环境的数据库用户密码很可能和原来不一样,这三行是迁移后白屏最常见的原因,表前缀 $table_prefix 也要和原站一致。

SSL 证书

用 Let’s Encrypt 的,在新服务器上重新申请一张,几分钟的事;用商家 CDN 的,DNS 切过去后在 CDN 面板里确认证书。先保证 HTTP 能访问,再折腾 HTTPS,别两个变量一起调。

邮件发送

WordPress 的找回密码、评论通知依赖发邮件。很多 VPS 商家默认封 25 端口,迁移后常发现邮件发不出去了:

  • 检查 25 端口通不通:telnet smtp.gmail.com 25
  • 不通就用 SMTP 插件走 465/587 端口,或接第三方邮件服务

这是迁移后最容易被忽略的一环。

回滚方案

万一切换后发现大问题:DNS 切回老服务器(TTL 已经调小,几分钟生效);老服务器保留至少一周,先别删;在新服务器上慢慢排查,修好了再切。老服务器是你的后悔药,确认无误之前别动它。

迁移后优化清单

  • 装缓存插件(之前没装的话,趁机装上)
  • 检查定时任务(wp-cron)正常,跑一遍 broken link 检查
  • 换了域名的话,Search Console 里提交地址变更
  • 旧服务器的备份保留 30 天再删

插件数据的特殊处理

有些插件把数据存在奇怪的地方,整站备份时容易漏:

  • 缓存插件(WP Rocket、W3TC):缓存目录巨大,备份时排除,迁移后重建。wp-content/cache 不用备
  • 备份插件自己的备份:UpdraftPlus 的备份存 wp-content/updraft,整站打包时记得带上
  • 安全插件(Wordfence):防火墙规则存数据库,跟着数据库走,不用单独处理

原则:能重建的不备,建了很贵的才备。缓存重建几分钟的事,不值得占备份空间。

大站迁移:分步走

文章上万篇、附件几十 GB 的大站,一次性打包传输不现实,分三步:

  1. 先迁文件:rsync 把 wp-content/uploads 同步过去(可断点续传,多跑几次)
  2. 再迁数据库:选低峰期,mysqldump 导出导入
  3. 最后切 DNS:切换前再 rsync 一次增量,把切换窗口的数据补上

rsync 的增量特性是大站迁移的神器:第一次传 90%,第二次只传变化的 10%。

迁移后必做的检查清单

  • 首页、文章页、分类页正常打开
  • 后台能登录,插件列表完整
  • 图片、附件正常显示(随机抽 20 张)
  • 评论能提交
  • 搜索功能正常
  • 伪静态规则生效(Nginx 的 try_files / Apache 的 .htaccess)
  • 定时发布、计划任务正常
  • 邮件能发出(找回密码测试)
  • 手机端访问正常

小够踩过的坑

有年帮朋友迁站,一切正常,唯独定时发布的文章没发:wp-cron 依赖网站被访问才触发,新服务器没配系统 cron,半夜没人访问任务就睡过去了。教训:迁移后配好 DISABLE_WP_CRON 和系统 cron。

还有一次:忘记迁 SSL 证书的自动续期。certbot 定时任务在老服务器上,新服务器没配,90 天后证书过期网站打不开。迁移清单里加上"续期任务",别漏。

常见问题(续)

Q:迁移后 Google 收录掉了? A:正常波动 1-2 周。确认 301 跳转(换域名时)、sitemap 已更新、Search Console 重新提交。掉超过一个月,查 robots.txt——迁移时有人把测试环境的 Disallow: / 带过去了。

Q:数据库密码里有特殊字符,导入报错? A:命令行里密码用单引号包起来,或写进 ~/.my.cnf。特殊字符在 shell 里会被解析,这是 shell 的问题不是 MySQL 的问题。

迁移插件对比:All-in-One vs Duplicator vs 手动

方案优点缺点适合
All-in-One WP Migration一键打包一键恢复,最简单免费版有体积限制(大站要付费版)新手、小站
Duplicator免费版功能全,专业步骤多一点,要跟着向导走有点基础的
手动(本文流程)完全可控,可自动化要懂命令行要写脚本、要批量

第一次迁用插件,先保证成功;第二次起学手动,插件解决不了所有问题(比如换环境、批量迁)。插件迁移注意:目标服务器的 upload_max_filesize 要大于备份包,不然导入传不上去,改 php.ini 或在面板里调。

多站点(Multisite)迁移注意

WordPress 多站点迁移是地狱难度:数据库里有多套表(wp_2_posts 这种),search-replace 要全表跑;wp-config.php 里的多站点常量(MULTISITE、SUBDOMAIN_INSTALL)要原样搬;.htaccess 或 Nginx 规则更复杂。

多站点如非必要别迁,迁了一定要先在测试环境演练。翻车概率是单站点的五倍,小够把话放这。

附件外链:CDN 上的文件

如果图片放在对象存储/CDN 上(比如用插件接的 S3),迁移时注意三点:附件 URL 是绝对地址,换域名要一并替换;CDN 的源站改成新服务器 IP;先迁源站,再切 CDN,别反了。

迁移时间窗口选择

  • 凌晨 2-5 点动手,流量最低;提前发公告(有用户的话)
  • 准备回滚,TTL 已调小;迁移后 24 小时内别做其他变更(一次只动一个变量)

小够的最后一句

迁移的本质是"换房子不丢东西":清单、演练、回滚,三件套缺一不可。很多人翻车不是因为技术难,是没清单、没演练、没留后路。看着步骤多,其实就是"备份三件套 + 恢复四步走 + 检查清单"。收藏好这篇,下次换 VPS 直接开工。

迁移后的 7 天观察期

切换完成不是结束,接下来 7 天是观察期:

  • 每天看一眼访问日志,有没有异常 404
  • 监控告警开着,流量、错误率有波动立刻知道
  • 第 3 天、第 7 天各做一次完整备份,确认新环境的备份链路是通的
  • 7 天无异常,老服务器可以销毁了,销毁前最后确认备份在手

很多迁移事故发生在"切换后第三天",因为有些定时任务是按周跑的。观察期覆盖一个完整的业务周期,才算真正收尾。