您现在的位置是:首页 >技术交流 >ORA-27104: system-defined limits for shared memory was misconfigured 问题处理网站首页技术交流

ORA-27104: system-defined limits for shared memory was misconfigured 问题处理

六月闻君 2024-06-17 11:28:39
简介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;

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。