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. ...
随机推荐
- centos 7编译安装mysql 5.7.20
1. 下载mysql 5.7.20源码包 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.20.tar.gz 下载boost ...
- GitLab、Jenkins结合构建持续集成(CI)环境
1 持续集成 概述及运行流程 1.1 持续集成概述 持续集成概述:持续集成(Continuous integration)持续集成是指开发者在代码的开发过程中,可以频繁的将代码部署集成到主干,并迚程自 ...
- bat-命令行配置静态IP地址
查看连接名称ipconfig 打开命令提示符,输入netsh后回车 输入interface后回车 输入ip,回车 输入set address "连接名称" static 新IP地址 ...
- 国外价值10K+美金的Python面试题,珍藏已久,含泪放了出来
兄弟们,没吹牛皮,一哥们在国外面试的时候,就是要他做的这个,直接给他说,做出来了给你15K(单位是刀),做不出来就拜拜~ 大兄弟当时就不服了,这不是看不起我么,分分钟就给整完了~ 我上我也行系列: 唠 ...
- github package的使用教程
一.写在前面 上一次,笔者向大家介绍了把gitlab仓库作为npm私包的使用方法,具体的详见我的博文地址https://www.cnblogs.com/cnroadbridge/p/16406476. ...
- 【一知半解】synchronied
synchronized是什么 synchronized是java同步锁,同一时刻多个线程对同一资源进行修改时,能够保证同一时刻只有一个线程获取到资源并对其进行修改,因此保证了线程安全性. synch ...
- mobaxterm会话同步
前言 之前用过MobaXterm,想不起来为啥不用了.后面主要还是用xshell,最近又在用WindTerm,WindTerm还不错,奈何有不少的Bug,所以又来研究一下MobaXterm 下午摸索了 ...
- 002面试题_Switch...case的数据
1.byte 2.short 3.int 4.char 5.String 6.枚举
- 树莓派Raspiberry 编译Linux实时内核PREEMPT-RT 实战
树莓派4B 实时内核(Preempt_RT)的配置和编译https://blog.csdn.net/zlp_zky/article/details/114994444 基本按照这个blog来操作. 几 ...
- Linux中安装JDK详细步骤
一.下载Linux版本的JDK 进入官网下载对应的JDK,下载之前需要先登录 官网地址 -> https://www.oracle.com/ 登录成功后,找到对应的下载位置 根据自己电脑下载对应 ...