我正在尝试使用 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
我正在尝试通过类似于 the fourth example 的 7zip 传递 COPY
输出在 COPY
文档中,以便压缩输出,因为数据库大约为 130 GB,我理想情况下使用 SSD。以下命令工作正常:
COPY ( SELECT 'punt' ) TO 'C:/Users/Public/Documents/punt';
结果 COPY 1
。我在 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 “用户停止了进程”。我自己似乎找不到原因。
最佳答案
这将是一个权限问题。
默认情况下,PostgreSQL 服务器在 9.2 及更高版本中以 NETWORKSERVICE
运行,在 9.1 及以下版本中以用户身份运行 postgres
。 COPY
作为用户 PostgreSQL 运行服务器端,它自己运行。
这两者都不太可能有权写入 C:\Users\Public\Documents
。
您需要使用 Windows 安全属性对话框授予 PostgreSQL 服务用户在此处写入的权限,或者选择它可以写入的其他位置。
它与 \!
一起工作,因为 psql
以您的用户身份运行,将有权在那里写入,并且 \!
作为运行 psql
的用户在客户端运行命令。
关于windows - postgres COPY (...) TO PROGRAM on Windows 给出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22672686/