迁移 WordPress 数据库并保持链接不变,核心只有一句话:**要么让域名保持不变(只换服务器),要么用能处理 serialize 序列化数据的方式做全文替换,并且永远不要手工修改 WordPress 的 guid 字段**。前者链接几乎不会改变;后者的常见问题是只用 SQL 直接替换,导致小工具、主题选项、页面构建器数据全部损坏。
迁移前必须备份哪些东西?
结论:一次完整的 WordPress 迁移要备份三样东西——数据库、wp-content 目录、wp-config.php,缺一不可。
导出数据库时建议用 mysqldump,并带上事务和字符集参数,避免大表锁死或中文乱码:
mysqldump -u dbuser -p --single-transaction --quick \
--default-character-set=utf8mb4 wp_db > wp_db.sql
wp-content 用 rsync -avz wp-content/ user@新IP:/var/www/html/wp-content/ 传输,比打包下载再上传稳。备份完成后再操作,因为替换域名是不可逆动作,出错只能回滚。
域名不变、只换服务器,链接怎么保持?
结论:域名不变的情况下,链接天然不变,你只需要保证新服务器上的 wp-config.php 连对数据库、站点 URL 与旧站完全一致。
步骤是:新服务器装好 PHP + MySQL + Nginx,导入 wp_db.sql,拷贝整站文件和 wp-config.php,把里面的 DB_NAME、DB_USER、DB_PASSWORD、DB_HOST 改成新库的。接下来不要急着改 DNS,先本地改 hosts 指向新 IP 测试:
- Linux/macOS:
/etc/hosts
- Windows:
C:\Windows\System32\drivers\etc\hosts
加一行 新服务器IP www.你的域名.com,浏览器访问验证首页、内页、后台、图片、表单全部正常。验证通过后再把 DNS 的 A 记录切到新 IP。切换前 24 小时把域名 TTL 从 3600 秒调低到 300 秒,可以让生效时间从 1 小时缩到 5 分钟。
域名也换了,数据库怎么改才不出错?
结论:换域名必须用支持 serialize 序列化数据的替换工具,不能直接 UPDATE wp_options SET option_value = REPLACE(...)。
原因是 WordPress 把主题选项、小工具、页面构建器配置以 PHP serialize 格式存进数据库,格式形如 s:11:"http://old";,其中 11 是字符串长度。直接替换后长度对不上,反序列化会失败,表现为小工具全部消失、页面排版错乱。
推荐两种方式:
- WP-CLI(首选),需 WP-CLI 2.7 以上:
wp search-replace 'https://old.com' 'https://new.com' \
--all-tables --precise --recurse-objects \
--skip-columns=guid --dry-run
先跑 --dry-run 看会被改动的行数,确认无误后去掉 --dry-run 正式执行。--skip-columns=guid 必须保留:guid 是文章的唯一标识,WordPress 官方明确建议迁移后保持不变,否则阅读器会把老文章当成新文章重复推送。
- 插件方式:Better Search Replace 或 WP Migrate,界面里勾选所有表、勾选 “Run as dry run” 先预演,原理同样是序列化安全替换。
替换用的新旧域名不要带结尾斜杠,http 和 https 要分开各跑一次。
迁移完成后必须检查哪几项?
结论:迁移完成后,先做固定链接重写刷新,再检查 home 和 siteurl,最后处理混合内容。
按顺序过一遍:
- 后台「设置 → 固定链接」,什么都不改直接点保存,刷新 rewrite 规则并重写
.htaccess;只改域名后内页全部 404,大多是因为漏了这一步。
- 查
wp_options 表里 home 与 siteurl 两个值,必须都是新域名,且协议(http/https)一致。
- 在
wp-config.php 中可加 define('WP_HOME','https://new.com'); 和 define('WP_SITEURL','https://new.com'); 双保险,代价是后台这两项变灰不可编辑。
- 清缓存:插件缓存、CDN 缓存、浏览器缓存三层都要清,否则看到的是旧域名页面。
- 全站搜
http:// 混合内容,用浏览器 F12 控制台看有没有 Mixed Content 警告,图片裂开基本是这个原因。
迁移后图片和小工具丢了怎么办?
结论:图片裂开通常是 uploads 目录没同步完整,或数据库里存的是旧域名绝对路径;小工具丢失则几乎都是序列化被破坏。
先用 du -sh wp-content/uploads 对比新旧两侧体积,数字不一致就重传。路径问题用上面同一条 wp search-replace 再跑一次旧域名,注意 .sql 导出文件本身也可以替换,但必须用序列化安全工具处理后再导入。
如果小工具确实已损坏,只能从迁移前的备份里恢复那几张表(wp_options、wp_postmeta),重新用正确方式替换一次——这也是为什么第一步的备份不能省。
总结:保持链接不变的本质是“数据里的域名”和“解析指向的域名”始终一致。域名不变就靠 hosts 预演 + TTL 调低平滑切换;域名变了就靠 WP-CLI 的序列化安全替换,跳过 guid、先 dry-run、后刷新固定链接。整套流程照着做,内页 404、图片裂图、小工具消失这三类高发问题都能避开。