从ORA-27300,ORA-27301到ORA-00064

    最近由于session数量增加,需要调整session,也就是要调整process参数。看是比较简单的一个问题,却遭遇了ORA-27300,ORA-27301。因为这个涉及到了有关内核参数kernel.sem的修改。下面是其具体描述。

1、故障现象
OS版本:SUSE Linux Enterprise Server 10 SP3 (x86_64) - Kernel \r (\l)
DB版本: SQL*Plus: Release 10.2.0.3.0 - Production 
需求:Processes参数由1000修改到2000
SQL> startup pfile=/u02/database/MRDB/initMRDB.ora;
ORA-27154: post/wait create failed
ORA-27300: OS system dependent operation:semget failed with status: 28
ORA-27301: OS failure message: No space left on device
ORA-27302: failure occurred at: sskgpcreates

2、故障的分析与解决
#起初咋一看还以为空间不够呢,如下,显然不是空间的问题,其次有个很重要的表示"semget"
SQL> ho df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3             1.8T  826G  885G  49% /
udev                   32G  116K   32G   1% /dev
/dev/sda1              99M  9.5M   85M  11% /boot

#后台日志如下
Tue Aug  5 18:07:22 2014
Starting ORACLE instance (normal)
Tue Aug  5 18:07:22 2014
Errors in file /u02/database/MRDB/udump/mrdb_ora_30366.trc:
ORA-27154: post/wait create failed
ORA-27300: OS system dependent operation:semget failed with status: 28
ORA-27301: OS failure message: No space left on device
ORA-27302: failure occurred at: sskgpcreates

#Google了一些文章,描述的是需要调整内核参数kernel.sem,也就是信号量的问题

v2012db02u:~ # grep kernel.sem /etc/sysctl.conf
kernel.sem = 1250    32000   100    256     #这个是当前的值

信号量设置示例
    SEMMSL应该设置为服务器中实例中具有最大的PROCESSES参数+10,例如,当最大的PROCESSES参数为5000时,SEMMSL应设置为5010。
    SEMMNS参数应设置为SEMMSL*SEMMNI,接上例SEMMSL为5010,SEMMNI的值一般为128,则SEMMNS参数应为(5010*128)=641280。
    SEMOPM参数应设置与SEMMSL参数相同,接上例此处应设置为5010
    因此对于信号量建议做如下设置
    sysctl -w kernel.sem="5010 641280 5010 128"

#关于这个参数的具体描述及设置可以参考:Linux 内核参数优化(for oracle)    

#由于当前服务器存在N个实例,因此给了一个比较大的值,生产环境应慎重修改,如下    
v2012db02u:~ # vi /etc/sysctl.conf
v2012db02u:~ # sysctl -p
    ...........
kernel.sem = 7000 1792000 7000 256
    ........... 

#再次启动,狂汗....
SQL> startup pfile=/u02/database/MR/initMR.ora;
ORA-00064: object is too large to allocate on this O/S (1,5150880)

v2012db02u:~ > oerr ora 00064
00064, 00000, "object is too large to allocate on this O/S (%s,%s)"
// *Cause:  An initialization parameter was set to a value that required
//          allocating more contiguous space than can be allocated on this
//          operating system.
// *Action: Reduce the value of the initialization parameter.

#从上面的描述来看,不能从os分配连续的空间。
#关于这个问题Metalink(Doc ID 283980.1)上提供了描述信息,需要增大内存分配粒度到16M。
#以下是当前的内存粒度为4M。
SQL> SQL> SELECT x.ksppinm name, y.ksppstvl VALUE, x.ksppdesc descbtion
  2    FROM x$ksppi x, x$ksppcv y
 WHERE     x.inst_id = USERENV ('Instance')
  3    4         AND y.inst_id = USERENV ('Instance')
  5         AND x.indx = y.indx
  6         AND x.ksppinm LIKE '%_ksmg_granule%';

NAME                                VALUE                          DESCBTION
----------------------------------- ------------------------------ --------------------------------------------------
_ksmg_granule_size                  4194304                        granule size in bytes
_ksmg_granule_locking_status        1                              granule locking status

