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 报错的根本原因。

最新文章

  1. 第二章 Matlab面向对象编程基础
  2. Resource governor2:Configuration query
  3. jquery懒加载jquery.lazyload.js
  4. Ubuntu+Apache+PHP+Mysql环境搭建
  5. 一个JS定时器类
  6. 【HDOJ】【2089】不要62
  7. python url编码
  8. RabbitMQ 原文译1.2--"Hello Word"
  9. 升级web项目步骤
  10. 【Android】 onSaveInstanceState()恢复数据
  11. Java编译原理
  12. 状态模式(State) 笔记
  13. Ubuntu14.04安装完全分布式Hadoop1.2.1
  14. Winform制作圆弧panel
  15. Lease问题
  16. 使用SecureCRT的SFTP在WINDOWS与LINUX之间传输文件(转载)
  17. git clean使用总结
  18. jpa 联表查询 返回自定义对象 hql语法 原生sql 语法 1.11.9版本
  19. 这不是我想要的ABAP开发者
  20. MyBatis 学习资料

热门文章

  1. ansible安装配置及基本用法
  2. UiPath文本操作Get Visible Text的介绍和使用
  3. centos7.6部署DRBD提示“no resources defined!
  4. Jenkins+Svn+Docker搭建持续集成环境 自动部署
  5. HTML入门,基础知识
  6. Graph-Based Social Relation Reasoning
  7. cup缓存基础知识
  8. Kafka启动遇到ERROR Exiting Kafka due to fatal exception (kafka.Kafka$)
  9. 【设计过程】.NET ORM FreeSql WhereDynamicFilter 动态表格查询功能
  10. Redis三种模式——主从复制,哨兵模式,集群