我使用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)
但它没有进行备份。 备份命令没问题,因为它在命令提示符下触发时工作正常。
我的代码有什么问题? 提前谢谢。
答案 0 :(得分:1)
如果您使用LAUNCH EXTERNAL PROCESS
进行备份,则不需要PgSQL CONNECT
和PgSQL CLOSE
。
这些插件命令不会在LAUNCH EXTERNAL PROCESS
的上下文中执行,因此在这种情况下不需要它们。
如果4D数据库作为服务运行,或者更具体地说是作为对C:\Users\Admin_user\...
没有写访问权限的用户运行,那么由于权限问题,它可能会失败。
确保您正在写入您具有写入权限的位置,并确保检查$out
和$err
参数以查看标准输出和错误流是什么。< / p>
另一个问题是您没有指定密码。
您可以使用PGPASSWORD
环境变量,也可以在用户的配置文件目录中使用pgpass.conf
文件。
关于PGPASSWORD
环境变量; documentation有以下警告:
出于安全原因,不建议使用此环境变量,因为某些操作系统允许非root用户通过ps查看进程环境变量;而是考虑使用〜/ .pgpass文件
以下示例假定您已准备好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
以下示例在调用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
以查看潜在问题。