ORA-27102报错主因是/etc/sysctl.conf内核参数配置不当:kernel.shmmax必须严格大于sga_max_size(字节),kernel.shmall需按shmmax/PAGE_SIZE同步计算,kernel.sem和fs.file-max须满足并发需求,所有参数修改后须sysctl -p生效并用ipcs -lm验证。

Oracle在Linux上起不来、报ORA-27102或预检查失败,90%以上是/etc/sysctl.conf里几个关键内核参数没调对,不是Oracle装错了,也不是磁盘空间不够。
kernel.shmmax必须大于SGA_MAX_SIZE
这个参数控制单个共享内存段最大字节数。Oracle的SGA必须能“塞进一块”共享内存里,否则会拆成多段,引发性能抖动甚至启动失败。
-
kernel.shmmax值必须严格 >SGA_MAX_SIZE(单位:字节),建议设为物理内存的一半或直接取物理内存大小 - 1 - 64位系统常见误配:照搬32位文档写
4294967295(≈4GB),但机器有64GB内存时,SGA设到32GB就超了 - 查当前值:
cat /proc/sys/kernel/shmmax;临时生效:sysctl -w kernel.shmmax=68719476735(64GB-1) - 别只改
shmmax不看shmall——后者是总页数,得同步算:若页大小为4096,64GB内存对应shmall = 68719476736 / 4096 = 16777216
kernel.sem和fs.file-max要按并发规模推算
信号量不够,Oracle后台进程起不来;文件句柄不够,大量连接或归档时直接报ORA-24247或Too many open files。
-
kernel.sem四元组含义是:semmsl(每信号量集最大信号量数)、semmns(系统信号量总数)、semopm(单次semop调用最大操作数)、semmni(信号量集总数)。重点看第二项semmns,应 ≥ 并发连接数 × 2(含后台进程) -
fs.file-max推荐值 =512 × PROCESSES(PROCESSES是Oracle初始化参数),最低不能低于6815744(Oracle 19c官方下限) - 别用
ulimit -n查——那是用户级限制,fs.file-max才是系统级总上限
net.ipv4.ip_local_port_range和TCP缓冲区影响连接稳定性
尤其在高并发短连接场景(如应用频繁建连/断连),端口耗尽或接收缓冲区溢出会导致连接超时、丢包、监听器拒绝新连接。
-
ip_local_port_range必须覆盖足够宽的动态端口,建议设为9000 65500,避免与Oracle监听端口(默认1521)冲突 -
net.core.rmem_max和net.core.wmem_max要匹配网络带宽和延迟。万兆网+高延迟链路下,rmem_max低于4194304(4MB)易触发重传 - 这些网络参数修改后,需确认应用是否启用
TCP_WINDOW_CLAMP,否则内核可能自动压低窗口值
改完必须sysctl -p且验证生效
很多人改了/etc/sysctl.conf就以为完事,但参数根本没加载进内核,Oracle读的还是旧值。
- 执行
sysctl -p后,务必用sysctl -a | grep 'shmmax\|sem\|file-max'逐个核对输出值 - 注意
sysctl -p不会重载net.*类参数在某些老内核上(如2.6.32),需加-e忽略错误,或单独sysctl -w net.ipv4.ip_local_port_range="9000 65500" - Oracle安装前最后一招:
su - oracle -c 'ipcs -lm'看max seg size是否等于你设的shmmax值——这才是Oracle真正看到的值
最常被跳过的一步:改完sysctl.conf没检查/proc/sys/下对应文件是否可写。SELinux启用时,/proc/sys/kernel/shmmax可能被标记为system_u:object_r:sysctl_t:s0,但权限是-w-------,root也写不进去。这种情况下sysctl -p静默失败,必须先chcon -t sysctl_t /proc/sys/kernel/shmmax或临时禁用SELinux验证路径。











