备份 PostgreSQL 数据库的简单脚本

备份 PostgreSQL 数据库的简单脚本

你好,我编写了简单的批处理脚本来备份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 ---
)

相关内容