Oracle报错:ORA-00845: MEMORY_TARGET not supported on this system

本文详细解析了Oracle数据库中ORA-00845错误的原因及解决方法,涉及内存目标参数MEMORY_TARGET与/dev/shm的关系,通过调整tmpfs文件系统的大小解决了问题。
部署运行你感兴趣的模型镜像

Oracle常见报错之:ORA-00845: MEMORY_TARGET not supported on this system

1、 问题的提出

报错如下:
[oracle@night ~]$ sqlplus /nolog 
SQL*Plus: Release 11.2.0.1.0 Production on Thu Jul 25 15:39:40 2013 
Copyright (c) 1982, 2009, Oracle.  All rights reserved. 
SQL> conn sys/ as sysdba 
Enter password: 
Connected to an idle instance. 
SQL> startup 
ORA-00845: MEMORY_TARGET not supported on this system 
SQL>

2、 问题的解释

在官方文档中,有好多地方提到这个错误,可以通过官方文档进一步的了解这个报错的解释,以便于更快更准确更透彻的解决问题

打开官方文档的error messages标签,可以看到有关错误代码的解释

ORA-00845: MEMORY_TARGET not supported on this system
Cause: The MEMORY_TARGET parameter was not supported on this operating system or /dev/shm was not sized correctly on Linux.
Action: Refer to documentation for a list of supported operating systems. Or, size /dev/shm to be at least the SGA_MAX_SIZE on each Oracle instance running on the system.

或者利用官方文档的搜索功能,搜索错误代码,也可以找到相应的解释和解决办法

Setting Memory Target at Instance Startup on Linux
Starting with Oracle Database 11g Release 1 (11.1), Oracle provides the option of automatically managing SGA and PGA with a combined MEMORY_TARGETparameter without having to set SGA_TARGET and PGA_AGGREGATE_TARGET explicitly. This is supported on Linux, Windows, Solaris, HPUX, and AIX (reference Bug 7258378).
If you see the ORA-00845 error reported on Linux machines at Oracle instance startup when using the MEMORY_TARGET parameter, then check the size of /dev/shm. If /dev/shm is not configured, then mount it sized to be at least the value of MEMORY_TARGET. If /dev/shm is configured but the amount of available space reported (through df -k /dev/shm) is less than MEMORY_TARGET, then free the space or mount a larger /dev/shm to satisfy the MEMORY_TARGET size. Note that if you set theMEMORY_MAX_TARGET parameter greater than MEMORY_TARGET, then ensure that /dev/shm is sized to be at least the value of MEMORY_MAX_TARGET.
Memory Target for Oracle Database InstancesRunning Database Configuration Assistant (DBCA) defaults to this Automatic Memory Management option. In the case of upgrade or manual database creation,MEMORY_TARGET can be specified in the initialization parameter file.

如上的内容就详细的解释了该错误是由于/dev/shm小于MEMORY_TARGET的大小,或者是/dev/shm根本就没有挂载,如果同时设置了MEMORY_TARGET和MENORY_MAX_TARGET,那么/dev/shm至少必须和MEMORY_MAX_TARGET的大小一致

Insufficient Memory Target Errors
On Linux systems, if the operating system /dev/shm mount size is too small for the Oracle system global area (SGA) and program global area (PGA), then you encounter the following error:
ORA-00845: MEMORY_TARGET not supported on this system. 
The cause of this error is an insufficient /dev/shm allocation. The total memory size of the SGA and PGA, which sets the initialization parameter MEMORY_TARGETor MEMORY_MAX_TARGET, cannot be greater than the shared memory file system (/dev/shm) on your operating system.
Background
Automatic Memory Management (AMM) has been updated in Oracle ASM 11g Release 2. It manages both the SGA and PGA together. It is managed by the Memory Manager Process (MMAN). In this release, note the following changes to AMM:
It uses MEMORY_TARGET instead of SGA_TARGET
It uses MEMORY_MAX_TARGET instead of SGA_MAX_SIZE (defaults to MEMORY_TARGET)
It uses memory allocated by /dev/shm
If the value of max_target is set to a value greater than the allocation for the /dev/shm size, then you may encounter the error ORA-00845: MEMORY_TARGET not supported on this system.
Note:
An ORA-00845 error can also occur if /dev/shm is not properly mounted. To rule out this possibility, run the command df -k to ensure that /dev/shm is mounted. For example:$ df -k 
 
