我正在为在 Windows 2022 上运行 PostgreSQL 的服务器创建备份脚本。
我对 Postgres 相当陌生,我一直在搜索这个,直到我脸色发青,但当我运行脚本时,我的开关似乎相互矛盾。
这是我到目前为止的脚本:
@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 off
echo Creating database %pgdb%
echo.
createdb -h %pghost% -p %pgport% -U %pguser% -T template0 %pgdb%
echo.
echo Importing %dmpfile%
echo.
pg_restore --create --dbname %pgdb% %dmpfile%
如果我没有 createdb 行,我会收到以下消息:
pg_restore:错误:连接到“localhost”(::1)的服务器,端口 5432 失败:致命:数据库“gitlab”不存在
如果我使用 createdb 创建数据库,那么当恢复运行时,我会收到以下消息:
pg_restore:错误:无法执行查询:错误:数据库“gitlab”已存在 命令是:使用模板创建数据库 gitlab = template0 ENCODING = 'UTF8' LOCALE_PROVIDER = libc LOCALE = 'English_United States.1252';
我不明白。如果我创建它,它会说它已经存在,如果我不创建它,它会抱怨它不存在。
我做错了什么?
当您对 pg_restore 使用 --create 时,在命令行上指定的数据库是连接到的“实用程序”数据库,以便执行 CREATE DATABASE 命令。这通常是“postgres”或“template1”。在这种情况下,要创建和恢复的数据库的名称来自转储文件中,未在命令行上指定。
因此,要么预先创建数据库,但不要使用 --create,并指定要恢复到的预先创建的数据库的名称。或者不预先创建数据库并使用 --create,但随后指定不同的已存在实用程序数据库的名称。
如果您希望恢复的数据库名称与最初转储的名称不同,那么您必须使用第一个选项(或者之后重命名)