为什么我可以直接在我的批处理文件中调用 pg_dump 而不是 pg_start_backup?
Why can i call pg_dump but not pg_start_backup directly in my batch file?
我正在编写一个批处理文件,用于对 Postgres 数据库集群进行增量备份。
为了进行完整备份,我使用了 pg_dump 和 pg_dump_all,如果我这样做的话就没有问题:
@echo off && pushd "%~dp0"
set PGHOST=localhost
set PGPORT=5432
set PGUSER=postgres
set PGPASSWORD=SOMEPSW
set BACKUPDIR=C:\some\path
set CURRENTDATE=%CURRENTDATE:~0,14%
set BACKUPPATH=%BACKUPDIR%\%CURRENTDATE%
pg_dumpall -r -f %BACKUPPATH%\users.backup <---- THIS IS THE LINE I WANT TO REPLACE
popd
pause
exit /b %RETURNCODE%
(我已尝试简化示例,使其快速且易于阅读,如果有任何不清楚的地方,请告诉我)。
据我所知,我不能使用 pg_dump 和 pg_dumpall 进行增量备份,所以我想使用 pg_start_backup 和 pg_stop_backup 作为我的增量脚本的一部分,在两者之间创建 zip 并移动数据文件夹。
我现在的问题是我无法调用它们中的任何一个,因为它们不是可识别的命令。
我试过用以下方式给他们打电话:
1.
pg_start_backup('label', false, false);
这不起作用,因为 pg_start_backup 未被识别为内部或外部命令。
2.
SELECT pg_start_backup('label', false, false);
这不起作用,因为 SELECT 未被识别为内部或外部命令。
3.
psql -h %PGHOST% -p %PGPORT% -U %PGUSER% -d %DATABASES% -c "SELECT pg_start_backup('label', false, false);"
psql -h %PGHOST% -p %PGPORT% -U %PGUSER% -d %DATABASES% -c "SELECT * FROM pg_stop_backup(false, true);"
这不起作用,因为它在一个上下文中启动备份,并试图在另一个上下文中停止备份,因此抛出此错误:"ERROR: non-exclusive backup is not in progress"。
4.
psql -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -d %DB_NAME% -f test.sql
这确实有效,但我需要在 pg_start_backup 和 pg_stop_backup 之间放置一些批处理逻辑,并且我不想调用多个 sql 文件。
是什么导致了我的问题,我该如何解决?
刚发现bin文件夹里pg_dump和pg_dump都是.exe文件。猜猜这解释了为什么我可以直接给他们打电话。
但我仍然对我应该如何调用 pg_start_backup() 和 pg_stop_backup() 感到困惑。
我正在编写一个批处理文件,用于对 Postgres 数据库集群进行增量备份。
为了进行完整备份,我使用了 pg_dump 和 pg_dump_all,如果我这样做的话就没有问题:
@echo off && pushd "%~dp0"
set PGHOST=localhost
set PGPORT=5432
set PGUSER=postgres
set PGPASSWORD=SOMEPSW
set BACKUPDIR=C:\some\path
set CURRENTDATE=%CURRENTDATE:~0,14%
set BACKUPPATH=%BACKUPDIR%\%CURRENTDATE%
pg_dumpall -r -f %BACKUPPATH%\users.backup <---- THIS IS THE LINE I WANT TO REPLACE
popd
pause
exit /b %RETURNCODE%
(我已尝试简化示例,使其快速且易于阅读,如果有任何不清楚的地方,请告诉我)。
据我所知,我不能使用 pg_dump 和 pg_dumpall 进行增量备份,所以我想使用 pg_start_backup 和 pg_stop_backup 作为我的增量脚本的一部分,在两者之间创建 zip 并移动数据文件夹。
我现在的问题是我无法调用它们中的任何一个,因为它们不是可识别的命令。
我试过用以下方式给他们打电话:
1.
pg_start_backup('label', false, false);
这不起作用,因为 pg_start_backup 未被识别为内部或外部命令。
2.
SELECT pg_start_backup('label', false, false);
这不起作用,因为 SELECT 未被识别为内部或外部命令。
3.
psql -h %PGHOST% -p %PGPORT% -U %PGUSER% -d %DATABASES% -c "SELECT pg_start_backup('label', false, false);"
psql -h %PGHOST% -p %PGPORT% -U %PGUSER% -d %DATABASES% -c "SELECT * FROM pg_stop_backup(false, true);"
这不起作用,因为它在一个上下文中启动备份,并试图在另一个上下文中停止备份,因此抛出此错误:"ERROR: non-exclusive backup is not in progress"。
4.
psql -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -d %DB_NAME% -f test.sql
这确实有效,但我需要在 pg_start_backup 和 pg_stop_backup 之间放置一些批处理逻辑,并且我不想调用多个 sql 文件。
是什么导致了我的问题,我该如何解决?
刚发现bin文件夹里pg_dump和pg_dump都是.exe文件。猜猜这解释了为什么我可以直接给他们打电话。
但我仍然对我应该如何调用 pg_start_backup() 和 pg_stop_backup() 感到困惑。