SQL> show parameter sga      #当前sga大小为1G
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 1G
sga_target                           big integer 1G

#Author : Leshami
#Blog   : http://blog.csdn.net/leshami

#直接调整为2G
SQL> show parameter sga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 2G
sga_target                           big integer 2G

#下面是修改过后内存的粒度。
SQL> set linesize 145
col name format a35
SQL> SQL> col value format a30
col descbtion format a50 wrap
SELECT x.ksppinm name, y.ksppstvl VALUE, x.ksppdesc descbtion
SQL> SQL>   2    FROM x$ksppi x, x$ksppcv y
  3   WHERE     x.inst_id = USERENV ('Instance')
  4         AND y.inst_id = USERENV ('Instance')
  5         AND x.indx = y.indx
  6         AND x.ksppinm LIKE '%_ksmg_granule%';
NAME                                VALUE                          DESCBTION
----------------------------------- ------------------------------ --------------------------------------------------
_ksmg_granule_size                  16777216                       granule size in bytes
_ksmg_granule_locking_status        1                              granule locking status

#再次重启DB OK。

3、Doc ID 283980.1

Oracle Server - Enterprise Edition - Version: 9.0.1.0 and later   [Release: 9.0.1 and later ]
Information in this document applies to any platform.

SYMPTOMS

ORA-00064 error is possibly encountered on database startup when the parameter
OPEN_LINKS_PER_INSTNACE is set to over 400. 

CAUSE

The contiguous area of storage to be allocated , exceeds the SGA granule 
(subarea) size. The granule size is calculated based on the SGA size. 
SOLUTION

Test case to reproduce the error
================================
a) add OPEN_LINKS_PER_INSTANCE = 1000 in the initora
b) use sqlplus to try starting up the database

This is NOT a BUG.

To fix the issue , increase the size of the SGA to over 128Mb by increasing DB_CACHE_SIZE,
SHARED_POOL_SIZE,LARGE_POOL_SIZE, JAVA_POOL_SIZE, etc.This will cause the granule size to 
be increased to 16Mb.

Workaround
==========
Set the following hidden parameter

_ksmg_granule_size = 16777216

Note:  Please set granule size more than or equal to size showing in the error message.

另外一篇与该错误有关Bug 5959853 - ORA-64 DURING DATABASE STARTUP WITH PROCESSES>6000. DocID:1457812.1 

时间: 2024-08-03 21:00:01

从ORA-27300,ORA-27301到ORA-00064的相关文章

ora.crf资源异常—临时停止和禁用解决办法

