设为首页 加入收藏

TOP

诊断并解决ORA-4030错误(DocID1548826.1)(二)
2015-11-21 01:59:58 来源: 作者: 【 】 浏览:1
Tags:诊断 解决 ORA-4030 错误 DocID1548826.1
6

Enqueue quota: 49995 Shared file limit: 0

Max detached processes: 0 Max active jobs:

Windows 系统:在 Microsoft Windows 操作系统中,Oracle 各个进程是在一个进程中以多线程实施的。对于 32 位的系统,可寻址的内存量为 2Gb(包括堆栈、PGA 和 SGA)。此限制可以增加到 3Gb 或更高。有关更多信息,请参阅“Oracle Database and the Windows NT memory architecture, Technical Bulletin”。对于 64 位的系统这个限制就高多了。Oracle 进程使用的总内存(不包括进程堆栈和代码)可通过此查询进行确定。

Unix 系统:使用 limit/ulimit shell builtin 命令。请注意,unlimited 的不一定意味着不受限制,实际也可能是基于历史原因的限制,例如 2Gb。推荐基于真实需要的量进行设置:

Linux 输出示例:

aroelant@aroelant-be:~> ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

file size (blocks, -f) unlimited

max locked memory (kbytes, -l) unlimited

max memory size (kbytes, -m) unlimited

open files (-n) 1024

pipe size (512 bytes, -p) 8

stack size (kbytes, -s) unlimited

cpu time (seconds, -t) unlimited

max user processes (-u) 7168

virtual memory (kbytes, -v) unlimited

?

有的问题可能是因为限制设置得过低造成的,所以需要进行相应的增加。也有的问题可能是由于我们需要使用的太多造成的。

?

请注意:其他 OS 参数设置(例如 maxuproc)可能会导致问题

?

例如,”ORA-4030 (QERHJ HASH-JOI,KLLCQAS:KLLSLTBA)”

Status: 92,Closed, Not a Bug

?

***来自于 bug - "Increased MAXUPROC from 1000 to 2000, restarted the listener and ORA-4030 errors were resolved"

是否设置了 Oracle 限制?

从 Oracle Version 9i 开始我们引入了参数 PGA_AGGREGATE_TARGET,该参数尝试限制一个实例可以分配的 PGA 总量。“Automatic PGA Memory Managment”部分提供了关于此问题的更多信息。以下查询可用于查找分配给所有会话的 PGA 区的内存总量:

SQL> select

sum(value)/1024/1024 Mb

from

v$sesstat s, v$statname n

where

n.STATISTIC# = s.STATISTIC# and

name = 'session pga memory';

哪个进程需要的内存过多?

一些操作会需要大量的进程内存,例如大型的 PL/SQL 表或大量的排序操作。在这些情况下,在出现错误 ORA-4030 之前,进程将会运行一段时间,所以我们有希望在这段时间内能找出内存分配的位置和原因。您可以使用以下查询来查找从 Oracle 角度看来所用于 Oracle 进程的 PGA 和 UGA 大小。

SQL> col name format a30

SQL> select

sid,name,value

from

v$statname n,v$sesstat s

where

n.STATISTIC# = s.STATISTIC# and

name like 'session%memory%'

order by 3 asc;

此查询会显示列表中最占内存的进程。

?

通常,从操作系统的角度来确认进程内存使用情况,是一个好办法。毕竟,使用过多内存的不一定是 Oracle Server 进程。通常,对于服务器进程而言,Oracle 和操作系统之间基本都可以就内存的使用情况达成一致。通过以下命令,您可以查找操作系统中进程的内存使用情况。

OpenVMS 系统:show system 将显示关于进程和资源的总体使用情况。频繁调用页面失败的进程通常会使用大量虚拟内存。“Pages”列指示物理页的使用情况。show process/continious 命令显示物理(工作集)和虚拟内存的使用情况。
$ show system/pag OpenVMS V7.2-1 on node BOBBIE 13-JUN-2003 09:56:30.44 Uptime 17 18:58:18
Pid Process Name State Pri I/O CPU Page flts Pages
20200101 SWAPPER HIB 16 0 0 00:00:02.45 0 0
20200106 CLUSTER_SERVER HIB 13 104 0 00:00:00.03 87 104
20200107 CONFIGURE HIB 10 21 0 00:00:00.06 77 17



$ sho process/id=xxx/cont:
Process AROELANT 10:00:53
State CUR Working set 131
Cur/base priority 6/4 Virtual pages 11714
Current PC 800D9B28 CPU time 0 00:00:01.28
Current PSL 00000003 Direct I/O 178
Current user SP 7A5227F0 Buffered I/O 962
PID 20200469 Page faults 1312
UIC [SUPPORT,AROELANT] Event flags C0000003
C0000000Windows 系统:在 Microsoft windows 系统中, Oracle 是通过在单个进程中使用多个线程来实施的。直到现在,尚未找到可以查看每个线程的内存使用情况的方法。但是,我们可以检查 Oracle 和操作系统是否就 Oracle 所使用的内存达成一致。从操作系统的角度看,我们可以使用任务管理器。单击 查看按钮并选择 选择列(S)...,确保已选中 虚拟内存大小(V)。oracle.exe 的 虚拟内存大小 列中显示的大小应与 SGA、总 PGA 内存以及进程堆栈和代码大小的总和相同。以下查询可用于获取 Oracle 所查看的内存大小,但是不包括进程堆栈和代码大小:

SQL> select

sum(bytes)/1024/1024 Mb

from (

select

bytes

from

v$sgastat

union

select

value bytes

from

v$sesstat s, v$statname n

where

n.STATISTIC# = s.STATISTIC# and

n.name = 'session pga memory'

);

MB

----------

517.296406

在我的系统中,这个值要比通过任务管理器所看到的 VM值小约 30 Mb。

当您确定 Oracle 就是那个正在大量使用内存的进程时,此查询会显示使用内存最多的会话

Unix 系统:top
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇dbo.Interface_So_Newdrm 下一篇将一张表中的数据作为列名的存储..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: