资讯文章 资讯 · NEWS
数据库批量替换是高危操作:目录站改文案、换域名的安全流程
2026-10-23 约 971 字 预计阅读 2 分钟 yiyunkj
数
做目录站迟早会遇到这一天:发现两年前写的简介里有个错误说法,而它被复制进了两千多个条目。或者在整理外链时发现某批图片的 CDN 域名换了,全文里几百处引用要跟着改。这时候很多人直接搜一篇文章,抄一条 UPDATE ... REPLACE(...) 就跑,跑完站就出事了。

图片来源:网络,版权归原作者所有,侵权请联系删除
REPLACE 这个函数有多危险
它替换的是「任何位置出现的这个字符串」。你以为在改简介里的「某某工具」,实际上条目别名、图片路径、甚至表里存的配置串,凡是含这几个字的全被改了。而且 REPLACE 区分不了语义:域名从 img-old.example.com 换到 img.example.com,如果旧域名是另一个字符串的前缀,就会出现替换套替换的连锁错。
所以规矩是:任何批量替换,先跑 SELECT 预览,再分批 UPDATE。
| 步骤 | 动作 | 目的 |
|---|---|---|
| 一 | 按同样的 WHERE 条件 SELECT COUNT | 知道会命中多少行,数字离谱立即停 |
| 二 | 随机抽几十条人工看替换后效果 | 确认替换范围没串到别的字段 |
| 三 | 按主键分批,每批几千行 | 锁表时间短,出事只伤一批 |
| 四 | 替换前留一份表快照或确认 binlog 可回滚 | 能退回原样 |
限定条件也要收紧:只替换正文所在的那张表、那一列,WHERE 里加上「该列确实包含目标串」的条件。全库无 WHERE 的替换,等于闭着眼睛动手术。
替换完,还有三样东西要重建
很多站长替换完就看一眼页面正常,收工。实际上数据库改了,下游还有三个地方存着旧内容:
第一是静态化或缓存层。生成过的 HTML、CDN 上的缓存、页面片段缓存,里面还是旧文案。逐页失效或按前缀刷新,别信「缓存过期自动更新」——过期时间设的是一年,你的错字就挂一年。
第二是站内搜索索引。搜索走的是自己的索引文件,数据库改了索引不会自动变,用户一搜还是旧词命中、新词搜不到。替换完成后跑一次全量重建,重建期间的搜索可以降级走数据库。
第三是sitemap 的 lastmod。被改动的条目,lastmod 要跟着更新,不更新的话这次修正要等很久才反映到搜索结果的摘要里。改完批量 UPDATE 一次时间戳即可。
批量替换的教训都长一个样:预览少看了一眼,回滚没提前准备。这两件事花十分钟,能省一次全站通宵。
真赶上不确定的大改动,先在测试库演练一遍。整个流程走通、抽查无误,再上生产。这不是繁琐,这是让你敢在晚上十点点下执行键的底气。