站点换域名时用 SQL 把 old.example.com 全量替换成新域名,替换后主题设置全部丢失,后台白屏,日志报 unserialize 失败,原因是序列化串里的长度没同步。

一开始怀疑是「部分插件把域名存成 JSON,转义后匹配不到」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。PHP 序列化数据里带字符串长度,替换后长度对不上。还有一种是直接 REPLACE 覆盖了 options 表里的主题和小工具配置。

不容易想到的是,替换前没有备份,回滚只能靠旧库。

第一件事是找出含旧域名的配置记录

SELECT option_name FROM wp_options WHERE option_value LIKE '%old.example.com%';

接着用反序列化再序列化的方式替换

php -r '$v=unserialize($s);$v=str_replace("old.example.com","new.example.com",$v);echo serialize($v);'

然后检查替换后的字段长度

SELECT LENGTH(option_value) FROM wp_options WHERE option_name='theme_mods';

等前面都确认过,再导入备份后按类型分批处理

mysql -u root -p db < backup.sql

改完先别撤,确认这几项。主题设置能正常反序列化,后台不再白屏,含旧域名的记录数量归零且页面输出正常。

序列化替换必须走反序列化再序列化,纯文本替换会把配置改成不可读的坏数据。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189