【发布时间】:2014-05-05 13:05:06
【问题描述】:
我正在尝试使用 COPY 语句转储 PostgreSQL 表。我使用的是 COPY 而不是 pg_dump,因为我需要在其中一列出现时对其执行转换。
我要执行的语句本质上是这样的
COPY ( SELECT 'punt' ) TO PROGRAM '7z a -si C:/Users/Public/Documents/punt';
但我收到一般错误
ERROR: program "7z a -si C:/Users/Public/Documents/punt" failed
DETAIL: child process exited with exit code 1
我正在尝试通过类似于COPY 文档中的the fourth example 的 7zip 传递COPY 输出,以便压缩输出,因为数据库大约为 130 GB,并且我理想地使用 SSD。以下命令可以正常工作:
COPY ( SELECT 'punt' ) TO 'C:/Users/Public/Documents/punt';
结果为@987654328@。我在 psql 提示符下执行了以下命令,它也可以工作,这让我对语法和权限相当有信心:
\! echo 'punt' | 7z a -si C:/Users/Public/Documents/punt
我是否缺少有关 cmd 管道或 7zip 可执行权限的内容?
编辑: Postgres 版本是 9.3.3
根据 Craig Ringer 的回答,将目录权限更改为 NETWORK SERVICE 后,我仍然遇到同样的错误。但是,这并没有解决问题,并且错误是相同的。即使更改了目标目录的权限以完全控制Everyone,我仍然遇到同样的错误。我还尝试更改 7zip 可执行文件和 7zip Program Files 目录的权限,但无济于事。
在实验中,我运行了以下命令,将副本中的输入排除在等式之外:
COPY ( select '1' ) TO PROGRAM 'echo punt | 7z a -si C:/Users/Public/Documents/punt';
奇怪地收到了失败消息,但退出代码为 255,对于 7zip has the meaning“用户停止了进程”。我自己似乎找不到原因。
【问题讨论】:
-
\!不会报告或关心命令的退出状态,而COPY...PROGRAM会。您确定它在您的上一个示例中确实有效吗? -
@jjanes 确实如此。在命令之前,
punt.7z不存在,而在命令之后,它存在。事实上,我确实看到通过\!运行时的输出与直接从命令行运行时的输出相同。
标签: windows postgresql cmd psql pg-dump