oracle实例内存结构体,Oracle内存结构(01)--实例、数据库与SGA

oracle实例内存结构体,Oracle内存结构(01)--实例、数据库与SGA_第1张图片

1.实例与数据库

实例(Instance):

数据库启动后在内存中的映像,管理数据库正常运行;

在OS中以ORACLE_SID标识,在DB中以Instance_name标识;

组成:(System Global Area + Background Process);

查看实例名:

$ set | grep -i oracle_sid

SQL> show parameter instance_name

数据库(Database):

实例所存取的一个数据库文件的集合;

在DB中以db_name标识;

组成:(初始化参数文件,控制文件,数据文件,日志文件等)

查看数据库名:

SQL> show parameter db_name;

2.SGA(System Global Area)

SGA是一组包含着一个Oracle实例的数据库和控制信息的共享内存结构。

是为oracle系统分配的共享内存;

是实例的主要组成部分;

是影响数据库性能的重要因素;

随实例的启动/关闭而被分配/回收;

SGA自动对所包含的各种缓冲自动进行动态管理;

SGA主要包含6类缓存:

db_buffer_cache

shared_pool

large_pool

java_pool

redo_log_buffer

streams_pool

查看SGA:

SQL> show sga;

SQL> select * from v$sga;

SGA相关参数:

pre_page_sga:启动时是否将全部SGA都绑定到物理内存,而不使用交换分区。

lock_sga:运行过程中是否也将全部SGA都绑定到物理内存,而不使用交换分区。

sga_max_size:SGA总大小上限值。

sga_target:启用自动共享内存管理ASMM(Automatic Shared Memory Management),指定分配给db_buffer_cache、shared_pool、java_pool、large_pool这四项内存大小之和。

注意:sga_max_size可以改大,改小则受sga_target的限制。另外,sga_target应尽量接近sga_max_size。当sga_target小于sga_max_size时,上述指定的四项动态缓存合计值以sga_target为实际上限。如果sga_target被修改为大于sga_max_size的值或sga_max_size小于sga_target时,则数据库在下次启动时sga_max_size值会自动调整为与sga_target值相等。

调整sga_target前,应先查看四项缓存默认值是否都0,若为0表示可由ASSM在0到sga_target值所规定的区间内自动调整各缓存区大小。

查看:

SQL> show parameter db_cache_size;

SQL> show parameter shared_pool_size;

SQL> show parameter large_pool_size;

SQL> show parameter java_pool_size;

更改:

SQL> alter system set db_cache_size=0 scope=both/memory/spfile;

若某项缓存区大小默认设置不为0,而为某一具体值,代表ASMM在动态调整各缓存区时,该缓冲区不能分配低于该指定值的大小。

SGA内存按照颗粒度大小granule_size分配内存,若手工分配内存大小非整数倍于granule_size,则自动凑为granule_size的整数倍大小,常见granule_size如下:

若SGA<1G,granule_size=4M;若SGA>1G,granule_size=8M(for WIN)或16M(for Other);redo_log_buffer以512K为粒度分配内存。

查看SGA粒度大小:

SQL> select bytes from v$sgainfo where name='Granule Size';

相关操作:

SQL> show sga

Total System Global Area  201326592 bytes

Fixed Size                  1218532 bytes

Variable Size              83888156 bytes

Database Buffers          113246208 bytes

Redo Buffers                2973696 bytes

Fixed Size:固定值,包括一些开销等其他空间大小。是shared pool内dictionary cache的一部分与其他部分附加内存信息(如数据库和实例的状态信息)会被实例的后台进程所访问,在实例启动后即被固定在SGA中,是SGA中固定组件(在编译oracle数据库本身时就固定在其中),大小不变,故该部分缓存又称为固定SGA(Fixed SGA)。

Variable Size:可用大小。为sga_max_size-log_buffer-db_buffer_cache-fixed_size,剩下的包含Library cache、Java pool、Large pool、cursor area、control file content等缓存区大小。

Database Buffers:db_buffer_cache实际大小。

Redo Buffers:redo_buffer实际大小。

SQL> select current_size from v$buffer_pool;    #查看data_buffer_cache实际大小(单位M)。

SQL> select pool,sum(bytes) from v$sgastat group by pool;    #查看java pool, streams pool,shared pool,large pool实际大小。

SQL> alter system set sga_target=120M scope=both;   #修改sga_target自动管理缓冲区合计值,在sga_max_size范围内调整可动态生效。各缓存区大小也将自动调整以适应修改后的sga_target总值。

SQL> show parameter sga_targe;

SQL> select current_size from v$buffer_pool;

SQL> select pool,sum(bytes) from v$sgastat group by pool;    #查看修改,可见已跟随sga_target而变化,注意sga的值是granule的整数倍。

SQL> alter system set sga_target=400M scope=both;

alter system set sga_target=400M scope=both

*

ERROR at line 1:

ORA-02097: parameter cannot be modified because specified value is invalid

ORA-00823: Specified value of sga_target greater than sga_max_size

#若修改sga_target值大于sga_max_size,则sga_target只能作为静态参数修改:SQL> alter system set sga_target=400M scope=spfile;

SQL> alter system set sga_max_size=200M scope=spfile;         #修改sga_max_size值,静态参数,重启生效。

SQL> alter system set large_pool_size=10M scope=memory;    #修改制定缓冲区最小值。若想在ASMM管理下,为某缓存区规定一个最小分配下限值(指示ASMM该区的分配不能低于该指定值),则可通过设定默认值来达到目的。

SQL> select pool,sum(bytes) from v$sgastat group by pool;  #查看,可见修改已生效。

未完,待续。。。

你可能感兴趣的:(oracle实例内存结构体)