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

Oracle sqlldr异常随机存取存储器

askTom 2017-06-02
811

问题描述

你好,

我们有sqlldr的问题,我们有32 GB内存和24 GB交换的服务器。
在加载大表 (带有blob的40 mil记录) 时,空闲RAM会持续减少,而下一次交换也会持续减少。

在加载了一些错误之后:

SQL * Loader-556: 无法分配读取缓冲区
SQL * Loader-509: 系统错误: 空间不足
SQL * Loader-502: 无法为字段内容表VVS_MSG打开数据文件 '/LOAD_FS/UNLOAD10099/VS/vvs_msg.8_284212727.1.blob'

为什么sqlldr消耗这么多的RAM (所有RAM),如果它是简单的加载而没有排序或其他操作。

Sqlldr copmmands看起来像:
sqlldr / LOG =/INST/R10100/rvsd1/VS/UTIL/LOG/vvs_msg.log.8控制 =/LOAD_FS/UNLOAD10099/VS/CTL/vvs_msg.ctl.8行 = 5000 >/INST/R10100/rvsd1/VS/UTIL/LOG/vvs_msg.out.8 2>& 1

我们用8个同时的sqlldr进程加载数据。

我们发现,当只执行一个进程时
sqlldr / LOG =/INST/R10100/rvsd1/VS/UTIL/LOG/vvs_msg.log.1控制 =/LOAD_FS/UNLOAD10099/VS/CTL/vvs_msg.ctl.1行 = 100 BINDSIZE = 500000 >/INST/R10100/rvsd1/VS/UTIL/LOG/vvvs_msg.out.1 2>& 1

达到约3.5 GB RAM,并因核心转储和ORA错误而下降
32243932分割故障 (coredump)

SQL * Loader-502: 无法为字段内容表VVS_MSG打开数据文件 '/LOAD_FS/UNLOAD10099/VS/vvs_msg.1_284218096.1.blob'
SQL * Loader-556: 无法分配读取缓冲区
SQL * Loader-509: 系统错误: 空间不足

RAM的数量各不相同,但evry约为3.5 GB
3391568
3402968
3408636
等等

所以它看起来像sqlldr达到一些限制的RAM和下降。
执行sqlldr的用户在OS中没有限制。

但是为什么它不释放RAM?
为什么RAM仍然上升?

在执行sqlldr之前,每个表都会被截断。

命令行是:
sqlldr / LOG =/INST/R10100/rvsd1/VS/UTIL/LOG/vvs_msg.log.1控制 =/LOAD_FS/UNLOAD10099/VS/CTL/vvs_msg.ctl.1行 = 100 BINDSIZE = 500000 >/INST/R10100/rvsd1/VS/UTIL/LOG/vvvs_msg.out.1 2>& 1

控制文件:

加载数据
文件 “/加载 _ fs/卸载10099/VS/vvs_msg.unl.1” “字符串” | \ n'”
坏文件 '/加载 _ fs/卸载10099/VS/坏/vvs_msg.bad.1'
丢弃文件 '/LOAD_FS/UNLOAD10099/VS/DSC/vvs_msg.dsc.1'
追加
进入表vvs_msg
由 “|” 终止的字段
尾随NULLCOLS
(
身份证,
内容 _ 文件名填充字符 (100),
内容LOBFILE(content_filename) 由EOF终止,
代码页面
)

卸载的前10条记录:

23453280 |/LOAD_FS/UNLOAD10099/VS/vvs_msg.1_23453280.1.blob | U |
28770528 |/LOAD_FS/UNLOAD10099/VS/vvs_msg.1_28770528.1.blob | U |
28847952 |/LOAD_FS/UNLOAD10099/VS/vvs_msg.1_28847952.1.blob | U |
28945056 |/LOAD_FS/卸载10099/VS/vvs_msg.1_28945056.1.blob | U |
28952016 |/LOAD_FS/UNLOAD10099/VS/vvs_msg.1_28952016.1.blob | U |
39405984 |/LOAD_FS/UNLOAD10099/VS/vvs_msg.1_39405984.1.blob | |
44795424 |/LOAD_FS/UNLOAD10099/VS/vvs_msg.1_44795424.1.blob | U |
47572848 |/LOAD_FS/卸载10099/VS/vvs_msg.1_47572848.1.blob | U |
50474736 |/LOAD_FS/卸载10099/VS/vvs_msg.1_50474736.1.blob | |
50504208 |/LOAD_FS/UNLOAD10099/VS/vvs_msg.1_50504208.1.blob | |


