错误信息

【汉】ORA-00845:系统不支持MEMORY_TARGET

【英】ORA-00845:MEMORY_TARGET not supported on this system

在CentOS 7操作系统上启动数据库时报错。

ORA-00845:系统不支持MEMORY_TARGET_ORA-00845

版本

Oracle 【11.2.0.3.0】、【11.2.0.1.0】、【11.2.0.4.0】

原因

原因有两种可能,一是因为操作系统不支持参数【MEMORY_TARGET】,另一种可能是操作系统支持,但是/dev/shm空间不够。

首先来说一下/dev/shm,/dev/shm是一种文件系统,它跟xfs、ext4、ext3这种文件系统相似,只不过它是完全使用内存的一种文件。在内存中存储数据,大家也清楚,只要服务器在重启或意外宕机的情况下,/dev/shm目录里的内容就会丢失。

【MEMORY_TARGET】参数指定Oracle可使用的内存空间,它会使用/dev/shm文件系统来动态分配SGA和PGA。因此,只要指定此参数的大小,就不需要再手动调整SGA和PGA的大小,这就是Oracle的AMM内存管理模式。

如果初始化参数文件中,有【MEMORY_TARGET】参数但没有【MEMORY_MAX_TARGET】的值,则Oracle会自动将【MEMORY_MAX_TARGET】参数的值设置成【MEMORY_TARGET】参数的值。

如果初始化参数文件中,有【MEMORY_MAX_TARGET】参数但没有【MEMORY_TARGET】参数的话,则Oracle会自动将【MEMORY_TARGET】参数的值设置为0。在数据库启动后,可以在根据需要,动态去设置【MEMORY_TARGET】参数的大小,但它不能超过【MEMORY_MAX_TARGET】参数值。

需要注意的是,设置了【MEMORY_TARGET】参数后,并不代表Oracle内存使用一定会低于或等于这个值。例如,在服务器操作系统内存可用的情况下,内存就会分配给PL/SQL表和varrays,而不考虑【MEMORY_TARGET】参数的值。

解决方法

CentOS系统是支持【MEMORY_TARGET】参数的,那么就只剩下/dev/shm空间不足的情况。

1、首先检查/dev/shm空间的大小。

[oracle@localhost ~]$ df -h

ORA-00845:系统不支持MEMORY_TARGET_ORA-00845_02

2、检查数据库参数文件配置的参数

检查参数文件有两个,一个是spfile<ORACLE_SID>.ora文件,另一个是inti<ORACLE_SID>.ora文件。

Oracle在启动到nomount状态下,会先读取spfile文件,如果spfile不存在,再读取pfile文件。因此,只要spfile文件存在,就不需要管pfile文件是否存在了。

# 进入参数文件目录
[oracle@localhost ~]$ cd $ORACLE_HOME/dbs
# 查看spfile文件
[oracle@localhost dbs]$ cat spfileorcl.ora

ORA-00845:系统不支持MEMORY_TARGET_ORA-00845_03

3、解决

看到当前数据库配置的内存的确超过/dev/shm内存时,就已经有解决方案了。解决要么是增加/dev/shm空间的大小,要么是减少memory参数的值。这两种方案需要跟据你的服务器来定,如果有内存可以继续增加,就可以增大/dev/shm的值。如果没有内存可以使用,就减少memory参数的值。

增加/dev/shm

此方法要求/dev/shm暂时没有使用,如果有使用,请先关闭使用的服务再重新挂载,否则,正在使用/dev/shm的应用会报错。

# 重新挂载内存
[root@localhost ~]# mount -t tmpfs shmfs -o size=3g /dev/shm

# 配置自动挂载
vim /etc/fstab

shmfs /dev/shm tmpfs size=3g 0

# 再次查看
[root@localhost ~]# df -h

减少内存的值

减少内存的参数,需要编辑pfile文件后,再重新用pfile生成spfile。

进入sqlplus命令窗口
[oracle@localhost dbs]$ sqlplus / as sysdba
# 使用spfile创建pfile文件
SQL> create pfile from spfile;
# 退出splqplus命令窗口
SQL> exit
# 修改配置文件,减少参数的值
[oracle@localhost dbs]$ vim initorcl.ora

*.memory_max_target=1073741824
*.memory_target=1073741824

# 再进入sqlplus命令窗口
[oracle@localhost dbs]$ sqlplus / as sysdba
# 用pfile生成spfile
SQL> create spfile from pfile;
# 启动数据库
SQL> startup

至此,问题就解决了,数据库正常启动。