Oracle在Windows系统中出现的ORA-27100: shared memory realm already exists 的奇怪现象

     整理这篇文章的原因是前段时间帮网友远程解决一个问题时,用startup pfile='d:/1.ora';时总是报错ORA-27100,最后是用oradim删除了服务后再创建服务后解决。

一直比较郁闷,所以做了一下测试,终于搞清楚了原因。
 

测试环境:系统物理内存2G,ORACLE9.2.0.8及ORACLE10.2.0.1,sga_max_size=500M,SPFILE启动。
 
错误模拟,设置sga_max_size=200G
 
SQL> alter system set sga_max_size=200000000000 scope=spfile;
 
系统已更改。
 
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup;
ORA-27102: out of memory
OSD-00022: Message 22 not found;  product=RDBMS; facility=SOSD
 
O/S-Error: (OS 8) 存储空间不足,无法处理此命令。
SQL> startup;
ORA-27100: shared memory realm already exists
SQL> shutdown immediate;
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
SQL> startup;
ORA-27100: shared memory realm already exists
SQL>
这个错误的意思是实例共享内存的空间已经存在,但是实际上自己又没有启动数据为实例。
 
      检查参数文件后,生成一个新的pfile='d:/1.ora',把sga_max_size改成正确的值(500M),然后关闭服务,重新启动服务后,再进入sqlplus
 
SQL> startup pfile='d:/1.ora';
ORA-27100: shared memory realm already exists
 

错误依旧,但是这时明明自己没有启动实例啊。
 
       仔细分析一下,这是windows服务及oracle的问题,oracle在windows启动中如果由于sga_max_size的问题,实例不会启动 成功,但是仍然会有一个错误的实例存,shutdown immediate及shutdown abort都关闭不了。由于缺省安装时,oracle在windows服务启动时会自动启动实例,所以每次启动服务都会自动用默认的错误的spfile启 动实例,导至内存错误。
 
知道问题的原因后,解决的办法就很简单,解决的办法以下两种:
1.关闭服务,删除数据库的spfile文件,用新的正确的pfile启动后,再生成新的spfile;
2.设置数据库在服务启动时不自动启动实例,再用正确的pfile启动实例,然后再生成新的spfile。
 

如何设置数据库在服务启动时不自动启动实例有以下两种方法:
1.直接修改注册表HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOME0下的数据库对象项ORA_MYDB_AUTOSTART值为false
2.使用ORACLE安装的工具Administration Assistant for Windows NT修改数据库启动关闭选项,如下图所示。
### 解决 ORA-01034 ORA-27101 错误的方法 当遇到 `ORA-01034: ORACLE not available` `ORA-27101: shared memory realm does not exist` 的错误时,通常意味着 Oracle 实例未能成功启动或未正常运行。以下是详细的排查解决步骤: #### 1. 检查 Oracle 监听器服务状态 确保 Oracle 监听器已启动并正在运行。可以通过命令行工具执行以下操作来启动监听器: ```bash lsnrctl start ``` 这一步骤可以确认监听器是否处于活动状态[^1]。 #### 2. 验证 Oracle SID 设置 确认环境变量中的 Oracle SID 是否正确指向目标数据库实例。如果不确定具体的 SID 名称,可以在安装目录下的配置文件中查找相关信息。 #### 3. 使用 OS 身份验证方式尝试启动数据库 有时即使服务看似已经开启,实际的数据库实例可能并未完全初始化。此时可尝试使用操作系统级别的权限来进行手动启动: ```bash sqlplus / as sysdba startup exit; ``` 上述 SQL*Plus 命令允许管理员绕过常规的身份认证流程直接访问并激活数据库引擎[^3]。 #### 4. 审阅日志文件获取更多信息 对于更深入的问题诊断,建议查阅位于 `$ORACLE_HOME/diag/rdbms/<dbname>/<instance_name>/trace/alert_<instance_name>.log` 下的日志条目。这些记录能够提供关于最近一次失败的具体原因说明[^4]。 #### 5. 排除资源竞争可能性 如果有其他应用程序占用了过多系统资源,则可能导致 Oracle 进程无法获得足够的内存空间完成加载过程。利用 Linux 自带的任务管理指令监控服务器上的活跃进程及其消耗情况可以帮助识别潜在冲突源: ```bash ps -eo user,pid,ppid,%mem,%cpu,comm --sort=-%mem | head ``` 这条命令会列出按内存占用量排序后的前十位程序列表[^5]。 通过遵循以上指南应该能有效处理大多数情况下由 ORA-01034 及其关联编号所引发的技术难题。不过需要注意的是,在实施任何更改之前最好先备份现有设置以防万一;另外针对特定版本特性也可能存在差异化的修复路径,请参照官方文档寻求最权威指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值