暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MogDB 通过 copy 导入数据遇到invalid memory alloc request的错误诊断

由迪 2024-04-22
168

原作者:盖国强

目录

  • 适用范围
  • 问题概述
  • 问题原因
  • 解决方案
  • 参考文档

适用范围

MogDB 5.0.3

问题概述

当通过 copy 命令,向 5.0.3 版本导入数据时遇到 invalid memory alloc request 的错误。

源数据来自 MogDB 3.0版本的导出,导出如下:

解释omm@876c51460fa2:~$ gsql -U eygle -W Eyg1e@db -d mogdb
gsql ((MogDB 3.0.1 build 1a363ea9) compiled at 2022-08-05 18:01:26 commit 0 last mr  )
NOTICE : The password has been expired, please change the password. 
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

MogDB=>copy (select * from allpeople where excel_name like '巴林%') to '/home/omm/balin.data';
COPY 29921

在 5.0.3 版本导入时出错:

解释omm@bf13726f618b:~$ sh log.sh 
gsql ((MogDB 5.0.3 build 86d963ad) compiled at 2023-10-13 09:17:49 commit 0 last mr 1804 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

MogDB=>copy allpeople from '/var/lib/mogdb/2.data';
ERROR:  invalid memory alloc request size 11407785544 in knl_uheap.cpp:3378.

问题原因

最初的分析是 3378 行数据格式有问题,当剔除这一行报错数据后,下一次 copy 错误仍然出现在 3378 行位置上。因此判断不是数据问题。
将原始文件 split 为 3000 行为单位的多个文件,再进行 copy 导入,可以正常执行:

解释mm@bf13726f618b:/var/lib/mogdb$ ls -l
total 32936
-rwxrwxrwx  1 omm omm 33725959 Dec 21 08:41 balin.data
drwx------ 44 omm omm     1408 Dec 21 08:48 data
omm@bf13726f618b:/var/lib/mogdb$ split -l 3000 -d balin.data 
omm@bf13726f618b:/var/lib/mogdb$ ls
balin.data  data  x00  x01  x02  x03  x04  x05  x06  x07  x08  x09
omm@bf13726f618b:/var/lib/mogdb$ gsql -U eygle -W eyg1e@mdb -d mogdb
gsql ((MogDB 5.0.3 build 86d963ad) compiled at 2023-10-13 09:17:49 commit 0 last mr 1804 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

MogDB=>copy allpeople from '/var/lib/mogdb/x00';
COPY 3000
MogDB=>select count(*) from allpeople;
 count 
-------
  3000
(1 row)

MogDB=>copy allpeople from '/var/lib/mogdb/x01';
COPY 3000
MogDB=>select count(*) from allpeople;
 count 
-------
  6000
(1 row)

进一步的,如果多次尝试正常执行整个文件的 copy,则会陷入死循环,表无限膨胀,直到磁盘空间耗尽:
WeChatWorkScreenshot_7bee477f-f4be-4cdd-add5-4e155851381a.png

WeChatWorkScreenshot_9c09e5e4-b68e-4415-bd4c-43f80a8d8db6.png

解决方案

通过将大文件裁剪为小文件,分批导入。具体 Bug 需要研发定位。

参考文档

无。

mogdb

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论