PostgreSQL 大对象导出报错问题分析
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 报错的根本原因。
PostgreSQL 大对象导出报错问题分析的更多相关文章
- 数据泵导出报错ORA-31693 ORA-02354 ORA-01466
1.Oracle数据泵导出schema时有报错: Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - P ...
- @Autowired报错原因分析和4种解决方案!
上图的报错信息相信大部分程序员都遇到过,奇怪的是虽然代码报错,但丝毫不影响程序的正常执行,也就是虽然编译器 IDEA 报错,但程序却能正常的执行,那这其中的原因又是为何? 报错原因分析 报错的原因 ...
- [转]ORACLE 11G 导出报错(EXP-00003)未找到段 (0,0) 的存储定义
http://blog.csdn.net/qq_19524879/article/details/51313205 ORACLE 11G 导出报错(EXP-00003)未找到段 (0,0) 的存储定义 ...
- 黄聪:Wordpress、PHP使用POST数据过大导致MySQL server has gone away报错原因分析
错误原因: 当POST的数据超过 max_allowed_packet 就会报 MySQL server has gone away 的错误. 1.查看当前Mysql的 max_allowed_pac ...
- MySQL server has gone away报错原因分析/
在平时和开发的交流 以及 在论坛回答问题的或称中会发现这个问题被问及的频率非常高. 程序中报错: MySQL server has gone away 是什么意思? 如何避免? 因此,感觉有必要总结一 ...
- saltstack配置安装的一些关键步骤及安装时各种报错的分析
以下其他仅做参考,官方网址才是安装重点:http://docs.saltstack.cn/topics/installation/rhel.html 与安装相关的一些文档或资料: 一.linux服务器 ...
- MySQL server has gone away报错原因分析及解决办法
原因1. MySQL 服务宕了 判断是否属于这个原因的方法很简单,执行以下命令,查看mysql的运行时长 $ mysql -uroot -p -e "show global status l ...
- nuxtjs在vue组件中使用window对象编译报错的解决方法
我们知道nuxtjs是做服务端渲染的,他有很多声明周期是运行在服务端的,以及正常的vue声明周期mounted之前均是在服务端运行的,那么服务端是没有比如window对象的location.navag ...
- 数据库数据导入/导出报错:无法在只读列“Id”中插入数据。
本文仅供小白参考,大佬请随意...... 本例是:从vs 2017自带的localDB数据库的数据---导出到---->Sql Server 2008中的相应数据库中 1. 导出数据库: 2. ...
随机推荐
- vue大型电商项目尚品汇(后台篇)day05
今天继续是对后台管理部分的一个操作,但是快要结束了,今天结束,明天会进入一个从Vue以来,另外一个名声显著的东西了,一只耳闻从未见识,而且十分的炫酷 他就是------数据可视化Echarts,迫不及 ...
- STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- IO多路复用epoll
0 why: 问题来源 0.1 网络编程流程 //创建socket int s = socket(AF_INET, SOCK_STREAM, 0); //绑定IP地址和端口号port bind(s, ...
- HashSet底层HashMap源码分析
在看HashSet源码的时候,意外发现底层HashMap保存的value居然不是null,而是保存一个Object作为Value.顿觉有悖常理,于是来分析一下: HashSet的add方法: publ ...
- SpringBoot数据库管理 - 用Liquibase对数据库管理和迁移?
Liquibase是一个用于用于跟踪.管理和应用数据库变化的开源工具,通过日志文件(changelog)的形式记录数据库的变更(changeset),然后执行日志文件中的修改,将数据库更新或回滚(ro ...
- 超小体积单键/1路1感应通道触摸触控检测IC-VKD233HS DFN6 2*2mm,常用于TWS蓝牙耳机入耳检测、运动手环等小体积单键触摸产品
产品品牌:永嘉微电/VINKA 产品型号:VKD233HS 封装形式:DFN6 产品年份:新年份 概述: VKD233HS DFN6具有1个触摸按键,可用来检测外部触摸按键上人手的触摸动作.该芯片具 ...
- 【原创】Python 极验滑块验证
本文仅供学习交流使用,如侵立删! 记一次 极验滑块验证分析并通过 操作环境 win10 . mac Python3.9 selenium.seleniumwire 分析 最近在做的一个项目登录时会触发 ...
- Docker Compose安装部署Jenkins
流水线可以让项目发布流程更加清晰,docker可以大大减少Jenkins配置. 1.前言 数据卷挂载到 /var 磁盘目录下,因为该磁盘空间较大,后面需要挂载容器数据卷,以防内存吃紧. 为了可以留存启 ...
- 有事务冲突时节点怎么加入MGR集群
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 问题场景描述 2. 如何修复 2.1 找出事务差异点 2.2 决定如何处理 3. 小结 文章推荐: 关于 Gr ...
- MGR及GreatSQL资源汇总
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 简要说明 MGR相关课程 <实战MGR> <深入浅出MGR> MGR学习过程出现故障或疑问咨 ...