Filesystem 1K-blocks Used Available Use% Mounted on 
shmfs 6291456 832356 5459100 14% /dev/shm
Solution
Increase the /dev/shm mountpoint size.
For example:
# mount -t tmpfs shmfs -o size=7g /dev/shm
To make this change persistent across system restarts, add an entry in /etc/fstab similar to the following:
shmfs /dev/shm tmpfs size=7g 0

如上的内容不仅讲出了错误的原因,而且还大概的说了一下在oracle 11g中的自动内存管理,并且给出了该错误的解决的命令

3、问题的深入探究,到底什么是 /dev/shm
首先来看一下linux系统中已经挂载的文件系统
[oracle@night ~]$ df -Th 
文件系统      类型    容量  已用 可用 已用% 挂载点 
/dev/sda2    ext3    16G  11G  3.9G  74% / 
/dev/sda3    ext3    1.6G  37M  1.4G  3% /tmp
/dev/sda1    ext3    99M  12M  83M  13% /boot
tmpfs        tmpfs    252M    0  252M  0% /dev/shm

可以看出我已经挂载了/dev/shm,但是该分区的文件系统并不是普通的文件系统类型,而是tmpfs文件系统类型,那么什么是tmpfs格式的文件系统类型呢?
tmpfs是linux的一种临时文件系统,它的大小是不固定的,默认的大小是实际内存的一半。
[root@night ~]# free -m 
            total      used      free    shared    buffers    cached 
Mem:          503        368        134          0        26        283 
-/+ buffers/cache:        58        444 
Swap:        2525          0      2525 
[root@night ~]# df -Th /dev/shm/ 
文件系统      类型    容量  已用 可用 已用% 挂载点 
tmpfs        tmpfs    252M    0  252M  0% /dev/shm
[root@night ~]#

默认的挂载点是/dev/shm,/dev/shm其实就是一个目录,所以tmpfs也可以挂载到一个自定义的目录。
[root@night ~]# file /dev/shm/ 
/dev/shm/: sticky directory 
[root@night ~]# ll -d /dev/shm/ 
drwxrwxrwt 2 root root 40 07-25 21:43 /dev/shm/
[root@night ~]#

tmpfs可以使用系统内存,也可以使用swap,所以我可以把tmpfs的size适当的调高一点。
由于tmpfs是存在于内存中的,所以在卸载tmpfs或者是关机重启linux操作系统的时候,tmpfs的内容就会丢失。
tmpfs是基于内存的,而swap是基于磁盘的,所以两者是不同的,而且tmpfs的IO很高。

4、解决问题
前面已经知道了报错是由于/dev/shm过小导致的,而且/dev/shm是一个tmpfs的文件系统,该文件系统是基于内存的,大小是随着物理内存的大小动态改变的,一般为物理内存的一半;tmpfs文件系统可以使用物理内容,也可以使用swap。
那么根据这么内容,来处理问题
首先看一下物理内存和swap的大小
[root@night ~]# free -m      
            total      used      free    shared    buffers    cached 
Mem:          503        369        134          0        26        283 
-/+ buffers/cache:        58        444 
Swap:        2525          0      2525 
[root@night ~]#

由上可知道,RAM为500M左右,SWAP为2G

修改tmpfs大小,用root用户
[root@night ~]# vim /etc/fstab

内容如下
LABEL=/                /                      ext3    defaults        1 1 
LABEL=/tmp              /tmp                    ext3    defaults        1 2 
LABEL=/boot            /boot                  ext3    defaults        1 2 
tmpfs                  /dev/shm                tmpfs  defaults,size=1G        0 0 
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0 
sysfs                  /sys                    sysfs  defaults        0 0 
proc                    /proc                  proc    defaults        0 0 
LABEL=SWAP-sda5        swap                    swap    defaults        0 0 
~

重新挂载/dev/shm
[root@night ~]# umount /dev/shm/ 
[root@night ~]# mount /dev/shm/ 
[root@night ~]# mount 
/dev/sda2 on / type ext3 (rw) 
proc on /proc type proc (rw) 
sysfs on /sys type sysfs (rw) 
devpts on /dev/pts type devpts (rw,gid=5,mode=620) 
/dev/sda3 on /tmp type ext3 (rw) 
/dev/sda1 on /boot type ext3 (rw) 
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) 
none on /proc/fs/vmblock/mountPoint type vmblock (rw) 
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) 
tmpfs on /dev/shm type tmpfs (rw,size=1G) 
[root@night ~]# df -Th /dev/shm/ 
文件系统      类型    容量  已用 可用 已用% 挂载点 
tmpfs        tmpfs    1.0G    0  1.0G  0% /dev/shm
[root@night ~]#

