PostgreSQL 大对象导出报错问题分析
2024-08-23 12:03:09
1、前言
在处理用户问题过程遇到一个问题。用户通过pg_dump导出 bytea 对象时,当行的大小超过 1G时,会报错:
[v8r6c5b41@dbhost01 ~]$ sys_dump -t t1_bytea -f 1.dmp -U system testsys_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 1298083843sys_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 报错的根本原因。
最新文章
- 第二章	Matlab面向对象编程基础
- Resource governor2:Configuration query
- jquery懒加载jquery.lazyload.js
- Ubuntu+Apache+PHP+Mysql环境搭建
- 一个JS定时器类
- 【HDOJ】【2089】不要62
- python url编码
- RabbitMQ 原文译1.2--";Hello Word";
- 升级web项目步骤
- 【Android】 onSaveInstanceState()恢复数据
- Java编译原理
- 状态模式(State) 笔记
- Ubuntu14.04安装完全分布式Hadoop1.2.1
- Winform制作圆弧panel
- Lease问题
- 使用SecureCRT的SFTP在WINDOWS与LINUX之间传输文件(转载)
- git clean使用总结
- jpa 联表查询 返回自定义对象 hql语法 原生sql 语法 1.11.9版本
- 这不是我想要的ABAP开发者
- MyBatis 学习资料
热门文章
- ansible安装配置及基本用法
- UiPath文本操作Get Visible Text的介绍和使用
- centos7.6部署DRBD提示“no resources defined!
- Jenkins+Svn+Docker搭建持续集成环境 自动部署
- HTML入门,基础知识
- Graph-Based Social Relation Reasoning
- cup缓存基础知识
- Kafka启动遇到ERROR Exiting Kafka due to fatal exception (kafka.Kafka$)
- 【设计过程】.NET ORM FreeSql WhereDynamicFilter 动态表格查询功能
- Redis三种模式——主从复制,哨兵模式,集群