ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

PostgreSQL 大对象导出报错问题分析

2022-05-19 20:01:34  阅读:289  来源: 互联网

标签:PostgreSQL dump -- 导出 t1 sys 报错 1G bytea


1、前言

在处理用户问题过程遇到一个问题。用户通过pg_dump导出 bytea 对象时,当行的大小超过 1G时,会报错:

[v8r6c5b41@dbhost01 ~]$ sys_dump -t t1_bytea -f 1.dmp -U system test
sys_dump: error: Dumping the contents of table "t1_bytea" failed: PQgetResult() failed.
sys_dump: error: Error message from server: ERROR: invalid memory alloc request size 1298083843
sys_dump: error: The command was: COPY public.t1_bytea (id1, id2) TO stdout;

我们知道,bytea 类型最大存储是 1G ,因此,实际的存储不可能超过1G。 那怎么会有这个问题了?

2、问题复现

构造两个二进制的数据文件:

[root@dbhost01 dbdata]# ls -l *tar
-rw-r--r-- 1 root root  649041920 May 19 17:15 1.tar
-rw-r--r-- 1 root root 1734932480 May 19 19:12 2.tar

创建测试表:

create table t1_bytea(id1 bytea,id2 bytea) ;

插入数据:

--单个字段长度超 1G , 报错
test=# insert into t1_bytea(id1) values(sys_read_binary_file('/dbdata/2.tar')); ERROR: requested length too large
--单个字段不超过 1G, 但两个字段总大小超过 1G , 报错。 test=# insert into t1_bytea values(sys_read_binary_file('/dbdata/1.tar'),sys_read_binary_file('/dbdata/1.tar')); ERROR: invalid memory alloc request size 1298083896
--先insert 单个字段,再 update 另一个字段,使得总大小超过 1G , 这种情况下不报错。 test=# insert into t1_bytea(id1) values(sys_read_binary_file('/dbdata/1.tar')); INSERT 0 1 test=# update t1_bytea set id2=sys_read_binary_file('/dbdata/1.tar'); UPDATE 1
--insert select 方式不影响 test=# insert into t1_bytea select * from t1_bytea; INSERT 0 1

验证导出数据:

[v8r6c5b41@dbhost01 ~]$ sys_dump -t t1_bytea -f 1.dmp -U system test
sys_dump: error: Dumping the contents of table "t1_bytea" failed: PQgetResult() failed.
sys_dump: error: Error message from server: ERROR:  invalid memory alloc request size 1298083843
sys_dump: error: The command was: COPY public.t1_bytea (id1, id2) TO stdout;

3、结论分析

1、不仅列的大小有 1G 的限制,行的大小也有 1G 的限制;

2、插入数据时,如果一行的数据超过 1G , 则不允许插入;

3、通过 insert 小于 1G 的数据,后续再通过update,可以使得整行数据超过 1G。这也是上述 pg_dump 报错的根本原因。

标签:PostgreSQL,dump,--,导出,t1,sys,报错,1G,bytea
来源: https://www.cnblogs.com/kingbase/p/16289877.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有