问题描述 使用金仓数据库KingbaseES写入512MB+数据,或者在使用COPY命令迁移数据时,出现如下所示报错: 错误: 无法为包含1073725513字节的字符串缓冲区扩大65536个更多字节
问题原因 触发金仓数据库KingbaseES对BYTEA类型的最大容量限制,以及使用方式不当导致。 解决方法 金仓数据库KingbaseES BYTEA(含BLOB、CLOB)的最大上限是大约(不超过)1GB。它不支持以明文的方式写入512MB+的数据,如下所示: kingbase=# create table tb(x bytea); kingbase=# insert into tb values (‘x1111111111……111’); kingbase=# 错误: 无法为包含1073725513字节的字符串缓冲区扩大65536个更多字节 kingbase=# error: invalid memory alloc request size 1073725513
遇到上述错误,可使用接口的方式写入大数据。它支持接口pg_read_binary_file,如下所示: kingbase=# create table tb(x bytea); kingbase=# insert into tb values (pg_read_binary_file(‘./900MB.file’); kingbase=#
金仓数据库KingbaseES除了支持以INSERT的方式写数据,为了方便数据的移植与备份(即数据批量操作),还支持以COPY命令的方式批量写入数据。COPY命令同时支持CSV与BINARY两种方式导入与导出数据。 其中CSV是文本的方式,它具有高度的可移植性,可满足任意的跨平台需求,但导出的数据会膨胀,导入时可能会遭遇本文提及的错误(即内存分配失败)。 BINARY是二进制的方式,它具备高速的数据导出与导入性能,但是可移植性不好,受到服务器位制与大小端机的限制。因此,当写入的数据容量不超过1GB,并遭遇内存分配失败时,一般是使用COPY CSV导致的,这时需要使用COPY BINARY的方式。 如果迁移数据的服务器属于同一台服务器,或者是不同服务器,但是却拥有相同的架构,这时可以使用COPY BINARY对数据进行导出与导入,不同服务器时需要拷贝文件到目标服务器。如下所示为从tb1表导出数据到文件binary,再把文件中的数据导入到tb2表: kingbase=# copy binary tb1 to ‘/home/kingbase/binary’;–导出数据 kingbase=# copy binary tb2 from ‘/home/kingbase/binary’;–导入数据 kingbase=#
前面提到,COPY命令BINARY方式的数据可移植性不是很好,当CPU架构不一致时存在一些问题。V8R6版本支持sys_bulkload工具,它支持把数据库内的数据以CSV的格式导出与导入,并且不会引发上述的错误。当然,任何平台都可以使用sys_bulkload工具,使用前需要加载sys_bulkload插件。导出tb1表的数据到文件tb1.csv,如下所示: kingbase$ sys_bulkload -i tb1 -O /home/kingbase/tb1.csv -o “TYPE=DB” -o “WRITER=CSV_FILE” -p 2222 -U SYSTEM -W 123 -d TEST
把数据文件tb1.csv转移至目标服务器后,导入到tb2表,如下所示: kingbase$ sys_bulkload -i /home/kingbase/tb1.csv tb1 -O tb2 -o “TYPE=CSV” -p 2222 -U SYSTEM -W 123 -d TEST 至此,出现的问题得以修复。 参考手册 相关内容可参考官方产品用户文档:https://help.kingbase.com.cn
|