web-dev-qa-db-ja.com

新しいバッファプールは使用されていません

移行の一環として、新しいバッファプール(例:BP8K-サイズ8K)と、そのbpを使用するテーブルスペース、およびデータがロードされたテーブルスペース内のテーブルを作成しました。しかし、私は得ます:

 SQL1218N There are no pages currently available in bufferpool "4097"

その過程で。 db2topを見ると、現象を説明するBP8Kではなく、デフォルトのバッファプールIBMSYSTEMBP8Kが使用されているように見えます。

バッファプールを開始するのに十分な共有メモリがない場合も同様ですが、この場合、BP8Kはdb2topdb2pd -d ... -bufferpoolsの両方に表示されます。また、bpのサイズを変更することもできます。これにより、メモリが不足した場合に、通常、バッファープールが開始されていないという警告が表示されます。

db2stop; db2startは問題を修正しますが、それは本当に必要ですか?移行は、アップグレードフレームワークから実行されるSQLスクリプトであるため、すべてのアプリケーションを強制するフックを追加しない方がよいでしょう。考え?

db2level
DB21085I  This instance or install (instance name, where applicable: 
"db2inst1") uses "64" bits and DB2 code release "SQL11050" with level 
identifier "0601010F".
Informational tokens are "DB2 v11.5.0.0", "s1906101300", "DYN1906101300AMD64", 
and Fix Pack "0".
Product is installed at "/opt/ibm/db2/V11.5".

db2licm -l
Product name:                     "DB2 Enterprise Server Edition"
License type:                     "Restricted"
Expiry date:                      "Permanent"
Product identifier:               "db2ese"
Version information:              "11.5"
Max amount of memory (GB):        "128"
Max number of cores:              "16"

cat /proc/meminfo 
MemTotal:       164759044 kB
MemFree:         4267032 kB
MemAvailable:   131089520 kB

Mark Ba​​rinstein バッファプールが結局開始されていないと判断するのに役立ちました:

ADM6073W  The table space "TBSPC8K" (ID "9") is configured to use 
          buffer pool ID "3", but this buffer pool is not active at this time. 
          In the interim the table space will use buffer pool ID "4097".

ほとんどのメモリは、新しいBPを含めてAUTOMATICに設定されているため、起動できない理由がわかりません。サーバーには十分なメモリがあり、dbは〜1.8Gb(主にバッファプール)を使用しているため、Db2が新しいバッファプールを開始できない理由がわかりません。私はbp、tbspaceの作成後にコミットを追加しようとしましたが、それは役に立ちませんでした。

質問は次のようになります。Db2がこのBPを開始できない理由。 the docs によると:

十分なメモリがある場合、バッファプールはすぐにアクティブになります。デフォルトでは、IMMEDIATEキーワードを使用して新しいバッファープールが作成され、ほとんどのプラットフォームで、データベースマネージャーはより多くのメモリを取得できます。

サーバーで利用可能なメモリが十分あるようです。新しいテーブルスペースを作成する前に、データベースはおおよそ1.8Gbのメモリを割り当てました。 bp作成のステートメントは次のようになります。

CREATE BUFFERPOOL BP8K SIZE AUTOMATIC PAGESIZE 8K @
CREATE BUFFERPOOL BP16K SIZE AUTOMATIC PAGESIZE 16K @
CREATE BUFFERPOOL BP32K SIZE AUTOMATIC PAGESIZE 32K @
CREATE LARGE TABLESPACE TBSPC8K PAGESIZE 8K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL BP8K @
CREATE LARGE TABLESPACE TBSPC16K PAGESIZE 16K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL BP16K @
CREATE LARGE TABLESPACE TBSPC32K PAGESIZE 32K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL BP32K @

Bp、tbspaceの作成後にスクリプトを停止し、すべてのアプリケーションを強制的に実行してから、残りのスクリプトを実行したところ、問題なく動作しました。私はドキュメントからその印象を受けませんが、おそらくそれは行われなければなりません。

以下に従ってdb cfg memory configを更新しました:

db2 update db cfg for <db> using SELF_TUNING_MEM ON
db2 update db cfg for <db> using DATABASE_MEMORY AUTOMATIC
db2 update db cfg for <db> using SORTHEAP AUTOMATIC
db2 update db cfg for <db> using SHEAPTHRES_SHR AUTOMATIC
db2 connect reset
db2 connect to <db>

SEL_TUNING_MEMORYがアクティブであることを確認しました:

db2 get db cfg for <db> show detail | grep SELF

