You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用psql的COPY语句时如何压缩传输的数据?

针对PostgreSQL COPY导入时的传输数据压缩方案

首先明确:PostgreSQL的COPY命令本身没有默认内置传输数据的压缩功能,你提到的sslcompression是SSL加密后的数据流压缩,对原始数据的压缩效率极低(加密后数据熵高,很难压缩),所以需要用专门的方案处理原始数据的压缩传输。

下面分场景给出可行方案:

1. PostgreSQL 12+版本(推荐)

从PostgreSQL 12开始,COPY语句支持COMPRESSION参数,允许客户端发送gzip压缩的数据,服务器自动解压后导入,完美匹配你的需求:

具体操作(Go语言场景)

  • 在Go中读取原始数据,通过compress/gzip包的gzip.Writer实时压缩数据
  • 执行COPY语句时指定压缩格式:
    COPY your_target_table (col1, col2, ...) FROM STDIN WITH (FORMAT csv, COMPRESSION 'gzip');
    
  • 使用PostgreSQL驱动(比如pgx或lib/pq)的COPY流式接口,将压缩后的数据流发送到服务器

这种方式不需要服务器端额外配置,也没有安全风险,压缩效率可通过调整gzip压缩级别平衡速度和压缩比。

2. 低于PostgreSQL 12版本

如果你的PostgreSQL版本低于12,可选择以下两种替代方案:

方案A:客户端预压缩+服务器端解压导入(需超级用户权限)

通过COPY FROM PROGRAM让服务器端执行解压命令,但该操作需要超级用户权限,且存在安全风险(不建议在不可信环境使用):

COPY your_target_table FROM PROGRAM 'gunzip -c /path/to/your/compressed/data.csv.gz' WITH (FORMAT csv);

使用前需先将压缩文件传到服务器(比如通过scp)。

方案B:传输层压缩(通用兼容)

利用SSH隧道的压缩功能,对整个PostgreSQL连接的数据流进行压缩:

ssh -C -L 5432:localhost:5432 your_postgres_server_user@your_postgres_host

之后Go客户端连接本地5432端口,所有数据(包括COPY的数据流)都会通过SSH隧道压缩传输。这种方式无需修改PostgreSQL配置,也不需要特殊权限,但压缩效率略低于直接针对原始数据的gzip压缩。

补充说明

  • 无论哪种方案,COPY都是PostgreSQL批量导入最高效的方式,搭配压缩后能大幅降低传输带宽占用
  • Go语言的compress/gzip包可轻松实现数据实时压缩,配合驱动的COPY流式接口,能做到边压缩边传输,内存占用极低

内容的提问来源于stack exchange,提问作者Markus Rother

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 09:23:28