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

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_TARGETMEMORY_MAX_TARGET两者中的较大值。但这并不意味着Oracle配置有误,而是AMM(自动内存管理)在启动时检测到内存分配条件不满足,直接选择拒绝加载实例。

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

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

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

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

  • 执行 df -h /dev/shm——如果显示结果为64M512M,或者明显小于你的MEMORY_TARGET,那么问题就在这里。
  • sysdba身份登录后,运行show parameter memory_targetshow 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/shmmount | 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函数按索引快速返回配置项
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

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

同类最新

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

更多
自增主键值从何而来?深入理解原理,告别只会auto_increment
数据库 · 2026-07-25

自增主键值从何而来?深入理解原理,告别只会auto_increment

KingbaseES推荐使用serial、bigserial、显式sequence或identity列实现自增主键。serial创建integer并关联序列,bigserial对应bigint;显式sequence可自定义起始值等参数;identity有generatedbydefault(允许指定值)与always(禁止)两种模式。

Linux下瀚高数据库授权文件过期及替换解决方案
数据库 · 2026-07-25

Linux下瀚高数据库授权文件过期及替换解决方案

在银河麒麟系统下,瀚高数据库hgdb-4 5试用授权20天到期后需替换正式授权文件。正确操作:停止服务,备份旧文件,将授权文件复制到 opt highgo hgdb-4 5 etc lic 并命名为hgdb lic,设置权限600和属主highgo:highgo,再启动服务。禁止直接修改data目录下的license info文件。

Oracle BLOB实时同步的5大技术挑战与难点解析
数据库 · 2026-07-25

Oracle BLOB实时同步的5大技术挑战与难点解析

OracleBLOB实时同步面临分片组装、多列隔离、长事务跨窗口、事务回滚及大对象资源控制等技术挑战,必须在日志中精确还原完整字段值,才能保证源端与目标端数据完全一致,这对同步系统的稳健性提出了高要求。

MySQL禁用redo日志导致全备失败
数据库 · 2026-07-25

MySQL禁用redo日志导致全备失败

MySQL全量备份失败是由于数据定义语言操作触发排序索引构建,禁用重做日志导致XtraBackup无法获取一致性备份。测试验证表明,优化表语句即使无数据也会触发该问题。根本原因在于排序索引构建过程跳过了重做日志记录,破坏了备份的一致性。

Kafka架构图优化与改进的全面详细步骤与实践指南
数据库 · 2026-07-25

Kafka架构图优化与改进的全面详细步骤与实践指南

Kafka作为实时数据流处理的核心中间件,其底层架构虽已相当成熟,但在实际生产环境中,要充分发挥其性能潜力,仍需落实到具体的调优与架构改造上。核心目标可归纳为三点:如何承载更高的吞吐量、如何保障数据不丢失、以及故障发生时如何快速恢复。本文将从这几个关键方向出发,深入探讨如何真正榨干Kafka集群的性