oracle 19c rac频繁产生core文件的根因是defaulttasksmax过小、transparent_hugepage未永久禁用、aud$位于system表空间三者共存;需分别设defaulttasksmax=infinity、grub中追加transparent_hugepage=never并reboot、所有实例mount状态下alter table sys.aud$ move至非system表空间。

Oracle 19c RAC 频繁产生 core 文件,不是偶然现象,而是底层资源或配置严重不匹配的明确信号。核心原因集中在三类:systemd 任务限制触发 fork() 失败、透明大页(THP)未禁用导致内存管理冲突、审计表残留 SYSTEM 表空间引发写入异常——这三者在 RAC 多实例并发场景下会快速放大,直接触发进程 abort。
DefaultTasksMax 过小导致 fork() 炸弹式崩溃
systemd 默认 DefaultTasksMax=512,远低于 Oracle RAC 实际所需(实测需 ≥65536)。当 CRS 启动、ASM 实例加载、大量后台进程(PMON、LMS、DBW)并发 fork 时,立即触达上限,报 ORA-27300: OS system dependent operation: fork failed with status: 11,随后 oracle 进程被内核 SIGABRT 终止,生成 core。
- 验证命令:
systemctl show --property DefaultTasksMax,若输出不是infinity或 ≥65536,即为根因 - 永久修复:编辑
/etc/systemd/system.conf,取消注释并设为DefaultTasksMax=infinity,再执行systemctl daemon-reload && reboot - 注意:仅
sysctl -w或临时改 limits.conf 无效;必须 reboot 才能重置 cgroup PID controller 状态
transparent_hugepage=always 与 use_large_pages=only 冲突
Oracle 19c RAC 要求 use_large_pages=only,但若系统未永久禁用 THP,内核仍会尝试分配匿名大页,与 Oracle 的显式 HugePages 预分配机制争抢 TLB 条目,造成 ora-27102: out of memory 或静默 fallback,最终触发 PMON 或 LMD 进程异常终止并 dump core。
- 检查是否生效:
cat /sys/kernel/mm/transparent_hugepage/enabled必须输出[never];grep AnonHugePages /proc/meminfo必须为0 kB - 临时禁用(
echo never > ...)重启即失效,必须修改/etc/default/grub中GRUB_CMDLINE_LINUX行末尾追加transparent_hugepage=never,再运行grub2-mkconfig -o /boot/grub2/grub.cfg并 reboot - 若已启用 THP,即使
vm.nr_hugepages设置正确,也会因内存碎片化导致 SGA 分配失败
AUD$ 仍在 SYSTEM 表空间引发写入阻塞
RAC 中多个实例并发向 SYS.AUD$ 写审计记录,若该表仍位于 SYSTEM 表空间,极易因空间耗尽或段争用触发 ORA-02002: error while writing to audit trail。该错误常被误判为参数问题,实则底层是 SYSTEM 表空间 I/O 阻塞,导致 LGWR、CKPT 等关键进程 hang 住后被 watchdog 杀死,生成 core。
- 确认位置:在所有 RAC 节点分别执行
SELECT tablespace_name FROM dba_segments WHERE owner='SYS' AND segment_name='AUD$',任一节点返回SYSTEM即需处理 - 迁移非在线:必须所有实例处于
MOUNT状态(SHUTDOWN IMMEDIATE && STARTUP MOUNT),再执行ALTER TABLE SYS.AUD$ MOVE TABLESPACE USERS - 切勿直接 truncate 或 NOAUDIT ALL 后清空——这会丢失合规审计证据,且无法解决空间碎片问题
这三个问题往往共存:DefaultTasksMax 不足 → 启动慢 → THP 未禁用加剧内存压力 → AUD$ 写入卡顿 → CRS 认定节点失联 → 强制 kill 进程 → core 暴增。排查时不能只盯单个日志,必须同步查 /var/log/messages(fork 失败)、/proc/meminfo(THP 状态)、dba_segments(AUD$ 位置)和 CRS trace(ocssd.trc 中的通信超时)。