现在重新启动oracle服务(切换oracle用户)
[oracle@night ~]$ df -Th /dev/shm/ 
文件系统      类型    容量  已用 可用 已用% 挂载点 
tmpfs        tmpfs    1.0G    0  1.0G  0% /dev/shm 
[oracle@night ~]$ sqlplus /nolog 
SQL*Plus: Release 11.2.0.1.0 Production on Thu Jul 25 22:05:01 2013 
Copyright (c) 1982, 2009, Oracle.  All rights reserved. 
SQL> conn sys/ as sysdba 
Enter password: 
Connected to an idle instance. 
SQL> startup 
ORACLE instance started. 
Total System Global Area  418484224 bytes 
Fixed Size                  1336932 bytes 
Variable Size            281020828 bytes 
Database Buffers          130023424 bytes 
Redo Buffers                6103040 bytes 
Database mounted. 
Database opened. 
SQL> !lsnrctl start 
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 25-JUL-2013 22:07:06 
Copyright (c) 1991, 2009, Oracle.  All rights reserved. 
Starting /u01/app/oracle/product/bin/tnslsnr: please wait... 
TNSLSNR for Linux: Version 11.2.0.1.0 - Production 
System parameter file is /u01/app/oracle/product/network/admin/listener.ora 
Log messages written to /u01/app/oracle/diag/tnslsnr/night/listener/alert/log.xml 
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) 
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=night)(PORT=1521))) 
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521))) 
STATUS of the LISTENER 
------------------------ 
Alias                    LISTENER 
Version                  TNSLSNR for Linux: Version 11.2.0.1.0 - Production 
Start Date                25-JUL-2013 22:07:15 
Uptime                    0 days 0 hr. 0 min. 30 sec 
Trace Level              off
Security                  ON: Local OS Authentication 
SNMP                      OFF
Listener Parameter File  /u01/app/oracle/product/network/admin/listener.ora 
Listener Log File        /u01/app/oracle/diag/tnslsnr/night/listener/alert/log.xml 
Listening Endpoints Summary... 
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) 
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=night)(PORT=1521))) 
The listener supports no services 
The command completed successfully 
SQL> !ps -ef | grep thinkdba 
oracle    4117    1  0 22:06 ?        00:00:00 ora_pmon_thinkdba 
oracle    4119    1  0 22:06 ?        00:00:00 ora_vktm_thinkdba 
oracle    4123    1  0 22:06 ?        00:00:00 ora_gen0_thinkdba 
oracle    4125    1  0 22:06 ?        00:00:00 ora_diag_thinkdba 
oracle    4127    1  0 22:06 ?        00:00:00 ora_dbrm_thinkdba 
oracle    4129    1  0 22:06 ?        00:00:00 ora_psp0_thinkdba 
oracle    4131    1  0 22:06 ?        00:00:00 ora_dia0_thinkdba 
oracle    4133    1  1 22:06 ?        00:00:01 ora_mman_thinkdba 
oracle    4135    1  0 22:06 ?        00:00:00 ora_dbw0_thinkdba 
oracle    4137    1  0 22:06 ?        00:00:00 ora_lgwr_thinkdba 
oracle    4139    1  0 22:06 ?        00:00:00 ora_ckpt_thinkdba 
oracle    4141    1  0 22:06 ?        00:00:00 ora_smon_thinkdba 
oracle    4143    1  0 22:06 ?        00:00:00 ora_reco_thinkdba 
oracle    4145    1  1 22:06 ?        00:00:01 ora_mmon_thinkdba 
oracle    4147    1  0 22:06 ?        00:00:00 ora_mmnl_thinkdba 
oracle    4149    1  0 22:06 ?        00:00:00 ora_d000_thinkdba 
oracle    4151    1  0 22:06 ?        00:00:00 ora_s000_thinkdba 
oracle    4186  4066  2 22:06 ?        00:00:02 oraclethinkdba (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) 
oracle    4192    1  0 22:06 ?        00:00:00 ora_qmnc_thinkdba 
oracle    4208    1  1 22:06 ?        00:00:00 ora_cjq0_thinkdba 
oracle    4210    1  0 22:06 ?        00:00:00 ora_q000_thinkdba 
oracle    4212    1  0 22:06 ?        00:00:00 ora_q001_thinkdba 
oracle    4214    1  0 22:06 ?        00:00:00 ora_vkrm_thinkdba 
oracle    4222    1 29 22:07 ?        00:00:17 ora_j002_thinkdba 
oracle    4231    1  5 22:07 ?        00:00:03 ora_j006_thinkdba 
oracle    4237    1  4 22:07 ?        00:00:02 ora_j007_thinkdba 
oracle    4250  4066  0 22:08 pts/1    00:00:00 /bin/bash -c ps -ef | grep thinkdba 
oracle    4252  4250  0 22:08 pts/1    00:00:00 grep thinkdba 
SQL>

