關於oracle 使用大記憶體出現:ORA-27102: out of memory
3. Oracle 下需要做調整的引數
SGA_MAX_SIZE
SGA_TARGET
DB_CACHE_SIZE
SGA_MAX_SZIE 為例項允許使用的sga 上限,一個靜態引數,是不能動態修改的.
SGA_TARGET 為10g 推出的sga 自動管理的引數,動態引數,可以動態修改.
sga_max_size 與 SGA 各元件大小的關係
設定的 sga_max_size 小於實際的SGA 中各個pool 的尺寸總和的大小,那麼
sga_max_size 的值會被oracle 自動以實際的SGA 的總尺寸代替。如果不設定
sga_max_size ,oracle 會自動的以實際的SGA 的總尺寸來設定sga_max_size 的值。
設定 sga_max_size 的值為大於SGA 中各個pool 的尺寸總和的值:但是
sga_max_size 的值相對於所有可用的實體記憶體來說,是一個合理的值。sga_max_size
的實際的值和pfile 中的sga_max_size 指定的值是一樣的。
在Oracle 10g 中引入了一個非常重要的引數:SGA_TARGET,這也是Oracle 10g
的一個新特性。自動共享記憶體管理(Automatic Shared Memory Management ASMM),控
制這一特性的,就僅僅是這個引數SGA_TARGE。設定這個引數後,你就不需要為每個內
存區來指定大小了。SGA_TARGET 指定了SGA 可以使用的最大記憶體大小,而SGA 中各個內
存的大小由Oracle 自行控制,不需要人為指定。Oracle 可以隨時調節各個區域的大小,
使之達到系統性能最佳狀態的個最合理大小,並且控制他們之和在SGA_TARGET 指定的
值之內。一旦給SGA_TARGET 指定值後(預設為0,即沒有啟動ASMM),就自動啟動了ASMM
特性。
10g 下設定 SGA_TARGET 之後啟動ASSM 特性之後, 只有以下的這些區的記憶體大小動態
共享起來:
* Buffer cache (DB_CACHE_SIZE)
* Shared pool (SHARED_POOL_SIZE)
* Large pool (LARGE_POOL_SIZE)
* Java pool (JAVA_POOL_SIZE)
* Streams pool (STREAMS_POOL_SIZE)
而SGA 中的其他區域的記憶體大小仍然是固定不共享的。
它的含義和SGA_MAX_SIZE 的一樣,也表示SGA 最大的大小,於是它也就有了一個
限制,那就是它的大小不能大於SGA_MAX_SIZE 的大小。
Oracle10g 下, SGA_MAX_SIZE 仍然表示SGA 的大小的上限值,而SGA_TARGET 是
SGA 的所有元件的大小的最大值之和,即當SGA_TARGET< SGA_MAX_SIZE 的時候,oracle
就會忽略SGA_MAX_SIZE 的值,SGA_TARGET 也就成了SGA 的在此例項中的上限制,它能
動態改變大小,但是不能夠大於SGA_MAX_SIZE 的值。
有人曾經做過試驗,在某些版本中(可能在我的版本之後的版本),當SGA_TARGET
< SGA_MAX_SIZE 時,例項重啟以後SGA_MAX_SIZE 就變成SGA_TARGET 的大小了。
在
小,oracle 會自動幫你調整,設定比它大,那還是出錯。現在可以自己想想,oracle
對SGA_TARGET 的大小處理在往正確的簡單的方向前進中。
SGA_TARGET 帶來一個重要的好處就是,能使SGA 的利用率達到最佳,從而節省內
存成本。因為ASMM 啟動後,Oracle 會自動根據需要調整各個區域的大小,大大減少了
某些區域記憶體緊張,而某些區域又有記憶體空閒的矛盾情況出現。