首页
看点啥
插画图片
首页 科技看点 PostgreSQL 19老备份恢复报错?字符串设置变化怎么处理

PostgreSQL 19老备份恢复报错?字符串设置变化怎么处理

2026-11-02 0

老备份在19遇到standard_conforming_strings错误,不应马上批量替换。新版本将其固定为on,旧脚本若依赖off,删掉报错设置后也可能让后续字符串变成另一种内容。

先保存原始备份并定位错误。源库仍能访问时,优先用19工具重新导出;只剩备份时,可先恢复到理解旧行为的中转环境,再转换导出。

一、这个长名字控制的是什么?

这一设置影响普通SQL字符串里的反斜杠解释。on时按普通字符读取,需要转义时则明确采用E开头等合适写法,不应把所有字符串一起改。

SELECT 'a\nb' AS ordinary_string;SELECT E'a\nb' AS escape_string;

在 19 中,第一个例子的内容含有反斜杠和字母 n;第二个例子里的反斜杠 n 表示换行。两段文字看起来接近,保存的内容却不同。

这不是要把所有字符串都改成 E 开头。程序传入的参数、COPY 数据、SQL 字符串,各有自己的处理规则,不能用同一个替换办法处理。

二、先分清是哪一种失败

错误位置可能问题下一步
SET standard_conforming_strings = off脚本要求使用旧行为检查导出工具和源库设置,不只删除这一行
escape_string_warning 相关设置旧脚本引用了已移除参数确认是否同时存在旧转义依赖
函数、默认值、INSERT 中的字符串反斜杠或引号解释发生差异检查报错对象及前后语句,核对原值
能恢复但文字内容不对脚本语法通过,数据含义却改变停止继续使用该测试库,按原备份重新处理

三、旧库还在,优先重新导出

使用目标主版本的 pg_dump 读取旧库,比手改一个大 SQL 文件更容易保持对象和字符串的正确表达。先确认调用的工具路径:

/opt/postgresql/19/bin/pg_dump --version/opt/postgresql/19/bin/pg_dump -h old-db -U migration_user \ -d appdb -Fc -f appdb-for-19.dump

在单独准备好的空测试库恢复,并遇错停止:

/opt/postgresql/19/bin/pg_restore -h test-db -U migration_user \ -d appdb_test --exit-on-error appdb-for-19.dump

如果恢复失败,不要在半恢复的库上反复继续执行,导致对象已存在、数据重复等新问题。先查清第一处错误,重新准备干净目标库再试。

四、只剩老备份,没有源库怎么办?

先保留原始文件和校验信息,不在唯一一份备份上修改。根据备份来源与依赖,建立一个能理解旧脚本的独立环境,把原备份恢复进去。

确认中转库中的对象和数据正确后,再用 19 的导出工具重新导出,恢复到 19 测试库。中转环境用于转换和核对,不应直接暴露成日常业务库。

如果旧备份本身已经损坏,或者缺少必要扩展和外部对象,中转也不能保证自动修复;应把这些问题和字符串兼容问题分开处理。

五、为什么不建议全局替换反斜杠?

备份里可能同时有 SQL 字符串、函数体、JSON、正则表达式和 COPY 内容。同一组反斜杠,在不同位置承担的含义不一样。把所有反斜杠翻倍,可能修好一处、弄坏另一处。

只有少量自编脚本时,可以逐条按新规则改写并测试。应用代码则应优先使用驱动的参数绑定,不要继续靠自己拼接和转义字符串。

六、恢复成功后,还要核对内容

核对时先抽查路径、换行、引号、JSON和正则内容,再验证函数、触发器、默认值及重要查询。记录数相同,并不能证明字符串内容没有变化。

处理普通SQL文件时,可以要求psql在第一处错误停止。不过停止策略只能帮助找错误,无法代替数据含义核对:

psql -h test-db -U migration_user -d appdb_test \ -v ON_ERROR_STOP=1 -f backup.sql

迁移的目标是让旧内容原样保持含义。能重新导出就优先重新导出,必须改脚本时也应保留原件、局部处理、逐项测试,不要全局替换。

喜欢(0)

上一篇

PostgreSQL 19 WAIT怎么用?主库写完后让备库等到新数据

PostgreSQL 19 WAIT怎么用?主库写完后让备库等到新数据

下一篇

云数据库何时能用PostgreSQL 19?预览与正式升级怎么分

云数据库何时能用PostgreSQL 19?预览与正式升级怎么分
猜你喜欢