求与指定pg_restore命令等效的psql恢复命令(仅用.sql文件)
等效于指定pg_restore命令的psql恢复方案
嘿,我懂你这种抓瞎的感觉——手里只有.sql导出文件,pg_restore根本用不了,查了一堆方法还都不对症。别慌,我帮你把那条pg_restore命令转换成完全等效的psql命令行操作,完美匹配所有参数的行为:
核心等效命令
psql -v ON_ERROR_STOP=1 --verbose -h localhost -U myuser -d my_db \ --set=SESSION_REPLICATION_ROLE=replica \ -f db/latest.sql
参数对应说明
我给你拆解下每个部分对应原来pg_restore参数的作用:
--verbose:和pg_restore的--verbose完全一致,输出详细的执行日志,方便你跟踪恢复进度-h localhost -U myuser -d my_db:连接参数和原命令完全匹配,指定数据库主机、登录用户和目标数据库--set=SESSION_REPLICATION_ROLE=replica:这个参数是关键!它会让PostgreSQL自动忽略备份文件中的**所有权限设置(GRANT/REVOKE)和对象所有者变更(ALTER OWNER)**语句,正好对应pg_restore的--no-acl和--no-owner参数-v ON_ERROR_STOP=1:这是个实用的附加参数,遇到错误就立即停止执行,避免部分恢复导致的数据库不一致,和pg_restore的默认容错逻辑对齐-f db/latest.sql:指定要执行的SQL备份文件路径,替代原命令中的dump文件
关于--clean参数的处理
原pg_restore命令中的--clean是恢复前删除数据库中已存在的同名对象,这部分需要分两种情况:
- 如果你的.sql文件是用
pg_dump --clean导出的:那文件里已经包含了恢复前删除对象的DROP IF EXISTS语句,直接执行上面的核心命令就好,效果和pg_restore的--clean完全一致 - 如果你的.sql文件没有包含清理语句:可以先执行下面的命令清空目标数据库的public schema(如果有其他schema需要调整命令),再执行恢复:
psql -h localhost -U myuser -d my_db -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
这样一套操作下来,就和你原来用pg_restore的效果一模一样了!
内容的提问来源于stack exchange,提问作者James Van Leuven
相关产品推荐
相关产品推荐

