从4D备份postgresql数据库
我使用4D作为前端,postgresql作为后端。因此,我需要从前端进行数据库备份 这里是我到目前为止在4D中进行备份所做的工作从4D备份postgresql数据库,postgresql,backup,4d-database,Postgresql,Backup,4d Database,我使用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 localh
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)
但它不需要备份。
backup命令正常,因为它在命令提示符下启动时工作正常
我的代码出了什么问题?
提前感谢。代码中不需要的命令
如果您使用进行备份,则不需要使用PgSQL CONNECT
和PgSQL CLOSE
这些插件命令不会在与启动外部进程相同的上下文中执行,因此在这种情况下不需要它们
确保您具有写访问权限
如果4D数据库作为服务运行,或者更具体地说,作为对C:\Users\Admin\u user\…
没有写入权限的用户运行,则可能由于权限问题而失败
确保您正在向具有写访问权限的位置进行写入,并且确保检查$out
和$err
参数以查看标准输出和错误流是什么
您需要为pg_dump指定密码
另一个问题是您没有指定密码
您可以使用环境变量,也可以使用用户配置文件目录中的文件
关于PGPASSWORD
环境变量;警告如下:
出于安全原因,不建议使用此环境变量,因为某些操作系统允许非root用户通过ps查看流程环境变量;取而代之的是考虑使用~/.pGPASS文件< /P>
使用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
以查看根本问题。谢谢。我尝试了你的代码并调试了它。它触发命令并显示密码提示。在我输入密码后,它会在那里死掉。它确实可以进一步处理。退出的唯一方法是退出命令提示符。另外,它会创建备份文件,但为空。它发生在分配给$err的值之前,因此我也无法获得错误值。只有当命令写入错误流时,$err才会被填充。关于密码,您需要将其作为参数嵌入。在将密码作为参数引用时,您的意思是将“-W password”添加到上述命令的username后面吗?它不起作用。首先,请确保在没有密码提示的情况下,从命令提示符下有一个有效的命令,这一点很重要,因为之后您将无法向流发送其他数据,例如如果命令提示输入密码。命令在命令提示符下运行后,将相同的命令和参数输入4D的启动外部进程
。看起来您可能需要使用at%APPDATA%\postgresql\pgpass.conf
非常感谢您。现在,postgresql数据库的备份和恢复工作正常,无需按照您的方式手动提供密码。再次感谢。