しかし、私はまだ同じ問題が発生します。

データベース(つまり、すべてのメモリ設定)を復元した後、簡単なテストを行いました。

~]$ cat test.sh 
#!/bin/sh

OPTS=`getopt -o d:u:p: -- "$@"`
eval set -- "$OPTS"

user=""
passwd=""
while true ; do
    case "$1" in
        -d) db="$2"; shift 2;;
        -u) user="$2"; shift 2;;
        -p) passwd="$2"; shift 2;;
        --) shift; break;;
    esac
done

db2 connect to $db user $user using $passwd
if [ $? -ne 0 ]; then
    exit 1
fi

db2diag -A

db2 +c -td@ "BEGIN
  DECLARE EXIT HANDLER FOR SQLWARNING
    SIGNAL SQLSTATE '75001' SET MESSAGE_TEXT = 'The bufferpool BP8K is not allocated';

  EXECUTE IMMEDIATE 'CREATE BUFFERPOOL BP8K SIZE AUTOMATIC PAGESIZE 8K';
END
@"

db2 +c -td@ "BEGIN
  DECLARE EXIT HANDLER FOR SQLWARNING
    SIGNAL SQLSTATE '75001' SET MESSAGE_TEXT = 'The bufferpool BP8K is not allocated';

  EXECUTE IMMEDIATE 'CREATE LARGE TABLESPACE TBSPC8K PAGESIZE 8K MANAGED BY AUTOMATIC STORAGE BUFFERPOOL BP8K';
END
"

db2 +c -td@ "BEGIN
  DECLARE EXIT HANDLER FOR SQLWARNING
    SIGNAL SQLSTATE '75001' SET MESSAGE_TEXT = 'The bufferpool BP8K is not allocated';

  EXECUTE IMMEDIATE 'COMMIT';
END
"

db2diag -A

次に、このテストを実行しました。

db2diag: Moving "/opt/nya/users/db2inst1/sqllib/db2dump/DIAG0000/db2diag.log"
         to     "/opt/nya/users/db2inst1/sqllib/db2dump/DIAG0000/db2diag.log_2020-03-28-12.20.57"

DB20000I  The SQL command completed successfully.
DB20000I  The SQL command completed successfully.
DB20000I  The SQL command completed successfully.
db2diag: Moving "/opt/nya/users/db2inst1/sqllib/db2dump/DIAG0000/db2diag.log"
         to     "/opt/nya/users/db2inst1/sqllib/db2dump/DIAG0000/db2diag.log_2020-03-28-12.20.57"

したがって、3つのSQLステートメントはすべて成功しましたが、diaglogで次のことがわかります。

2020-03-28-12.20.57.162214+060 I1800E409             LEVEL: Event
PID     : 5301                 TID : 140165787223936 PROC : db2diag
INSTANCE: db2inst1             NODE : 000
HOSTNAME: gollum
FUNCTION: DB2 UDB, RAS/PD component, pdDiagArchiveDiagnosticLog, probe:88
CREATE  : DB2DIAG.LOG ARCHIVE : /opt/nya/users/db2inst1/sqllib/db2dump/DIAG0000/db2diag.log_2020-03-28-12.20.57 : success
IMPACT  : Potential

2020-03-28-12.20.57.228408+060 E2210E868             LEVEL: Warning
PID     : 17468                TID : 140189351536384 PROC : db2sysc 0
INSTANCE: db2inst1             NODE : 000            DB   : STUDERA
APPHDL  : 0-637                APPID: *LOCAL.db2inst1.200328112127
UOWID   : 1                    ACTID: 4
AUTHID  : DB2INST1             HOSTNAME: gollum
EDUID   : 2442                 EDUNAME: db2agent (STUDERA) 0
FUNCTION: DB2 UDB, buffer pool services, sqlbAssignBufferPool, probe:2
MESSAGE : ADM6073W  The table space "TBSPC8K" (ID "9") is configured to use 
          buffer pool ID "3", but this buffer pool is not active at this time. 
          In the interim the table space will use buffer pool ID "4097".  The 
          inactive buffer pool should become available at next database startup 
          provided that the required memory is available.

2020-03-28-12.20.57.272773+060 I3079E557             LEVEL: Info
PID     : 17468                TID : 140189351536384 PROC : db2sysc 0
INSTANCE: db2inst1             NODE : 000            DB   : STUDERA
APPHDL  : 0-637                APPID: *LOCAL.db2inst1.200328112127
UOWID   : 1                    ACTID: 5
AUTHID  : DB2INST1             HOSTNAME: gollum
EDUID   : 2442                 EDUNAME: db2agent (STUDERA) 0
FUNCTION: DB2 UDB, buffer pool services, sqlbCreateBufferPoolAct, probe:98
MESSAGE : Creating bufferpool "BP8K" Size: "1000"  <automatic>

