游乐游手机版
首页/数据库/文章详情

Oracle 12c启动报错ORA-00845 调整/dev/shm共享内存大小解决

时间:2026-07-23 21:13
ORA-00845因共享内存小于MEMORY_TARGET的1 2倍引发。永久解决:修改 etc fstab,设置size不小于1 5倍较大内存。注意容器需指定--shm-size,SELinux开启virt_use_shm,禁用ksm,确保挂载早于Oracle启动。

遇到ORA-00845错误时,查阅官方文档会发现解释其实很简单:/dev/shm这个tmpfs挂载点的可用空间,小于MEMORY_TARGET或MEMORY_MAX_TARGET两者中的较大值。但这并不意味着Oracle配置有误,而是AMM(自动内存管理)在启动时检测到内存分配条件不满足,直接选择拒绝加载实例。

从实际数据来看,当你设置了几十GB的MEMORY_TARGET,而/dev/shm只有64MB或512MB时,系统会直接报错。这个坑我在多台机器上都踩过,几乎无一幸免。

为什么Oracle 12c启动提示ORA-00845_通过调整/dev/shm共享内存大小

确认 /dev/shm 当前大小和 Oracle 内存参数

先别急着动手修改。通过以下两条命令快速确认一下,是否正好掉进了这个常见陷阱:

  • 执行 df -h /dev/shm——如果显示结果为64M、512M,或者明显小于你的MEMORY_TARGET,那么问题就在这里。
  • 以sysdba身份登录后,运行show parameter memory_target和show parameter memory_max_target,记录下这两个参数值(单位为字节,对比时直接看GB更为直观)。
  • 一个关键要点:Oracle实际需要的/dev/shm空间,大约等于1.2倍max(MEMORY_TARGET, MEMORY_MAX_TARGET)。“刚好相等”往往是不够用的。

永久修改 /etc/fstab 才是唯一可靠的方式

不少文章会教你临时挂载:mount -o remount,size=4G /dev/shm。但这个方法重启后就失效了。原因在于Oracle启动的时机通常早于systemd的mount单元,很容易在重新挂载之前就读取到旧尺寸。

唯一可靠的解决方案,还是修改/etc/fstab:

  • 编辑/etc/fstab,添加或修正这一行配置:tmpfs /dev/shm tmpfs size=4G,mode=1777 0 0(将4G替换为你的目标值,建议设置为≥1.5倍较大内存参数)。
  • 注意:这里不能写成defaults。tmpfs的defaults不包含size=参数,结果仍然会是默认的64MB或2GB(具体取决于发行版)。
  • 修改完成后立即验证:sudo umount /dev/shm && sudo mount /dev/shm,然后执行df -h /dev/shm和mount | grep shm确认size已经生效。
  • 在某些RHEL/CentOS/Oracle Linux 7+的环境中,systemd-tmpfiles可能会覆盖fstab中的设置。需要同步执行:sudo systemctl mask dev-shm.mount。

容器、SELinux和ksm是隐形的拦路虎

即使df -h /dev/shm显示的大小已经正确,Oracle仍然报ORA-00845错误,这时就需要考虑底层机制在“看不见的地方”卡住了:

  • Docker/Podman容器内的Oracle:在宿主机上修改/dev/shm完全不起作用。必须在启动容器时显式添加--shm-size=4G参数。
  • SELinux启用状态下,Oracle可能被禁止访问扩展后的shm。检查方法:getsebool virt_use_shm。如果显示为off,执行setsebool -P virt_use_shm on启用。
  • Oracle Linux上如果启用了ksm(内核同页合并),可能会干扰大页共享内存的分配。临时禁用方法:echo 0 | sudo tee /sys/kernel/mm/ksm/run。
  • 权限也需要核实:ls -ld /dev/shm应显示drwxrwxrwt,且oracle用户属组需要具备写入权限。如果手动执行过chown,记得要复位。

最容易被忽略的是挂载时机。/dev/shm必须在Oracle实例启动之前完成挂载。cloud-init、minimal systemd配置或者某些容器初始化流程可能导致它延迟挂载,结果Oracle读取到的是空的或者极小的shm。可以查看systemd-analyze blame | grep shm,如果挂载耗时排在oracle.service之后,就需要调整依赖关系,或者通过Before=oracle.service显式声明启动顺序。

来源:https://www.php.cn/faq/2665360.html
上一篇Oracle 11g RAC升级19c后SQL性能衰退解决方法 下一篇SQL Server CHOOSE函数按索引快速返回配置项
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Redis是什么:核心特性、架构与应用场景解析
数据库 · 2026-09-01

Redis是什么:核心特性、架构与应用场景解析

Redis是一款基于内存的键值型NoSQL数据库,以超高读写速度和丰富的数据结构著称。本文系统梳理Redis的核心特性、架构组成、性能优势及典型应用场景,并通过与Memcached、MySQL、MongoDB的对比,帮助开发者快速判断Redis是否适合当前业务需求。

Windows 安装 MongoDB 完整图文教程
数据库 · 2026-09-01

Windows 安装 MongoDB 完整图文教程

本文详细介绍在 Windows 系统上安装 MongoDB 的完整流程。从官网下载 MSI 安装包开始,逐步演示自定义安装路径、配置 Windows 服务、跳过 MongoDB Compass 等关键选项,并提供通过系统服务列表验证安装是否成功的方法,帮助开发者快速搭建本地 MongoDB 环境。

Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动
数据库 · 2026-09-01

Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动

本文详解在 Linux 系统下安装 MongoDB 的完整流程,涵盖依赖包安装、二进制包下载解压、环境变量配置、数据与日志目录创建及服务启动验证。通过标准化命令与路径说明,帮助开发者快速完成部署并确认服务状态。

MacOS安装MongoDB完整教程
数据库 · 2026-09-01

MacOS安装MongoDB完整教程

本文介绍在MacOS系统下安装MongoDB的完整流程,涵盖下载、解压、目录配置、环境变量设置及服务启动。通过明确的命令与参数说明,帮助开发者快速完成环境搭建并验证安装结果。

Ubuntu系统安装与配置Redis完整指南
数据库 · 2026-09-01

Ubuntu系统安装与配置Redis完整指南

本文详解在Ubuntu系统中安装Redis的两种主流方式:apt在线安装与源码编译安装。涵盖版本选择逻辑、服务启停与状态检查、连接验证方法,以及在线练习工具与桌面GUI客户端的对比与使用建议,帮助开发者快速搭建并验证Redis运行环境。