前10个blob文件的列表:
-rw-r-1 zaved uziv_dis 187 29 m á j 17:31 /LOAD_FS/UNLOAD10099/VS/vvs_msg.1_23453280.1.blob
-rw-r-1 zaved uziv_dis 358 29 m á j 17:31 /LOAD_FS/UNLOAD10099/VS/vvs_msg.1_28770528.1.blob
-rw-r-1 zaved uziv_dis 187 29 m á j 17:31 /LOAD_FS/UNLOAD10099/VS/vvs_msg.1_28847952.1.blob
-rw-r-1 zaved uziv_dis 427 29 m á j 17:31/加载 _fs/卸载10099/VS/vvs_msg.1_28945056.1.blob
-rw-r-1 zaved uziv_dis 326 29 m á j 17:31/加载 _fs/卸载10099/VS/vvs_msg.1_28952016.1.blob
-rw-r-1 zaved uziv_dis 567 29 m á j 17:31/加载 _fs/卸载10099/VS/vvs_msg.1_39405984.1.blob
-rw-r-1 zaved uziv_dis 187 29 m á j 17:31 /LOAD_FS/UNLOAD10099/VS/vvs_msg.1_44795424.1.blob
-rw-r-1 zaved uziv_dis 127 29 m á j 17:31/加载 _fs/卸载10099/VS/vvs_msg.1_47572848.1.blob
-rw-r-1 zaved uziv_dis 1760 29 m á j 17:31/加载 _fs/卸载10099/VS/vvs_msg.1_50474736.1.blob
-rw-r-1 zaved uziv_dis 56002 29 m á j 17:31 /LOAD_FS/UNLOAD10099/VS/vvs_msg.1_50504208.1.blob

通常blob文件最多有500B,但其中一些文件有200KB。

一个卸载有6127708记录。

非常感谢您的回答。

专家解答

你可能撞到那里的虫子了。

我已经复制了你的问题,我只是用这样的数据文件一遍又一遍地加载同样的几个blob:

1|/tmp/blob1.jpg|U|
2|/tmp/blob2.jpg|U|
3|/tmp/blob3.jpg|U|
4|/tmp/blob4.jpg|U|
5|/tmp/blob0.jpg|U|
6|/tmp/blob1.jpg|U|
7|/tmp/blob2.jpg|U|
8|/tmp/blob3.jpg|U|
9|/tmp/blob4.jpg|U|
10|/tmp/blob0.jpg||
...


用一张表作为

create table vvs_msg
(  id int,
   content blob,
   code_page varchar2(5)
);


LOAD DATA
INFILE '/tmp/load.dat' 
BADFILE '/tmp/load.bad'
DISCARDFILE '/tmp/load.dsc'
TRUNCATE
INTO TABLE vvs_msg
FIELDS TERMINATED BY '|'
TRAILING NULLCOLS
(
id,
content_filename FILLER CHAR(100),
content LOBFILE(content_filename) TERMINATED BY EOF,
code_page
)


当我查看sqlldr进程时,它的内存大小不断增长

[oracle@vbgeneric ~]$ cat /proc/5310/status | grep ^Vm
VmPeak:   191088 kB
VmSize:   191088 kB
VmLck:        0 kB
VmPin:        0 kB
VmHWM:    80736 kB
VmRSS:    80736 kB
VmData:    77840 kB
VmStk:      472 kB
VmExe:     1448 kB
VmLib:    70756 kB
VmPTE:      332 kB
VmPMD:       12 kB
VmSwap:        0 kB

[oracle@vbgeneric ~]$ cat /proc/5310/status | grep ^Vm
VmPeak:   191352 kB
VmSize:   191352 kB
VmLck:        0 kB
VmPin:        0 kB
VmHWM:    81000 kB
VmRSS:    81000 kB
VmData:    78104 kB
VmStk:      472 kB
VmExe:     1448 kB
VmLib:    70756 kB
VmPTE:      332 kB
VmPMD:       12 kB
VmSwap:        0 kB

[oracle@vbgeneric ~]$ cat /proc/5310/status | grep ^Vm
VmPeak:   191484 kB
VmSize:   191484 kB
VmLck:        0 kB
VmPin:        0 kB
VmHWM:    81000 kB
VmRSS:    81000 kB
VmData:    78236 kB
VmStk:      472 kB
VmExe:     1448 kB
VmLib:    70756 kB
VmPTE:      332 kB
VmPMD:       12 kB
VmSwap:        0 kB

[oracle@vbgeneric ~]$ cat /proc/5310/status | grep ^Vm
VmPeak:   201384 kB
VmSize:   201384 kB
VmLck:        0 kB
VmPin:        0 kB
VmHWM:    91032 kB
VmRSS:    91032 kB
VmData:    88136 kB
VmStk:      472 kB
VmExe:     1448 kB
VmLib:    70756 kB
VmPTE:      352 kB
VmPMD:       12 kB
VmSwap:        0 kB

[oracle@vbgeneric ~]$ cat /proc/5310/status | grep ^Vm
VmPeak:   202572 kB
VmSize:   202572 kB
VmLck:        0 kB
VmPin:        0 kB
VmHWM:    92088 kB
VmRSS:    92088 kB
VmData:    89324 kB
VmStk:      472 kB
VmExe:     1448 kB
VmLib:    70756 kB
VmPTE:      352 kB
VmPMD:       12 kB
VmSwap:        0 kB


我尝试了一些变体 (直接,不同的读取/绑定大小等),但似乎都没有明显的帮助。

因此,请与支持人员联系-您可以链接到此问题作为支持证据。作为一种解决方法,请查看以较小的批处理文件,因为它似乎与加载的blob数量成比例。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论