iCloud官方网页版入口 iCloud电脑端网页版官网入口
2026-11-02
2026-11-02 0
老备份在19遇到standard_conforming_strings错误,不应马上批量替换。新版本将其固定为on,旧脚本若依赖off,删掉报错设置后也可能让后续字符串变成另一种内容。
先保存原始备份并定位错误。源库仍能访问时,优先用19工具重新导出;只剩备份时,可先恢复到理解旧行为的中转环境,再转换导出。
这一设置影响普通SQL字符串里的反斜杠解释。on时按普通字符读取,需要转义时则明确采用E开头等合适写法,不应把所有字符串一起改。
在 19 中,第一个例子的内容含有反斜杠和字母 n;第二个例子里的反斜杠 n 表示换行。两段文字看起来接近,保存的内容却不同。
这不是要把所有字符串都改成 E 开头。程序传入的参数、COPY 数据、SQL 字符串,各有自己的处理规则,不能用同一个替换办法处理。
| 错误位置 | 可能问题 | 下一步 |
|---|---|---|
| SET standard_conforming_strings = off | 脚本要求使用旧行为 | 检查导出工具和源库设置,不只删除这一行 |
| escape_string_warning 相关设置 | 旧脚本引用了已移除参数 | 确认是否同时存在旧转义依赖 |
| 函数、默认值、INSERT 中的字符串 | 反斜杠或引号解释发生差异 | 检查报错对象及前后语句,核对原值 |
| 能恢复但文字内容不对 | 脚本语法通过,数据含义却改变 | 停止继续使用该测试库,按原备份重新处理 |
使用目标主版本的 pg_dump 读取旧库,比手改一个大 SQL 文件更容易保持对象和字符串的正确表达。先确认调用的工具路径:
在单独准备好的空测试库恢复,并遇错停止:
如果恢复失败,不要在半恢复的库上反复继续执行,导致对象已存在、数据重复等新问题。先查清第一处错误,重新准备干净目标库再试。
先保留原始文件和校验信息,不在唯一一份备份上修改。根据备份来源与依赖,建立一个能理解旧脚本的独立环境,把原备份恢复进去。
确认中转库中的对象和数据正确后,再用 19 的导出工具重新导出,恢复到 19 测试库。中转环境用于转换和核对,不应直接暴露成日常业务库。
如果旧备份本身已经损坏,或者缺少必要扩展和外部对象,中转也不能保证自动修复;应把这些问题和字符串兼容问题分开处理。
备份里可能同时有 SQL 字符串、函数体、JSON、正则表达式和 COPY 内容。同一组反斜杠,在不同位置承担的含义不一样。把所有反斜杠翻倍,可能修好一处、弄坏另一处。
只有少量自编脚本时,可以逐条按新规则改写并测试。应用代码则应优先使用驱动的参数绑定,不要继续靠自己拼接和转义字符串。
核对时先抽查路径、换行、引号、JSON和正则内容,再验证函数、触发器、默认值及重要查询。记录数相同,并不能证明字符串内容没有变化。
处理普通SQL文件时,可以要求psql在第一处错误停止。不过停止策略只能帮助找错误,无法代替数据含义核对:
迁移的目标是让旧内容原样保持含义。能重新导出就优先重新导出,必须改脚本时也应保留原件、局部处理、逐项测试,不要全局替换。