読者です 読者をやめる 読者になる 読者になる

kenken0807_DBメモ

つば九郎が好きなDBAです。Oracle Standard Editionでの運用やツールとかとかの備忘録。特に記載がない場合はoracle11gR2です。時々MySQL

常駐接続プーリング(DRCP)で共有プールが肥大化する

前回導入したDRCPを使用しているOracleのshared_poolが異常な勢いで増えてしまったため、

ORA-04031: 共有メモリーの○○バイトを割当てできません

が発生してしまった。

SQL文でバインド変数を使用してないところも多いので共有SQL領域が増えているのかなと思い、
v$sgastatを確認したところ。。。

select pool, name, bytes/1024/1024 MB from v$sgastat
  where pool = 'shared pool' order by 3;
  
  shared pool  SQLA                          1,289.1
  shared pool  kpplmcchtge:kpplmcc          10,677.5

共有SQL領域は1Gほどであったが、kpplmcchtge:kpplmcc10Gも使用されていた。

kpplmcchtge:kpplmccとはいったい。。。

そこで、
データベース常駐接続プールのプールと接続のクラス・マッピングに関する情報(V$CPOOL_CC_INFO)を確認したところ。

>select * from V$CPOOL_CC_INFO ;

POOL_NAME
--------------------------------------------------------------------------------
CCLASS_NAME
--------------------------------------------------------------------------------
SYS_DEFAULT_CONNECTION_POOL
ORA.OCI:SP:HqzTc6WwNWngU0fGqMAhCA

・
・


実行計画
----------------------------------------------------------

-----------------------------------------------------------------------
| Id  | Operation        | Name          | Rows  | Bytes | Cost (%CPU)|
-----------------------------------------------------------------------
|   0 | SELECT STATEMENT |               |     1 |  1041 |     0   (0)|
|   1 |  FIXED TABLE FULL| X$KPPLCC_INFO |     1 |  1041 |     0   (0)|
-----------------------------------------------------------------------

V$CPOOL_CC_INFOの元表はX$KPPLCC_INFOなのでkpplmcchtge:kpplmccと関連はあるだろうなと考えた。
しかも、V$CPOOL_CC_INFOには大量の件数が登録されており、
DRCPのPOOLEDで接続するたびにランダムな値がCCLASS_NAMEに登録されることが原因で共有プールが肥大化しているようだ。

この共有プールの肥大化を抑えるには、

環境変数(ORA_CONNECTION_CLASS)になにかしらの値を設定することで
V$CPOOL_CC_INFOCCLASS_NAMEでその設定した値が再利用されるようになる。

export ORA_CONNECTION_CLASS=oradrcp_test
>select * from V$CPOOL_CC_INFO ;

POOL_NAME
--------------------------------------------------------------------------------
CCLASS_NAME
--------------------------------------------------------------------------------
SYS_DEFAULT_CONNECTION_POOL
ORA.OCI:oradrcp_test

これで、共有プールの肥大化を抑えることができた。