1

我将 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)

但它没有采取备份。备份命令没问题,因为它在命令提示符下触发时可以完美运行。

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

4

1 回答 1

1

代码中不需要的命令

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

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

确保您具有写入权限

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

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

您需要为 pg_dump 指定密码

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

您可以使用PGPASSWORD环境变量或使用pgpass.conf用户配置文件目录中的文件。

关于PGPASSWORD环境变量;该文档有以下警告:

出于安全原因,不建议使用此环境变量,因为某些操作系统允许非 root 用户通过 ps 查看进程环境变量;而是考虑使用 ~/.pgpass 文件

使用 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 环境变量,然后在调用之后清除该变量:

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查看潜在问题是什么。

于 2016-06-27T16:14:23.957 回答