ORA-27123: unable to attach to shared memory segment

本文介绍在安装Oracle10g数据库过程中遇到ORA-27123错误及解决方案。由于32位系统限制,SGA大小无法超过1.7GB。通过调整kernel.shmmax参数解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在安装一个oracle10g的数据库,使用dbca的slient方式来安装,但是在日志中报这个错误
ORA-27123: unable to attach to shared memory segment

看到这个就知道是跟系统参数mmax有关,查看kernel.shmmax = 4294967295--4g,但是系统版本是32位的
[root@localhost install]# uname -a
Linux localhost.localdomain 2.6.18-8.el5PAE #1 SMP Fri Jan 26 14:28:43 EST 2007 i686 i686 i386 GNU/Linux
在32位先超过1.7g的sga oracle是不认的,
解决方法是:1、该小kernel.shmmax
2、http://www.eygle.com/archives/2005/11/oracle_howto_make_sga_17g.html-重编译oracle

<think>好的,我现在需要帮助用户解决在CentOS安装Oracle 11g时遇到的关于semmmi、shmmax和shmall这三个内核参数的问题。首先,我得确认这些参数的正确名称,因为用户可能打错了。比如,“semmmi”可能是“semmni”的笔误,这是信号量参数的一部分。接下来,我需要回忆每个参数的具体作用和推荐的设置值。 首先,shmmax和shmall与共享内存有关。shmmax定义了单个共享内存段的最大大小,而shmall是整个系统共享内存的总页数。Oracle数据库依赖共享内存来进行进程间通信,所以这些参数设置不足会导致安装失败。通常,shmmax议设置为物理内存的一半或更大,而shmall则是总内存除以页大小(通常是4KB)。 然后是信号量参数,包括semmsl、semmns、semopm和semmni。用户提到的semmmi可能是指semmni,即信号量集的最大数量。Oracle通常要求semmni至少为128,semmsl(每个信号量集中的信号量数量)为250,semmns(总信号量数)为32000,semopm(每次操作的最大信号量数)为100。 接下来,我需要考虑如何在CentOS中修改这些内核参数。通常是通过编辑/etc/sysctl.conf文件,添加或修改相关参数,然后运行sysctl -p使其生效。同时,用户可能需要检查/etc/security/limits.conf中的资源限制,确保Oracle用户的进程限制足够。 还需要提醒用户,修改这些参数后可能需要重启系统,或者至少重新加载sysctl设置。此外,安装Oracle前最好运行安装程序提供的预检查脚本,确认所有依赖和参数都符合要求。 最后,需要确保用户理解每个步骤的意义,避免盲目复制粘贴,同时注意不同版本的Oracle可能有略微不同的要求,议参考官方文档进行确认。如果有任何疑问,议查阅Oracle 11g的官方安装指南或社区支持论坛获取更详细的信息。</think>在CentOS系统安装Oracle 11g时,与`semmni`、`shmmax`、`shmall`相关的问题属于Linux内核参数配置问题。以下是逐步说明和解决方案: --- ### 一、参数含义解析 1. **semmni** - 作用:控制系统中**信号量集的最大数量** - Oracle要求:至少$semmni \geq 128$ - 完整信号量参数应包含: $$semmsl=250,\ semmns=32000,\ semopm=100,\ semmni=128$$ 2. **shmmax** - 作用:定义**单个共享内存段的最大字节数** - 议值:设为物理内存的50%-80%(例如16GB内存可设为$16 \times 1024^3 \times 0.8 = 13743895344$) 3. **shmall** - 作用:控制**系统可分配的共享内存总页数** - 计算公式: $$\frac{物理内存 \times 2}{4KB} \quad (\text{例如16GB内存为} \frac{16 \times 1024^3 \times 2}{4096} = 8388608)$$ --- ### 二、配置步骤 #### 步骤1:修改内核参数 ```bash # 编辑sysctl配置文件 vi /etc/sysctl.conf # 添加/修改以下内容(数值根据实际内存调整) kernel.sem = 250 32000 100 128 kernel.shmmax = 17179869184 # 16GB示例值 kernel.shmall = 4194304 # 16GB示例值 ``` #### 步骤2:使配置生效 ```bash sysctl -p # 立即加载新参数 ``` #### 步骤3:验证参数 ```bash # 检查semmni sysctl kernel.sem | awk '{print $4}' # 检查shmmax/shmall sysctl kernel.shmmax kernel.shmall ``` --- ### 三、典型错误场景 1. **信号量不足** - 现象:`semmni too low` - 解决:确保`kernel.sem`第四个值$\geq 128$ 2. **共享内存不足** - 现象:`ORA-27123: unable to attach to shared memory segment` - 解决: - 增大`shmmax`(不超过物理内存) - 增大`shmall`(需满足$shmall \times 4KB \geq SGA\_MAX\_SIZE$) --- ### 四、补充说明 1. **物理内存计算** - 通过`free -b`获取精确字节数 - 1GB = $1073741824$字节 2. **Oracle安装前检查** 使用`/database/preinstall/rhel_check.sh`(Oracle提供的验证脚本)确认所有参数合规 3. **永久生效** 必须通过`/etc/sysctl.conf`修改,直接`sysctl -w`修改的参数重启后会失效 --- ### 五、参数关系示意图 ``` 共享内存管理 ├─ shmmax:单块内存上限 └─ shmall:总可用内存页数 信号量管理 ├─ semmsl:单个信号量集的信号量数 ├─ semmns:系统总信号量数 ├─ semopm:单次操作最大信号量数 └─ semmni:信号量集总数 ``` 若有其他安装问题(如依赖包缺失),议同时检查`pdksh`、`libstdc++`等包的安装状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值