pg_dump导出含transaction_timeout致psql报错,原因及禁用SET语句方法
我在Ubuntu 22.04上使用17.0版本的psql和pg_dump,连接Docker中的PostgreSQL 15.7。现有两个数据库:db1包含应用架构,db2为空新库。执行pg_dump --schema-only 'postgresql://.../db1' > schema.sql导出db1架构,再用psql 'postgresql://.../db2' < schema.sql执行到db2时,出现错误:ERROR: unrecognized configuration parameter "transaction_timeout",该错误来自语句SET transaction_timeout = 0;。请问为何pg_dump会导出psql或PostgreSQL无法识别的语句?如何禁用这些SET语句仅保留表、索引、约束和视图?
transaction_timeout是PostgreSQL 16及以上版本新增的配置参数,你使用的pg_dump 17.0属于高版本工具链,它会默认导出自身支持的参数配置语句,而目标数据库PostgreSQL 15.7并不支持这个参数,因此执行导入时触发错误。
方法1:使用匹配目标数据库版本的pg_dump
跨版本使用pg_dump容易引发兼容性问题,最稳妥的方案是安装与PostgreSQL 15.7版本一致的客户端工具:
# 添加PostgreSQL官方源 curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/postgresql.gpg echo "deb http://apt.postgresql.org/pub/repos/apt/ jammy-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list # 更新软件包列表并安装PG15客户端 sudo apt update sudo apt install postgresql-client-15
之后使用pg_dump15命令执行导出,这样生成的SQL只会包含PostgreSQL 15支持的配置参数,避免兼容性错误。
方法2:禁用pg_dump的配置语句导出
如果无法更换pg_dump版本,可以通过添加参数让pg_dump不导出任何SET配置语句,仅保留架构对象:
pg_dump --schema-only --no-settings 'postgresql://.../db1' > schema.sql
--no-settings参数会完全跳过所有配置参数的导出,生成的SQL仅包含表、索引、约束、视图等核心架构对象,导入到低版本数据库时不会出现参数识别错误。
内容的提问来源于stack exchange,提问作者odigity

