客先のシステムでのお話。
とある検索画面で、とあるSQLを実行すると、
下記のエラーが発生するという現象があったらしいです。
(らしい、というのはメーリングリストに流れてきた情報なので)
ORA-04031: 共有メモリーの?バイトを割当てできません
共有プールって、基本的には
足りなくなったら空き領域確保
するようです。
(他にもトリガーはあるみたいですけど)
で、先程のORACLEエラーですが
「足りなくなったら空き領域確保」した結果でも
「連続した領域」が割り当てできなかった場合
に起こるらしい。
要は領域のフラグメンテーションが原因。
(もしくは本当に共有メモリが足りない)
おそらくバカでかいソートなどが発生して
足りなくなったんでしょう。
というか、前にも書いたような気もするのですが
客先のSGA構成ってラージプール設定してないんですよね。
なのでUGA(ユーザ共有領域)が共有プールで使われるため
ORA-04031が発生してしまうんじゃないかなぁ…
…などと考えてたら、
「Oracleから回答が来た。
LARGE_POOL_SIZEを設定すると良いようだ」
みたいなメーリングリストが流れてきたw
気付くの遅いよw
というわけで、
今回はSGA(システムグローバルエリア)についておさらいでもしてみますか。
まず、SGAの構成から。
①データベースバッファキャッシュ
②REDOバッファ
③共有プール
(以下はオプション)
④ラージプール
⑤JAVAプール
①はデータファイルから取り出したデータブロックをキャッシュします。
サイズは以下の初期化パラメータから算出できます。
○Oracle9i以上で、DB_CACHE_SIZEが設定されている場合
→DB_CACHE_SIZE
○上記以外
→DB_BLOCK_BUFFERS×DB_BLOCK_SIZE
②はデータベースに対する変更情報(REDO)をキャッシュします。
サイズは初期化パラメータLOG_BUFFERで設定します。
③はライブラリキャッシュ(共有SQL領域+共有PL/SQL領域)や、
データディクショナリ結果をキャッシュします。
サイズは初期化パラメータSHARED_POOL_SIZEで設定します。
④は共有サーバ接続時のUGA(セッションメモリ)・RMANで使用する
メモリなどをキャッシュします。
サイズは初期化パラメータLARGE_POOL_SIZEで設定します。
⑤はJava仮想マシンで動作するJavaコードやデータをキャッシュします。
サイズは初期化パラメータJAVA_POOL_SIZEで設定します。
メモリ管理については
細かい話をすると書ききれないので
調査用のコマンド・ビューくらいにしておきますか。
■SGAサイズの確認
SHOW SGA コマンド
V$SGAビュー
V$SGASTATビュー
■ライブラリキャッシュの確認
V$LIBRARYCACHEビュー
■共有SQL領域の統計など
V$SQLAREAビュー
■共有プール予約領域サイズの確認
V$SHARED_POOL_RESERVED
■UGAサイズの確認
V$MYSTAT
■データベースバッファキャッシュの診断と統計
V$SYSSTAT
V$SYSTEM_EVENT
■バッファキャッシュアドバイザの確認
V$DB_CACHE_ADVICE
■複数バッファプールに関する初期化パラメータ
V$PARAMETERビュー
・db_cache_size defaultバッファプールのサイズ。
・db_keep_cache_size keepバッファプールのサイズ。
・db_recycle_cache_size recycleバッファプールのサイズ。
■複数バッファプールの確認
V$BUFFER_POOL
V$BUFFER_POOL_STATISTICS
■REDOログバッファの診断と統計
V$SYSSTAT
V$SYSTEM_EVENT
■ラッチの確認
V$LATCH
とある検索画面で、とあるSQLを実行すると、
下記のエラーが発生するという現象があったらしいです。
(らしい、というのはメーリングリストに流れてきた情報なので)
ORA-04031: 共有メモリーの?バイトを割当てできません
共有プールって、基本的には
足りなくなったら空き領域確保
するようです。
(他にもトリガーはあるみたいですけど)
で、先程のORACLEエラーですが
「足りなくなったら空き領域確保」した結果でも
「連続した領域」が割り当てできなかった場合
に起こるらしい。
要は領域のフラグメンテーションが原因。
(もしくは本当に共有メモリが足りない)
おそらくバカでかいソートなどが発生して
足りなくなったんでしょう。
というか、前にも書いたような気もするのですが
客先のSGA構成ってラージプール設定してないんですよね。
なのでUGA(ユーザ共有領域)が共有プールで使われるため
ORA-04031が発生してしまうんじゃないかなぁ…
…などと考えてたら、
「Oracleから回答が来た。
LARGE_POOL_SIZEを設定すると良いようだ」
みたいなメーリングリストが流れてきたw
気付くの遅いよw
というわけで、
今回はSGA(システムグローバルエリア)についておさらいでもしてみますか。
まず、SGAの構成から。
①データベースバッファキャッシュ
②REDOバッファ
③共有プール
(以下はオプション)
④ラージプール
⑤JAVAプール
①はデータファイルから取り出したデータブロックをキャッシュします。
サイズは以下の初期化パラメータから算出できます。
○Oracle9i以上で、DB_CACHE_SIZEが設定されている場合
→DB_CACHE_SIZE
○上記以外
→DB_BLOCK_BUFFERS×DB_BLOCK_SIZE
②はデータベースに対する変更情報(REDO)をキャッシュします。
サイズは初期化パラメータLOG_BUFFERで設定します。
③はライブラリキャッシュ(共有SQL領域+共有PL/SQL領域)や、
データディクショナリ結果をキャッシュします。
サイズは初期化パラメータSHARED_POOL_SIZEで設定します。
④は共有サーバ接続時のUGA(セッションメモリ)・RMANで使用する
メモリなどをキャッシュします。
サイズは初期化パラメータLARGE_POOL_SIZEで設定します。
⑤はJava仮想マシンで動作するJavaコードやデータをキャッシュします。
サイズは初期化パラメータJAVA_POOL_SIZEで設定します。
メモリ管理については
細かい話をすると書ききれないので
調査用のコマンド・ビューくらいにしておきますか。
■SGAサイズの確認
SHOW SGA コマンド
V$SGAビュー
V$SGASTATビュー
■ライブラリキャッシュの確認
V$LIBRARYCACHEビュー
■共有SQL領域の統計など
V$SQLAREAビュー
■共有プール予約領域サイズの確認
V$SHARED_POOL_RESERVED
■UGAサイズの確認
V$MYSTAT
■データベースバッファキャッシュの診断と統計
V$SYSSTAT
V$SYSTEM_EVENT
■バッファキャッシュアドバイザの確認
V$DB_CACHE_ADVICE
■複数バッファプールに関する初期化パラメータ
V$PARAMETERビュー
・db_cache_size defaultバッファプールのサイズ。
・db_keep_cache_size keepバッファプールのサイズ。
・db_recycle_cache_size recycleバッファプールのサイズ。
■複数バッファプールの確認
V$BUFFER_POOL
V$BUFFER_POOL_STATISTICS
■REDOログバッファの診断と統計
V$SYSSTAT
V$SYSTEM_EVENT
■ラッチの確認
V$LATCH