結論として、バッファプールが開始されているかどうかを検出する方法についての手がかりはありません。

test.sh(および私の元のスクリプト)の各ステートメントのコミットは成功し、diaglogにエントリがありません。これで問題は解決したようですが、バッファプールの作成後に遅延を追加しました:

CREATE BUFFERPOOL BP8K SIZE AUTOMATIC PAGESIZE 8K @

-- delay commit
BEGIN
    DECLARE now TIMESTAMP;
    DECLARE end TIMESTAMP;
    SET now = TIMESTAMP(GENERATE_UNIQUE());
    SET end = now + 5 seconds;
    WHILE (now < end) DO
        SET now = TIMESTAMP(GENERATE_UNIQUE());
    END WHILE;
END @

これは私のラボマシンで、他にほとんどアクティビティはありません。

2
Lennart

db2stop/db2startは、新しく作成されたバッファプールを使用可能にする必要はありませんが、ほとんどの場合、テーブルスペースが新しいバッファプールを使用できるようにするには、データベースを非アクティブ化および再アクティブ化する必要があります。

これは IMMEDIATEオプションが指定されているか、暗黙的に想定されている場合でも であるためです。

データベースの共有メモリに新しいバッファプールを割り当てるのに十分な予約スペースがない場合(SQLSTATE 01657)、ステートメントはDEFERREDとして実行されます。

有効なさまざまなメモリ構成パラメータ、特に database_memory 、新しいバッファプールをすぐに割り当てるのに十分なメモリがデータベースマネージャによって予約されていない可能性があります。

タイミングの問題もある可能性があります。これは、後で質問に追加された診断ログフラグメントから明らかです。バッファスペースが正常に割り当てられる前に、テーブルスペースの作成が(警告付きで)発生していることがわかります。 BPに新しい共有メモリが割り当てられるまでしばらく時間がかかります。データベースマネージャーは「メモリウォーク」を実行し、その中のすべてのページにアクセスして、オペレーティングシステムによってコミットされていることを確認します。間の一時停止の紹介create bufferpoolおよびcreate tablespaceが問題を解決する可能性があります。

3
mustaccio

SQLCODE = 20189の後に、可能なSQLSTATE = '01657'CREATE BUFFERPOOL)メッセージを処理する必要があります。
対応するメッセージは次のようになります。

db2 "create bufferpool BP8K SIZE XXXXXX"

SQL20189W  The buffer pool operation (CREATE/ALTER) will not take effect until
the next database startup due to insufficient memory.  SQLSTATE=01657

対応するdb2diag.logメッセージ:

2020-03-27-17.35.31.377000+180 E6844329F842         LEVEL: Warning
PID     : 7260                 TID : 1612           PROC : db2syscs.exe
INSTANCE: DB2                  NODE : 000           DB   : SAMPLE
APPHDL  : 0-146                APPID: *LOCAL.DB2.200317091324
UOWID   : 12                   ACTID: 1
AUTHID  : DB2ADMIN             HOSTNAME: xxx
EDUID   : 1612                 EDUNAME: db2agent (SAMPLE)
FUNCTION: DB2 UDB, buffer pool services, sqlbCreateBufferPool, probe:5655
MESSAGE : ADM6053W  The CREATE BUFFERPOOL statement for buffer pool "BP8K" (ID
          "3") could not be performed immediately because not enough free
          memory existed in the database shared memory.  The bufferpool will be
          created on the next database restart.  Refer to the documentation for
          SQLCODE 20189.

作成時にバッファプールを割り当てることができない場合は、sqlexceptionが発生する次のコマンドをお勧めします。

--#SET TERMINATOR @
BEGIN
  DECLARE EXIT HANDLER FOR SQLSTATE '01657'
    SIGNAL SQLSTATE '75001' SET MESSAGE_TEXT = 'The bufferpool BP8K is not allocated';

  -- EXECUTE IMMEDIATE 'CREATE BUFFERPOOL BP8K SIZE XXXXXX';
  -- Just for test:
  ---CALL SYSIBMINTERNAL.SQLEML_RAISE_ERROR(20189, NULL, NULL);
END
@
2
Mark Barinstein