突然oracleプロセスのCPU利用率が100%になってデータベースが固まる事象について

ある時、突然、サーバ上のoracleプロセスのCPU利用率が100%になって、問い合わせはおろかログインもできなくなる…そんな事象に遭遇しました。

前提:うちの環境は8コア(後述) 専用サーバモードで動作/利用していると思ふ

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Release 10.2.0.3.0 - 64bit Production
PL/SQL Release 10.2.0.3.0 - Production
CORE    10.2.0.3.0      Production
TNS for Linux: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production

ある時、突然データベースサーバがうんともすんともいわなくなりました。正確には、SQL問い合わせを投げると帰ってこない。ログインもできない。
で、調べてみると、pingsshなどは普通に通ります。topコマンドその他を確認してみると、CPU利用率のうち「あるCPU(コア)のみがusertime 100%になっている」ことが解りました。wait%はほぼゼロ。その他のコアの利用率は数%程度、といたって平穏です。

なのに、他のコアに割り当てられているはずのoracleプロセス群の問い合わせもすべて通らない。IO待ちではないことも明らか。どうやらoracleの中で「固まって」いるようです。

結局、待機系にfail-overしてこの時は事なきを得た(ことなきってことはないか)。で、結果としては以下のようなものでした。

結論:「Oracle10gのバグ ただしPSRは公開済み」

要するに

  • PSR10.2.0.4あてればよろしい

もう少しまとめると

  • PSR10.2.0.4 では修正されている。それ以前(うちの10.2.0.3とか)では発生する
  • STATSPACKを利用/仕掛けていて、statspack snapをレベル6以上で取得しているとだめ。
    • レベル5に設定していれば出ないらしい
    • "実行計画の取得"がレベル6以上では実施されてしまう。で、バグの発生条件に触れる。
  • 固まる理由は "library cache latch"の保持しっぱなし
  • 保持しっぱなしの理由はOracle内での利用メモリの枯渇・・らしい
  • 利用メモリの枯渇の理由は、どうやら「メモリリーク」らしいが細かい説明割愛

同種の問題に遭遇しているかもしれないあなたへ、

  • trcファイルとかで MMONの情報で
  memory info: free memory = 0.00M

とか

  swap info:   free = 0.00M alloc = 0.00M total = 0.00M

とか出ている場合はあやしいです

なんかいまいち情報がオープンにされていないのですが、 PSR10.2.0.4を適用していなくて、STATSPACK利用している人は遭遇する可能性がありますので、エントリとしてまとめておきました。