检查发现运行在win 2008平台的11.2.0.3 rac的crs的alert日志里面出现大量类似记录CRS-2765错误 2015-09-04 00:12:10.431 [ohasd(3844)]CRS-2765:资源 'ora.crf' 已失败 (在服务器 'rac2' 上). 2015-09-04 00:16:46.047 [ohasd(3844)]CRS-2765:资源 'ora.crf' 已失败 (在服务器 'rac2' 上). 2015-09-04 00:21:21.479 [oh

oracle的sqlnet.ora , tnsnames.ora , Listener.ora 文件的作用(转)

oracle网络配置三个配置文件 listener.ora.sqlnet.ora.tnsnames.ora ,都是放在$ORACLE_HOME/network/admin目录下.1. sqlnet.ora-----作用类似于linux或者其他unix的nsswitch.conf文件,通过这个文件来决定怎么样找一个连接中出现的连接字符串.例如我们客户端输入sqlplus sys/oracle@orcl假如我的sqlnet.ora是下面这个样子SQLNET.AUTHENTICATION_SERVIC

ORACLE RAC 下非缺省端口监听配置(listener.ora tnsnames.ora)

        不论是单实例还是RAC,对于非缺省端口下(1521)的监听器,pmon进程不会将service/instance注册到监听器,即不会实现动态注册.与单实例相同,RAC非缺省端口的监听器也是通过设置参数local_listener来达到目的.除此之外,还可以对实例进行远程注册,以达到负载均衡的目的.这是通过一个参数remote_listener来实现.   有关Oracle 网络配置相关基础以及概念性的问题请参考:      配置ORACLE 客户端连接到数据库   配置非默认端口

oracle 11g导出数据时报ORA 1455错误的处理方法_oracle

由于导出的该用户的表可能存在空数据表,那么可能就会出现此其异常. 首先: 查看: SQL>show parameter deferred_segment_creation; 如果为TRUE,则将该参数改为FALSE: 在sqlplus中,执行如下命令: SQL>alter system set deferred_segment_creation=false; 然后: 可以针对数据表.索引.物化视图等手工分配Extent SQL>Select 'alter table '||table_n

[20141229]配置tnsnames.ora使用rsp文件

[20141229]配置tnsnames.ora使用rsp文件.txt --大部分配置tnsnames.ora,特别是服务器都是直接编辑,使用copy & paste. --我个人特别讨厌copy & paste 使用vim出现阶梯显示的情况,特别讨厌,我多次跟我同事在copy & paste设置:set paste来避免这种情况. --但是就是不改,按照他们的道理这样做是能正常访问的. --如果能看看我以前写的 http://blog.itpub.net/267265/views

[20111220]tnsnames.ora的定位.txt

[20111220]tnsnames.ora的定位.txt 1.跟踪在linux下sqlplus的执行过程,可以很容易定位tnsnames.ora的定位过程. $ export TNS_ADMIN=/tmp$ strace -o  findtnsnames.txt sqlplus scott/xxxx@noexist $ grep -i tnsname findtnsnames.txtaccess("/home/oracle/.tnsnames.ora", F_OK) = -1 ENO

listener.ora,tnsnames.ora中一个空格的威力

最近几天被网络监听配置搞得焦头烂额,有时候配置没问题,有时候就出莫名其妙的问题,今天专门花时间总结了一下,希望对大家有所帮助. listener.ora,tnsnames.ora有时候没有netca,netmgr这样的图形工具来创建的时候,只能手工来做,手工做的时候会有一些格式的问题,多加一个空格,或者少一个空格,就会有不同的结果. 案例一 下面是一个监听的基本配置,我故意在前面多加了一个空格(黄色标记所示).  LISTE1=   (DESCRIPTION=     (ADDRESS_LIST

【RAC】关闭Clusterware 遇到CRS-2529,ORA-15097:

需要关闭整个集群,遇到CRS-2529,ORA-15097 错误 ~! grid@rac1:/home/grid/Opatch>srvctl stop asm  -n rac1  -o immediate       PRCR-1014 : 无法停止资源 ora.asm PRCR-1065 : 无法停止资源 ora.asm CRS-2529: 无法对 'ora.asm' 执行操作, 因为这样做需要停止或重新定位 'ora.DATA1.dg', 但未指定强制选项 grid@rac1:/home/g

【RAC】upgrade GI from11.2.0.1 to 11.2.0.2

升级整个rac 环境则需要先升级Clusterware 层,然后升级Database/RDBMS,整个过程可以选择滚动升级也可以选择将数据库停掉,这个要根据生产库的停机维护窗口来定了.此文描述了非滚动升级的方式!实际过程中要更为严谨. 1 准备工作 下载补丁介质 通过登录My Oracle Support后进入Patch栏目搜索Patchid获得补丁.11.2.0.2补丁集的全称是11.2.0.2.0 PATCH SET FOR ORACLE DATABASE SERVER (Patchset)

Oralce 调用Delphi写DLL去访问C# WebService的问题

web|访问|问题 我想从Oracle的存储过程通过一个外部dll(Delphi编写)去访问C#写的WebService时,出现了"尚未调用 CoInitialize"不知道是怎么回事,望各位指点一二.1.我在Oracle里写了一个函数AddNumber如下:CREATE OR REPLACE FUNCTION "MY"."ADD" (a in BINARY_INTEGER,b in BINARY_INTEGER) RETURN BINARY_I