你好,我编写了简单的批处理脚本来备份postgeSQL数据库,但我发现一个奇怪的问题,pg_dump命令可以指定密码吗?
有批处理脚本:
REM script to backup PostgresSQL databases
@ECHO off
FOR /f "tokens=1-4 delims=/ " %%i IN ("%date%") DO (
SET dow=%%i
SET month=%%j
SET day=%%k
SET year=%%l
)
SET datestr=%month%_%day%_%year%
SET db1=opennms
SET db2=postgres
SET db3=sr_preproduction
REM SET db4=sr_production
ECHO datestr is %datestr%
SET BACKUP_FILE1=D:\%db1%_%datestr%.sql
SET FIlLENAME1=%db1%_%datestr%.sql
SET BACKUP_FILE2=D:\%db2%_%datestr%.sql
SET FIlLENAME2=%db2%_%datestr%.sql
SET BACKUP_FILE3=D:\%db3%_%datestr%.sql
SET FIlLENAME3=%db3%_%datestr%.sql
SET BACKUP_FILE4=D:\%db14%_%datestr%.sql
SET FIlLENAME4=%db4%_%datestr%.sql
ECHO Backup file name is %FIlLENAME1% , %FIlLENAME2% , %FIlLENAME3% , %FIlLENAME4%
ECHO off
pg_dump -U postgres -h localhost -p 5432 %db1% > %BACKUP_FILE1%
pg_dump -U postgres -h localhost -p 5432 %db2% > %BACKUP_FILE2%
pg_dump -U postgres -h localhost -p 5432 %db3% > %BACKUP_FILE3%
REM pg_dump -U postgres -h localhost -p 5432 %db4% > %BACKUP_FILE4%
ECHO DONE !
请给我建议
问候 Mick
答案1
pg_dump
您无法像在命令行中一样为 Postgres 实用程序指定密码。
这将是一个巨大的安全漏洞,需要令人厌恶的解决方法来缓解。
你能做的是创建pgpass
文件,pg_dump
将进行咨询。
根据您的需求,您可能需要考虑进行文件系统级备份而不是使用pg_dump
--pg_dump
则需要在运行时锁定数据库的各个部分,并且可能会中断系统的正常使用。或者,考虑在从属系统上运行备份过程。
答案2
您还可以创建一个专用用户,限制其使用本地主机,并具有较低的权限,无需密码即可连接。(例如 unix 用户)。
我们使用了它,如果用户受到良好的保护,它就不会破坏安全性。
答案3
感谢您的 cmd 脚本。我用它编写了自己的脚本,如下所示。它将备份存储在 postgresql 中的所有数据库,并将其格式化为 pg_dump 使用的自定义格式的文件,yyyymmdd_hhss
名称中包含日期。待办事项:备份完整架构,但不备份数据。
数据库名称存储在%%d
循环中的变量中。您可以安全地更改:
- “backup_data_dir” (必须以 结尾)
- “pg_user”(默认为 postgres)
- “pg_bin_dir” (必须以 结尾)
注意:我是法国人。%date% 为 dd/mm/yyyy,“DEBUT” 为“START”,“FI N” 为“EN D”。
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET backup_data_dir=C:\path\to\backup\
SET backup_file_name=%COMPUTERNAME%.%date:~6,4%%date:~3,2%%date:~0,2%_%time:~0,2%%time:~3,2%.PGDMP
SET pg_user=--username=postgres
SET pg_dmp_option=--clean %pg_user% --format=custom
SET pg_lst_db=psql.exe %pg_user% --list --field-separator=^; --tuples-only --no-align
SET pg_bin_dir=C:\Program Files\PostgreSQL\9.6\bin\
CD /D %pg_bin_dir%
FOR /f "delims=; tokens=1" %%d IN ('!pg_lst_db!^| find ";"^|find /v "template0"') DO (
@ECHO !date! !time! pg_dump de la base [%%d] --- DEBUT ---
SET backup_file_name=%%d.%backup_file_name%
SET pg_dmp_option=%pg_dmp_option% --file="%backup_data_dir%!backup_file_name!" --dbname=%%d
pg_dump.exe !pg_dmp_option!
ECHO !date! !time! pg_dump de la base [%%d] --- F I N ---
)