Windows环境下PostgreSQL恢复脚本参数冲突问题求助
解决PostgreSQL恢复脚本的参数冲突问题
问题原因
你的矛盾来自对pg_restore --create参数的理解偏差:
--create参数的作用是自动创建目标数据库,但执行这个命令时,pg_restore需要先连接到一个已存在的数据库(比如默认的postgres管理库),才能发送创建新库的SQL命令,而不是直接连接要创建的目标库(此时它还不存在)。- 你当前的脚本里,
pg_restore --create --dbname %pgdb%指定的是要创建的目标库,导致pg_restore尝试连接一个不存在的库,所以报错;而先手动用createdb建好库后,--create又会重复执行创建命令,触发“数据库已存在”的错误。
两种修正方案
方案1:去掉createdb,让pg_restore自动创建库
修改pg_restore命令,指定连接到已存在的postgres库,同时保留--create参数:
pg_restore --create --dbname=postgres -h %pghost% -p %pgport% -U %pguser% %dmpfile%
这样pg_restore会先连接到postgres库,自动创建你指定的%pgdb%,然后将数据导入新库。
方案2:保留createdb,去掉pg_restore的--create参数
既然已经手动创建了数据库,就不需要让pg_restore再重复创建,直接连接到已创建的库进行恢复:
createdb -h %pghost% -p %pgport% -U %pguser% -T template0 %pgdb% pg_restore --dbname=%pgdb% -h %pghost% -p %pgport% -U %pguser% %dmpfile%
完整修正后的脚本示例(方案1)
@echo off cls set PGHOST=localhost set PGUSER=someuser set PGPASSWORD=somepassword set PGPORT=5432 set PGDB=gitlab echo This script will restore a PostgreSQL database dump file. set /p "dmpfile=Enter dump file name to restore: " set /p "pgdb=Enter the new database name (gitlab): " if "%pgdb%" equ "" set "pgdb=gitlab" echo. echo Importing %dmpfile% into database %pgdb% echo. echo Importing %dmpfile% echo. pg_restore --create --dbname=postgres -h %pghost% -p %pgport% -U %pguser% %dmpfile%
内容的提问来源于stack exchange,提问作者ErocM
相关产品推荐
相关产品推荐