启动成功了

查看memory_target的大小
SQL> show parameter memory 
NAME                                TYPE        VALUE 
------------------------------------ ----------- ------------------------------ 
hi_shared_memory_address            integer    0 
memory_max_target                    big integer 400M 
memory_target                        big integer 400M 
shared_memory_address                integer    0 
SQL>

已经符合官方文档的说明了,/dev/shm大于memory_max_target的大小。

相关阅读

关于ORA-01000: maximum open cursors exceeded" 问题分析总结 http://www.linuxidc.com/Linux/2013-06/86057.htm

关于Oracle游标的问题(ORA-01000: maximum open cursors exceeded) http://www.linuxidc.com/Linux/2009-01/18148.htm

Oracle ORA-01000:maximum open cursors exceeded http://www.linuxidc.com/Linux/2013-01/77754.htm

ORA-01000: maximum open cursors exceeded http://www.linuxidc.com/Linux/2013-02/80071.htm

更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29330852/viewspace-2120320/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29330852/viewspace-2120320/

您可能感兴趣的与本文相关的镜像

AutoGPT

AutoGPT

AI应用

AutoGPT于2023年3月30日由游戏公司Significant Gravitas Ltd.的创始人Toran Bruce Richards发布,AutoGPT是一个AI agent(智能体),也是开源的应用程序,结合了GPT-4和GPT-3.5技术,给定自然语言的目标,它将尝试通过将其分解成子任务,并在自动循环中使用互联网和其他工具来实现这一目标

