我正在运行 PostgreSQL 15.7(在 Docker 中)并在 Ubuntu 22.04 上与
psql
和 pg_dump
17.0 连接。
我有两个数据库:
我运行
pg_dump
来转储 db1 的架构:
pg_dump --schema-only 'postgresql://.../db1' > schema.sql
然后我运行
psql
在 db2
上运行结果,因此最终会得到相同的模式:
psql 'postgresql://.../db2' < schema.sql
并收到此错误:
ERROR: unrecognized configuration parameter "transaction_timeout"
第 11 行结果:
SET transaction_timeout = 0;
为什么? 为什么
pg_dump
会转储 psql
或 postgres 无法识别的语句? 我怎样才能首先禁止所有这些“SET”语句包含在我的 SQL 文件中?
(我想要的只是表、索引、约束和视图。)
来自“因为 pg_dump 用于将数据传输到较新版本的 PostgreSQL,所以 pg_dump 的输出预计会加载到比 pg_dump 版本更新的 PostgreSQL 服务器版本中。pg_dump 还可以从比其自身版本更旧的 PostgreSQL 服务器转储。(目前,服务器支持回到版本 9.2。)但是,pg_dump 无法从比其自己的主要版本更新的 PostgreSQL 服务器转储;它甚至会拒绝尝试,而不是冒险进行无效转储。加载到较旧主要版本的服务器中 - 即使转储是从该版本的服务器中获取的。将转储文件加载到较旧的服务器中可能需要手动编辑转储文件以删除转储文件不理解的语法较旧的服务器。”
pg_dump 文档的 Notes 部分。 (感谢@Adrian Klaver 向我指出。)
PS - 强调我的。PPS - 这对我来说似乎是糟糕的设计,这就是为什么我发现它如此令人惊讶并且需要明确的确认。