熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle內存結構:SGA的區域信息

2013-11-13 15:46:51  來源: Oracle 

  SGA的區域信息

  SGA(system global area)系統全局區跟一些必須的後台進程合進來稱為實例(Instance)說它是全局區是包含了全局變量和數據結構是系統區是包含了進入整個Oracle Instance的數據結構而不是特定的進程結構

  SGA區域

  SGA大概包括下面四到五種區域

  The fixed area

  The variable area

  The database blocks area

  The log buffer

  The instance lock database(for parallel server instances)——OPS&RAC

  根據內存的大小我們可以把The fixed area和The log buffer設為很小

  The fixed area

  SGA中的The fixed area包含了數千個原子變量以及如latches和指向SGA中其它區域的pointers(指針)等小的數據結構通過對fixed table內表X$KSMFSV查詢(如下)可以獲得這些變量的名字變量類型大小和在內存中的地址

  SQL> select ksmfsnam ksmfstyp ksmfssiz ksmfsadr

  > from x$ksmfsv

  這些SGA變量的名字是隱藏的而且幾乎完全不需要去知道但是我們可以通過結合fixed table內表X$KSMMEM獲得這些變量的值或者檢查它們所指向的數據結構

  SQL>select aksmmmval from x$ksmmem a where addr=(select addr from x$ksmfsv where ksmfsnam=kcrfal_

  SGA中的fixed area的每個組成部分的大小是固定的也就是說它們是不依靠於其它的初始化參數的設置來進行調整的fixed area中的所以組成部分的大小相加就是fixed area的大小

  The variable area

  SGA中的the variable area是由large pool和shared pool組成的large pool的內存大小是動態分配的而shared pool的內存大小即包含了動態管理的內存又包含了永久性的(已經分配的)內存實際上初始化參數shared_pool_size的大小設置是指定shared pool中動態分配的那部分內存的一個大概的SIZES而不是整個shared pool的SIZES

  Shared pool中永久性的內存包含各種數據結構如the buffer headers processes sessions transaction arrays the enqueue resources locks the online rollback segment arrays various arrays for recording statistics其中大部分的SIZE是依靠初始參數的設置來確定的這些初始參數只能在實例被關閉的狀態下才能夠進行修改所以這裡說的永久性是針對實例打開狀態下的生存期而言簡單的一個例子PROCESSES參數在這個process arrays中的slots用完之後如果有其它的process想再申請一個process則會失敗因為它們在內存中的大小是在實例啟動時預分配的不能動態修改之

  針對很多永久性的arrays有很多的X$表都把這些元素做一個記錄而成員結構則作為字段V$視圖的數據就是從這些X$表獲得如V$PROCESS是基於X$KSUPR內表的V$PROCESS視圖不包含X$KSUPR的全部字段 X$KSUPR也沒有覆蓋SGA進程結構的所有成員

  The variable area的在SGA中的SIZES就等於LARGE_POOL_SIZESHARED_POOL_SIZE和永久性的內存arrays的SIZE三者相加 永久性的內存arrays的總的SIZE可以通過初始參數的設置來計算得到然而你需要知道從參數獲得這些array sizes的方程式每個array元素大小的字節數還有array頭信息的sizes這些跟Oracle的版本號和OS有關實際使用中我們是不必要計算這個永久性的內存arrays的SIZE的如果想知道一個方法就是在STARTUP NOMOUNT數據庫時記下the variable area然後減去參數中LARGE_POOL_SIZE和SHARED_POOL_SIZE的大小就可以

  The database block area

  這個區域是數據庫塊的拷貝在Oracle i中buffer數由DB_BLOCK_BUFFERS指定每個buffer的大小由DB_BLOCK_SIZE指定所以這個區域的大小是兩者相乘在Oracle i中這個區域的大小是DB_CACHE_SIZE指定這個區不包含它們自己的控制結構只包含database block copies data每個buffer的header信息存在於SGA的the variable area中還有latches信息也放在SGA的the variable area中在設置DB_BLOCK_BUFFERS時每個BUFFERS會影響the variable area的K的SIZE關於這一點可以通過測試(針對i而言)

  The log buffer

  這個區域的SIZE是由參數LOG_BUFFER指定的如果OS支持內存保護log buffer將會被兩個保護頁面包圍起來以免被一些ORACLE的錯誤進程損壞log buffer在SGA中跟其它的如variable area和database block area相比log buffer是非常小的log buffer分成內部的buffer blocks而這些block各有個字節的頭部信息存在於variable area中

  The instance lock database

  在OPS/RAC配置中instance locks用來控制由所有instances共享的資源以串行的方式被進入並使用SGA中的這個區域所維護的是本地實例所要使用的數據庫資源所有實例和進程都會用到的數據庫資源還有所有實例和進程當前需要的或者已經擁有的鎖(LOCKS)這三個arrays的SIZE分別由參數LM_RESSLM_PROCSLM_LOCKS參數指定(這三個參數是RAC的參數在單實例中用SHOW PARAMETER是查看不到的) The instance lock database還包含了message buffers和其它的structure但是其SIZE是非常小的

  這個區域的SIZE是沒辦法在實例啟動的時候看到的這是Oracle Internals可以用ORADEBUG工具查看SQL>ORADEBUG IPC至於ORADEBUG工具就不做介紹用這個工具做操作時需要經過Oracle Support同意

  可以用以下的兩種方式DUMP SGA

  SQL>ALTER SESSION SET EVENTS immediate trace name global_area level

  或者SQL>ORADEBUG DUMP GLOBAL_AREA


From:http://tw.wingwit.com/Article/program/Oracle/201311/17292.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.