psql COPY命令临时空间耗尽:本地还是远程主机?
判定COPY命令磁盘空间不足的主机归属
场景与执行命令
通过Python进程fork执行psql命令,实现从远程PostgreSQL数据库读取数据,通过COPY直接传输到本地PostgreSQL存储。简化后的命令如下:
psql --quiet -X --quiet --command='\pset tuples_only' --command='\copy (TABLE QUERY) to program \'psql \"--command=copy TABLE from stdin with (format binary)\"\n postgresql://apolloqa:Apollo123@LOCALHOST:PORT/LOCAL_DB\' with (format binary)' postgresql://REMOTE_USER:REMOTE_PASS@REMOTE_HOST:PORT/REMOTE_DB
(注:日志中引号格式不影响命令执行,与当前问题无关)
执行日志
Dec 20 03:06:51 LOCAL_HOST copying_server.sh[2788715]: PSQL STDOUT: Dec 20 03:06:51 LOCAL_HOST copying_server.sh[2788715]: COPY 1310 Dec 20 03:06:51 LOCAL_HOST copying_server.sh[2788715]: COPY 29285588 Dec 20 03:06:51 LOCAL_HOST copying_server.sh[2788715]: Dec 20 03:06:51 LOCAL_HOST copying_server.sh[2788715]: PSQL STDERR: Dec 20 03:06:51 LOCAL_HOST copying_server.sh[2788715]: ERROR: could not write to file \"base/pgsql_tmp/pgsql_tmp122309.3\": No space left on device Dec 20 03:06:51 LOCAL_HOST db_copy_server.sh[2788715]: ERROR: COPY file signature not recognized
问题分析与结论
- 核心错误指向:
base/pgsql_tmp/是PostgreSQL服务器端专属的临时文件存储目录,仅数据库服务进程会向该路径写入临时数据,客户端psql不会在本地生成此路径的文件。 - 错误连锁逻辑:远程数据库执行查询时,因结果集过大需写入临时文件,但远程磁盘空间耗尽导致写入失败;本地psql因接收了中断的不完整二进制数据,才触发
COPY file signature not recognized的衍生错误。 - 最终结论:磁盘空间不足的是远程数据库主机,本地主机空间充足可直接排除。
内容的提问来源于stack exchange,提问作者a693673
相关产品推荐
相关产品推荐

