2GB大型CSV文件导入PostgreSQL出现报错如何解决
PostgreSQL 2GB CSV导入报错解决方案
报错根因
- 低版本出现的
value too large:CSV中存在未正确转义的分隔符、引号或字段内换行符,导致COPY解析时将多行数据识别为单行,拼接后的字段长度超出表定义的字段上限。 - 升级PG14后的OOM报错:错误信息中提到的1073740884字节接近1GB,是PG内部字符串缓冲区的默认上限,解析到异常行时,因为格式识别错误将近1GB内容判定为单个字符串字段,触发缓冲区扩容失败。
解决步骤
1. 定位并修复异常行
报错已明确异常行号为1132693,首先提取该行及相邻行校验格式:
sed -n '1132690,1132700p' 你的CSV文件路径 > 校验样本.csv
重点检查以下问题:
- 字段包裹用的引号是否成对,是否存在未转义的半角引号
- 字段内包含逗号/分隔符时,是否用引号正确包裹
- 是否存在字段内换行,导致COPY误判为行结束
修复异常行的格式后可先尝试重新导入。
2. 补全COPY命令格式参数
很多报错是因为COPY默认参数和CSV实际格式不匹配导致,根据你的CSV格式调整参数,标准RFC4180格式的CSV推荐使用以下命令:
服务端导入(CSV文件存放在PG服务器上)
COPY 你的表名 FROM '/服务器上的CSV绝对路径' WITH ( FORMAT csv, HEADER true, -- *如果CSV没有表头请删除该参数* DELIMITER ',', QUOTE '"', ESCAPE '"', ENCODING 'UTF8' -- 需和CSV文件的实际编码一致,常见编码还有GBK );
客户端导入(CSV文件存放在本地,通过psql连接远程PG)
使用\copy命令规避服务器文件权限限制:
\copy 你的表名 FROM '本地CSV绝对路径' WITH ( FORMAT csv, HEADER true, DELIMITER ',', QUOTE '"', ESCAPE '"', ENCODING 'UTF8' );
3. 大文件分片导入(可选)
如果全量导入仍然有内存压力,可将大文件拆分后分批导入:
# 按每100万行一个分片拆分CSV split -l 1000000 你的CSV文件路径 csv_part_
逐个导入生成的csv_part_开头的分片文件即可。
4. 临时调整PG内存参数(可选)
如果确认表中存在超大文本字段(单字段长度接近1GB),可临时调整PG配置后再导入:
修改postgresql.conf文件中的以下参数:
work_mem = 2GB maintenance_work_mem = 4GB
重启PG服务后执行导入,导入完成后将参数改回原值,避免日常运行占用过多内存。
结果校验
导入完成后执行行数统计,和CSV实际总行数对比确认导入完整:
SELECT COUNT(*) FROM 你的表名;
内容的提问来源于stack exchange,提问作者Ab6578
相关产品推荐
相关产品推荐

