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;  #查看,可見修改已生效。
未完,待續。。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章