<think>好的,我现在需要帮助用户解决在CentOS 7虚拟机上安装Oracle 11g时遇到的ORA-00845错误。用户提到这个错误是“MEMORY_TARGET not supported”,我需要详细分析可能的原因和解决方法。 首先,ORA-00845错误通常与Oracle的自动内存管理(AMM)相关,尤其是MEMORY_TARGET参数的设置。根据Oracle文档,这个错误发生的原因可能是系统没有足够的共享内存或tmpfs分区的大小不足。我需要回忆一下MEMORY_TARGET的工作原理,它依赖于/dev/shm(即tmpfs)的大小。如果用户设置的MEMORY_TARGET超过了/dev/shm的可用空间,就会导致这个错误。 接下来,我需要考虑用户的环境:CentOS 7虚拟机。虚拟机的内存分配和物理机不同,可能存在资源限制。用户可能在安装时没有正确配置共享内存或交换空间。例如,MEMORY_TARGET的值如果超过了tmpfs的大小,或者tmpfs本身没有正确挂载,就会触发这个错误。 然后,我需要回顾之前的对话。用户之前询问过在CentOS 7上安装Oracle 11g的基本参数设置,我提到了内存分配和交换空间的配置,可能用户按照建议设置了MEMORY_TARGET为可用内存的70%,但可能没有正确配置/dev/shm的大小。因此,现在的问题可能是如何调整tmpfs的大小或修改MEMORY_TARGET参数。 可能的解决步骤包括: 1. 检查当前/dev/shm的大小,确认是否足够。 2. 调整tmpfs的大小,使其至少等于MEMORY_TARGET的值。 3. 修改Oracle的内存参数,例如改用手动内存管理(SGA和PGA分开设置)。 4. 确保/etc/fstab中的tmpfs配置正确,避免重启后失效。 5. 检查交换空间是否足够,因为Oracle可能依赖交换空间来支持内存分配。 此外,可能需要用户提供具体的错误信息和当前系统配置,比如MEMORY_TARGET的设置值,以及df -h /dev/shm的输出,以进一步诊断问题。不过,用户没有提供这些细节,所以需要给出通用的解决方案。 还需要注意Oracle 11g在虚拟化环境中的兼容性问题,比如某些内核参数是否需要调整,或者是否使用了正确的Oracle版本(32位 vs 64位)。例如,用户提到的引用是32位的安装指南,但CentOS 7通常是64位系统,可能导致兼容性问题,但用户的问题可能与此无关,因为错误更直接相关于内存设置。 最后,总结解决步骤,分点说明,并建议用户如何验证每个步骤是否成功,比如通过重启实例或重新挂载tmpfs。同时,提醒用户如果问题持续,可能需要进一步检查其他配置,如内核参数或Oracle的安装日志。</think>### **ORA-00845 错误分析与解决方案** **错误原因**: 当 Oracle 11g 的 `MEMORY_TARGET` 参数值超过系统 `/dev/shm`(共享内存/tmpfs 文件系统)的可用空间时,会触发此错误[^1]。`MEMORY_TARGET` 是 Oracle 自动内存管理(AMM)的核心参数,依赖 `/dev/shm` 存储内存管理信息。 --- ### **具体解决步骤** #### **1. 检查当前 `/dev/shm` 大小** ```bash df -h /dev/shm ``` - 默认大小通常为物理内存的 **50%** - 若输出显示不足(例如 `1G`),需扩展其容量 --- #### **2. 临时调整 `/dev/shm` 大小** ```bash mount -t tmpfs shmfs -o size=<新大小> /dev/shm ``` - **示例**: ```bash mount -t tmpfs shmfs -o size=2G /dev/shm # 调整为 2 GB ``` - **验证**: ```bash df -h /dev/shm ``` --- #### **3. 永久修改 `/dev/shm` 配置** 编辑 `/etc/fstab` 文件,添加以下行: ```bash tmpfs /dev/shm tmpfs defaults,size=<新大小> 0 0 ``` - **示例**: ```bash tmpfs /dev/shm tmpfs defaults,size=2G 0 0 ``` **生效命令**: ```bash mount -o remount /dev/shm ``` --- #### **4. 调整 Oracle 内存参数** 若仍报错,可尝试以下两种方案: **方案一:禁用 AMM,改用手动内存管理** ```sql ALTER SYSTEM SET MEMORY_TARGET=0 SCOPE=SPFILE; ALTER SYSTEM SET SGA_TARGET=<SGA大小> SCOPE=SPFILE; ALTER SYSTEM SET PGA_AGGREGATE_TARGET=<PGA大小> SCOPE=SPFILE; ``` - **示例**(分配 1.5 GB 内存): ```sql ALTER SYSTEM SET SGA_TARGET=1200M SCOPE=SPFILE; ALTER SYSTEM SET PGA_AGGREGATE_TARGET=300M SCOPE=SPFILE; ``` **方案二:降低 `MEMORY_TARGET` 值** 修改 `SPFILE` 或 `init.ora` 文件: ```sql ALTER SYSTEM SET MEMORY_TARGET=<新值> SCOPE=SPFILE; ``` - **新值需小于 `/dev/shm` 可用空间** --- #### **5. 重启 Oracle 实例** ```bash sqlplus / as sysdba SQL> shutdown immediate; SQL> startup; ``` --- ### **附加验证** 1. **检查交换空间是否充足**: ```bash free -m # 确保交换空间 ≥ 物理内存 ``` 2. **确认 `/dev/shm` 挂载参数**: ```bash mount | grep shm ``` --- ### **关键原因总结** | 问题根源 | 解决方法 | |----------|----------| | `/dev/shm` 容量不足 | 扩展 tmpfs 大小 | | 虚拟内存(交换空间)不足 | 增加交换文件或分区 | | `MEMORY_TARGET` 设置过高 | 调整参数或改用 SGA/PGA 手动管理 | [^1]: Oracle AMM 要求 `/dev/shm` 至少能容纳 `MEMORY_MAX_TARGET` 或 `MEMORY_TARGET` 参数值 [^2]: 虚拟环境中需确保宿主机资源充足,避免过度分配 --- ### **相关问题** 1. **如何为 Oracle 11g 创建额外的交换文件?** 2. **在虚拟机中如何优化 Oracle 内存分配?** 3. **Oracle 手动内存管理(SGA/PGA)与自动管理的性能差异?**
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值