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 和裂图
常见坑
- 文件权限:解压后
wp-content/uploads权限不对,上传图片失败。chown -R www-data:www-data来一次 - PHP 版本差异:老插件在新 PHP 上报错,迁移前先在原站确认 PHP 版本,尽量保持一致
- 数据库字符集:建库时指定
utf8mb4,不然中文变问号 - 忘记备份上传目录之外的定制:有人把自定义代码放在主题目录外,
wp-content之外也扫一眼 - 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 的大站,一次性打包传输不现实,分三步:
- 先迁文件:
rsync把wp-content/uploads同步过去(可断点续传,多跑几次) - 再迁数据库:选低峰期,
mysqldump导出导入 - 最后切 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 天无异常,老服务器可以销毁了,销毁前最后确认备份在手
很多迁移事故发生在"切换后第三天",因为有些定时任务是按周跑的。观察期覆盖一个完整的业务周期,才算真正收尾。