您现在的位置是:首页 >技术交流 >ORA-27104: system-defined limits for shared memory was misconfigured 问题处理网站首页技术交流
ORA-27104: system-defined limits for shared memory was misconfigured 问题处理
ORA-27104: system-defined limits for shared memory was misconfigured 问题处理
(1)原因
增加oracle 12c 数据库的内存,调整SGA大小,从8G调整到16G
alter system set sga_max_size = 12G scope=spfile;
alter system set sga_target = 12G scope=spfile;
alter system set pga_aggregate_target = 4G scope=spfile;
关闭数据库重启:
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORA-27104: system-defined limits for shared memory was misconfigured
(2)环境
oracle 版本:
SQL> select banner from v$version;
BANNER
-------------------------------------------------------------------------------- Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit
Production PL/SQL Release 12.2.0.1.0 - Production CORE 12.2.0.1.0
Production TNS for Linux: Version 12.2.0.1.0 - Production NLSRTL
Version 12.2.0.1.0 - Production
关键内存参数:
SQL> show parameter memory_
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address integer 0
inmemory_adg_enabled boolean TRUE
inmemory_clause_default string
inmemory_expressions_usage string ENABLE
inmemory_force string DEFAULT
inmemory_max_populate_servers integer 0
inmemory_query string ENABLE
inmemory_size big integer 0
inmemory_trickle_repopulate_servers_ integer 1
percent
inmemory_virtual_columns string MANUAL
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
memory_max_target big integer 0
memory_target big integer 0
optimizer_inmemory_aware boolean TRUE
shared_memory_address integer 0
memory_max_target和memory_target 都是0 。
通过SGA和PGA参数设置Oracle内存。
shm大小是24G,足够用。
df -h /dev/shm
Filesystem Size Used Avail Use% Mounted on
tmpfs 24G 84K 24G 1% /dev/shm
(3)Oracle内存管理概念
<1>AMM与ASMM区别
区别:
AMM (Automatic Memory Management)自动内存管理;(11G才有的特性)
ASMM(Automatic shared Memory Management)自动共享内存管理;(10G有的特性)
AMM不支持HugePage,而ASMM支持HugePage;
AMM让数据库完全管理SGA、PGA的大小;
ASMM只能管理SGA的大小。
<2>启用AMM
启用AMM:
将MEMORY_TARGET设为非0值,则启用。会自动调整SGA、PGA。
注:如果手动也设置了SGA、PGA,则表示自动调整时不小于手动设定的值。
AMM内存参数之间关系:
如果memory_target设置为非0值(则表示启动用自动内存管理AMM)
情况1:
sga_target和pga_aggregate_target已经设置大小,则这两个参数自动调整的值将不小于设置的大小
memory_target = sga_target + pga_aggregate_target
情况2:
sga_target设置大小,pga_aggregate_target没有设置大小
那么pga_aggregate_target初始化值=memory_target-sga_target
情况3:
sga_target没有设置大小,pga_aggregate_target设置大小
那么sga_target初始化值=memory_target-pga_aggregate_target
情况4:
sga_target和pga_aggregate_target都没有设置大小
Oracle将根据数据库运行状况进行分配大小。但在数据库启动时会有默认比例:
sga_target = memory_target60%
pga_aggregate_target = memory_target40%
<3>启用ASMM
启用ASMM:
将MEMORY_TARGET设为0,SGA_TARGET设为非0,STATISTICS_LEVEL参数设置为TYPICAL(默认值)或者ALL才能启用ASMM功能。
可以手工配置SGA和PGA,业务需求。
ASMM内存关系:
如果memory_target没有设置或 = 0(在11g中默认为0)
情况1:
sga_target设置大小(ASMM)
自动调节SGA中的shared pool、buffer cache、redo log buffer、java pool、larger pool等内存大小。
PGA则由pga_aggregate_target的大小决定。
sga和pga不能自动增长和自动缩小。
情况2:
sga_target和pga_aggregate_target都没有设置
SGA中的各组件大小都要明确设定,不能自动调整各组件大小。
PGA不能自动增长和收缩。
<4>核心参数说明
MEMORY_MAX_TARGET
1、表示oracle实例的可以达到的最大内存大小(即可以使用操作系统内存的最大值);
2、静态参数,修改后需重启生效;
3、如果没有设置memory_max_target参数,那么会自动取memory_target的参数值;
4、默认值为系统的shm的值,而shm值为系统物理内存的一半。
MEMORY_TARGET
1、表示oracle实例使用的实际内存大小,不能大于memory_max_target;
2、动态参数,可以随时修改;
3、如果memory_target设为非0,则表示启用AMM。如设为0,则表示不启用自动内存管理(AMM);
4、要改大memory_target需要先调整shm的值,然后修改memory_max_target,最后调整memory_target。
SGA_MAX_SIZE
1、表示SGA可以达到的最大内存大小;
2、静态参数,修改后需重启生效。
SGA_TARGET
1、表示SGA实际使用的实际内存大小,不能大于sga_max_size;
2、动态参数,可以随时修改;
3、如果sga_target设为0,则表示不启用自动共享内存管理(ASMM),所有相关的内存组件需要手动设定大小(前提,在也不开启AMM的情况下)
在生产环境中,为了提高效率,一般设置SGA参数:
SGA_MAX_SIZE=SGA_TARGET 。
同理,如果设置MEMORY参数:
MEMORY_MAX_TARGET=MEMORY_TARGET
(3)排查过程
<1>检查sysctl.conf
/etc/sysctl.conf
shm参数调整到24G
kernel.shmmax = 25769803776
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 25769803776
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586
<2>检查shm设备
也是24G,没有问题。
# df -h /dev/shm
Filesystem Size Used Avail Use% Mounted on
tmpfs 24G 84K 24G 1% /dev/shm
再次尝试设置SGA=16G,总是报错。
参看alter下的log.xml
从20G一直下调12G,依然报错!!!
# cat log.xml | grep "cannot support SGA"
<txt>System cannot support SGA size of 21474836480 bytes
<txt>System cannot support SGA size of 17179869184 bytes
<txt>System cannot support SGA size of 17179869184 bytes
<txt>System cannot support SGA size of 12884901888 bytes
<txt>System cannot support SGA size of 12884901888 bytes
(4)问题解决
sysctl.conf注意参数之间的关系!!!
You can calculate what the kernel.shmall value should be with a
formula as follows. kernel.shmall = kernel.shmmax / kernel.shmmni
看参数文件中:
kernel.shmall = 2097152
kernel.shmmax = 25769803776
kernel.shmmni = 4096
参数关系不正确,kernel.shmall 调整后:
kernel.shmall = 6291456
kernel.shmmax = 25769803776
kernel.shmmni = 4096
数据库成功启动!!!
最后别忘了更新pfile:
create pfile from spfile;