oracle用户文件描述符限制需在limits.conf中同时配置soft/hard值,且systemd系统必须额外通过override.conf设置limitnofile,否则实例可能静默失败或高并发时随机报错。
oracle 用户的文件描述符限制必须在 /etc/security/limits.conf 中显式配置,且需同时设置 soft 和 hard 值,否则 oracle 实例启动时可能报 ora-27123: unable to attach to shared memory segment 或静默失败。
为什么只改 limits.conf 不一定生效
systemd 系统(RHEL 7+/CentOS 7+、Oracle Linux 7+)默认忽略 /etc/security/limits.conf 对服务进程的限制,因为 Oracle 后台进程(如 ora_pmon_<sid></sid>)由 systemd 启动,而 systemd 的 LimitNOFILE 优先级更高。用户登录 shell 虽然读取了 limits.conf,但 Oracle 实例实际运行环境未必继承该值。
- 验证是否生效:用
su - oracle -c 'ulimit -n'查看交互式 shell 限制;再用cat /proc/$(pgrep pmon)/limits | grep "Max open files"查看实际 Oracle 进程的限制 - 若两者不一致,说明 systemd 覆盖了 limits.conf
- RHEL/CentOS 7+ 必须额外配置
/etc/systemd/system/oracle.service.d/override.conf并重载 systemd
limits.conf 中 Oracle 用户的正确写法
不能只写 oracle soft nofile 65536,hard 值必须显式声明且 ≥ soft,否则 Oracle 检查脚本(如 runInstaller 或 dbca)会直接拒绝继续。
- 必须成对出现:
oracle soft nofile 65536和oracle hard nofile 65536 - 同样处理
nproc(建议至少16384),避免并行查询或大量会话时报fork: Resource temporarily unavailable - 不要用通配符(如
* soft nofile),Oracle 安装校验只认具体用户名 - 修改后需重新登录 oracle 用户(不是
source或ulimit -n临时设置)才能使交互式 shell 生效
systemd 环境下必须补的一步:覆盖 LimitNOFILE
仅改 limits.conf 在 systemd 系统中对 Oracle 后台进程无效,必须通过 systemd drop-in 文件注入限制。
- 创建目录:
sudo mkdir -p /etc/systemd/system/oracle.service.d - 写入
override.conf:[Service] LimitNOFILE=65536 LimitNPROC=16384
- 重载配置:
sudo systemctl daemon-reload,然后重启监听器或数据库服务(srvctl stop/start database或sqlplus / as sysdba中shutdown immediate+startup) - 注意:如果 Oracle 是用
systemctl start oracle-database启动的,服务名要换成对应 unit 名,可用systemctl list-units | grep oracle确认
真正容易被跳过的点是:改完 limits.conf 后没验证进程级限制,也没在 systemd 环境下补 LimitNOFILE —— 这会导致 Oracle 看似启动成功,但在高并发或大连接场景下随机报错,排查起来极难定位到资源限制上。










