おらくるのいる生活

OracleのDBAとしての、障害対応やらパフォーマンス・チューニングやらの日々を綴っています

CREATE MATERIALIZED VIEWでORA-600が発生

リリースを間近に控えた環境で、2つの MATERIALIZED VIEWの作成で以下のエラーが発生するとの連絡を受けました。

ORA-00600: 内部エラー・コード, 引数: [KGL-heap-size-exceeded], [0x303FBFEA10]

 

環境は以下の通りです。

Oracle RAC(2ノード) EE 19.9

Oracle Linux 7.9

早速MOS(My Oracle Support)で調べてみます。

Bug 29255705 - Inlists queries failing with ORA-600 [optmutrset, KUTYPN(opnmutrset) at %p] when predicates were being pushed to the cells. (ドキュメントID 29255705.8)

回避策は以下3つのうちいずれかになります。

alter session set cell_offload_processing=false;
alter session set "_rowsets_enabled"=false;
alter session set events '10055 trace name context forever, level 512';

1番目のcell_offload_processing=falseを試してもらったところ、一つはエラーが解消しましたが、もうひとつのマテビュー作成はエラーのままでした。

そこで、上記3つとも試してもらったのですが、エラーは解消しませんでした。

 

更に調査を続けます。

Sqlt Errors with ORA-600 [KGL-heap-size-exceeded] (ドキュメントID 2417499.1)

回避策は以下の通りですが、解消しませんでした。

※セッション単位で設定できないパラメータなので、システム単位で設定し、元に戻しておきます。

ALTER SYSTEM SET "_kgl_large_heap_warning_threshold"=2147483647 SCOPE=BOTH sid='*';

ここでMView作成

ALTER SYSTEM reset "_kgl_large_heap_warning_threshold"  SCOPE=BOTH sid='*';

更に調査します。

ORA-600 [KGL-HEAP-SIZE-EXCEEDED] While Adding/Removing a Subscriber In AQ (ドキュメントID 2683875.1)

回避策はBug 30910264 用パッチの適用ですが、これは適用済でした。

更にこちらのドキュメントも参照しました。

ORA-00600: internal error code, arguments: [KGL-heap-size-exceeded] When Using Adavanced Queuing. (ドキュメントID 2629498.1)

こちらの恒久的な対策はBug 30910264用のパッチ適用ですが、一時的な回避策で共有プールのフラッシュとあったので、それも試しましたが解消せず。

で、最終的には以下のドキュメントの回避策で対処できました。

メモリの通知: Library Cache Object loaded into SGA / ORA-600 [KGL-heap-size-exceeded] (ドキュメントID 2455241.1)

一部、抜粋します。

多数のパーティション・サブパーティションを有するオブジェクトの場合、_kgl_large_heap_assert_threshold のデフォルト値は小さすぎることがあり、そのような場合には ORA-600 を回避するために値を増やすべきです。

設定例:

"_kgl_large_heap_assert_threshold" = 1572864000 は制限の閾値を 1500MB に増加させます。

ドキュメントID 2417499.1の回避策で "_kgl_large_heap_warning_threshold"=2147483647を設定したのですが、こちらはアラートログに書き出す時の閾値なので、_kgl_large_heap_assert_thresholdの方を変更しなければならなかったようです。

だったらドキュメントID 2417499.1の記載は何なんでしょう…。

 

ちなみに、今回はマテビューの作成で発生しましたが、それ以外のSQLであっても、閾値を超えてライブラリキャッシュ・ヒープを使用すると、同じエラーが発生します。

また、この閾値はORA-4031 を引き起こす共有プール内の領域不足を避けるために導入されたもので、恒久的に値を引き上げるのであれば、「SGA_TARGET 及び SHARED_POOL_SIZE を 15% 増加することを検討する」必要があるそうです。