从 4D 备份 postgresql 数据库

Backup postgresql database from 4D

我在前端使用 4D,在后端使用 postgresql。所以我有从前端进行数据库备份的需求。

这里是我到目前为止所做的 4D 备份。

C_LONGINT(i_pg_connection)
i_pg_connection:=PgSQL Connect ("localhost";"admin";"admin";"test_db")
LAUNCH EXTERNAL PROCESS("C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe -h localhost -p 5432 -U admin -F c -b -v -f C:\Users\Admin_user\Desktop\backup_test\db_backup.backup test_db")
PgSQL Close (i_pg_connection)

但是它没有进行备份。 备份命令没问题,因为它在命令提示符下启动时完美运行。

我的代码有什么问题? 提前致谢。

代码中不需要的命令

如果您使用 LAUNCH EXTERNAL PROCESS 进行备份,则不需要 PgSQL CONNECTPgSQL CLOSE

这些插件命令不会在与 LAUNCH EXTERNAL PROCESS 相同的上下文中执行,因此在这种情况下不需要它们。

确保您有写入权限

如果 4D 数据库是 运行 作为服务,或者更具体地说,作为对 C:\Users\Admin_user\... 没有写入权限的用户,则它可能会因权限问题而失败。

确保您正在写入您具有写入权限的位置,并确保检查 $out$err 参数以查看标准输出和错误流是什么.

您需要为 pg_dump

指定密码

另一个问题是您没有指定密码。

您可以使用用户配置文件目录中的 PGPASSWORD environment variable or use a pgpass.conf 文件。

关于PGPASSWORD环境变量; documentation 有以下警告:

Use of this environment variable is not recommended for security reasons, as some operating systems allow non-root users to see process environment variables via ps; instead consider using the ~/.pgpass file

示例使用 pgpass.conf

以下示例假设您有一个 pgpass.conf 文件:

C_TEXT($c;$in;$out;$err)
$c:="C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe -h localhost -p 5432 -U admin -F"
$c:=$c+" c -b -v -f C:\Users\Admin_user\Desktop\backup_test\db_backup.backup test_db"
LAUNCH EXTERNAL PROCESS($c;$in;$out;$err)
TRACE

使用 PGPASSWORD 环境变量的示例

以下示例在调用 pg_dump 之前设置 PGPASSWORD environment variable,然后在调用之后清除变量:

C_TEXT($c;$in;$out;$err)
SET ENVIRONMENT VARIABLE ( "PGPASSWORD" ; "your postgreSQL password" )  
$c:="C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe -h localhost -p 5432 -U admin -F"
$c:=$c+" c -b -v -f C:\Users\Admin_user\Desktop\backup_test\db_backup.backup test_db"
LAUNCH EXTERNAL PROCESS($c;$in;$out;$err)
SET ENVIRONMENT VARIABLE ( "PGPASSWORD" ; "" )  // clear password for security
TRACE

调试

确保使用调试器检查 $out$err 以查看根本问题是什么。