站点换域名时用 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
改完先别撤,确认这几项。主题设置能正常反序列化,后台不再白屏,含旧域名的记录数量归零且页面输出正常。
序列化替换必须走反序列化再序列化,纯文本替换会把配置改成不可读的坏数据。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
