IBM Support

[Db2] データベース・ヒープが不足 (SQL0956C) したり、データベース・ヒープが周期的に増加することがある

Question & Answer


Question

アプリケーションが SQL0956C で失敗し、Db2 診断ログ (db2diag.log) に DIA8302C No memory available in the database heap が多数記録されたり、db2pd -alldbs -memp で観察するとデータベース・ヒープ (dbh) が 15分毎に増加することがあります。 このメモリー・エラーや、メモリー使用量増加の理由と対処方法を教えてください。

Cause

Db2 9.7 以降、データベース・オブジェクトが最後に使用された日付が、システム・カタログに記録されるようになりました。
データベース・オブジェクトが最後に使用された日付の特定

LASTUSED デーモン (db2lused) は、パッケージ・キャッシュを参照して SYSCAT.PACKAGES に登録されているパッケージの使用日付を更新します。
パッケージ・キャッシュのクリーンアップによって、使用されたパッケージがキャッシュから除去されるとき、使用履歴を記録するために、パッケージの情報がデータベース・ヒープに一時的に保管されます。
ここで、データベース・ヒープに空きがなく、パッケージの情報を保管できない場合、以下のような診断情報が db2diag.log に記録されます。
2010-09-21-11.04.12.959530 I2672081A625    LEVEL: Error
PID     : 3342838          TID  : 260913   PROC : db2sysc 0
INSTANCE: db2inst1         NODE : 000      DB   : SAMPLE
APPHDL  : 0-47888          APPID: 192.168.1.23.49952.100921012054
AUTHID  : DB2INST1
EDUID   : 260913           EDUNAME: db2agent (SAMPLE) 0
FUNCTION: DB2 UDB, access plan manager, sqlra_add_pkg_id_to_ejected_list, probe:252
RETCODE : ZRC=0x8B0F0002=-1961951230=SQLO_NOMEM_DBH
          "No memory available in 'Database Heap'"
          DIA8302C No memory available in the database heap. 

エラーが記録されない場合でも、db2lused は 15 分のインターバルで情報を収集するため、最大 15分間はこの情報がデータベース・ヒープに保管されます。
このため、15分間隔でデータベース・ヒープが増加する動作が観察されることがあります。

Answer

以下のいずれかの方法で、SQL0956C エラーや診断ログのメッセージを抑制したり、データベース・ヒープの使用量を減らせる可能性があります。
  1. パッケージ・キャッシュの増加
    パッケージ・キャッシュが十分に大きく、パッケージをクリーンアップする必要がない場合、パッケージの情報をデータベース・ヒープに保管する必要はありません。
    ただし、使用しているパッケージの数やステートメントの種類が多い場合、パッケージ・キャッシュを追加してもクリーンアップが避けられないことがあります。
    設定例
    db2 connect to <db_name>
    db2 update db cfg using PCKCACHESZ <new_value>
    現行の値は以下のコマンドで判別できます。(Windows は grep の代わりに findstr を使います。)
    db2 connect to <db_name>
    db2 update db cfg | grep PCKCACHESZ
  2. データベース・ヒープの増加 (エラー抑制のみ)
    データベース構成パラメーター DBHEAP が固定値の場合、サイズを増やしたり AUTOMATIC に設定することで、割り当て可能なメモリーのサイズを増やします。
    AUTOMATIC の場合、データベース・メモリーセット中のどのヒープも予約していないエリアを使用できます。
    設定例
    db2 connect to <db_name>
    db2 update db cfg using DBHEAP AUTOAMTIC
    現行の値は以下のコマンドで判別できます。(Windows は grep の代わりに findstr を使います。)
    db2 connect to <db_name>
    db2 update db cfg | grep DBHEAP
  3. データベース・オブジェクトの使用日付を更新しない
    データベース・オブジェクトの使用日付を追跡する要件がない場合、以下の設定で使用日付の更新を停止できます。
    db2set DB2_SYSTEM_MONITOR_SETTINGS="LAST_USE_INTERVAL:0"
    db2stop
    db2start
運用上の考慮点
  • Db2 のフィックスパック・レベルが低い場合、パッケージ・キャッシュにおけるメモリー・リークの障害のために、パッケージ・キャッシュを増加しても効果がない可能性があります。パッケージ・キャッシュを増加しても症状が改善しないときは、最新のフィックスパックを適用してください。
  • 「関連情報」のメモリー管理資料に記述されているように、データベース・ヒープはデータベースの動作に必要とされる様々なメモリー要求を満たすために使用される汎用ヒープです。データベース・ヒープの使用量が単調増加する場合、以下のコマンド結果をサポートに送付すると、ヒープの詳細な利用状況が把握できます。
    db2pd -db <データベース名> -memblocks 2 sort
    注: 引数に含まれる 2 はデータベース・ヒープのヒープ ID です。

関連情報
パスポート・アドバンテージによく寄せられる質問
[Db2] DB2 のメモリー管理 - 2.各メモリー・セットの役割
[Db2] DB2 のメモリー管理 - 3.各メモリー・プールの役割
[Db2] ADM4500W パッケージ・キャッシュ・オーバーフローの原因と対処方法


お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m0z000000GozAAAS","label":"Memory"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
31 August 2023

UID

swg21625200