我正在尝试使用 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';
结果
COPY 1
。我已经在 psql 提示符下执行了以下命令,它也有效,这让我对语法和权限相当有信心:\! echo 'punt' | 7z a -si C:/Users/Public/Documents/punt
我是否遗漏了
cmd
管道或 7zip 可执行权限?编辑: Postgres 版本是 9.3.3
根据 Craig Ringer 的回答将 dir 权限更改为
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/