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

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类缓存:
  1. db_buffer_cache
  2. shared_pool
  3. large_pool
  4. java_pool
  5. redo_log_buffer
  6. 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,数据库,实例,体系结构,休闲)