Db2

未使用新的緩衝池

  • March 28, 2020

作為遷移的一部分,我創建了一個新的緩衝池——比如 BP8K——大小為 8K,以及一個使用該 bp 的表空間,以及該表空間中的一個表,該表載入了數據。但是,我得到一個:

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

在那個過程中。看起來db2top好像使用預設緩衝池 IBMSYSTEMBP8K 而不是 BP8K 來解釋這種現象。

當沒有足夠的共享記憶體來啟動緩衝池時,我也看到過類似的情況,但在這種情況下,BP8K 會同時出現在db2top, 和db2pd -d ... -bufferpools. 也可以更改 bp 的大小,在記憶體不足的情況下,通常會導致緩衝池未啟動的警告。

Adb2stop; 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".

大多數記憶體都設置為AUTOMATIC包括新的 BP,所以我不確定它為什麼無法啟動它。伺服器上有大量可用記憶體,並且 db 正在使用 ~1.8Gb(主要是緩衝池)所以我不確定為什麼 Db2 無法啟動新的緩衝池。我嘗試在創建 bp、tbspace 之後添加送出,但這沒有幫助。

現在問題變成了:為什麼 Db2 不能啟動這個 BP。根據文件

如果有足夠的可用記憶體,緩衝池可以立即變為活動狀態。預設情況下,使用 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 @

這是我的實驗室機器,上面幾乎沒有其他活動。

db2stop/db2start不需要使新創建的緩衝池可用,但在大多數情況下,您必須停用並重新啟動數據庫以使表空間能夠使用新的緩衝池。

這是因為,即使IMMEDIATE選項被指定或隱含假設

如果數據庫共享記憶體中沒有足夠的保留空間來分配新的緩衝池(SQLSTATE 01657),則語句將執行為DEFERRED.

取決於有效的各種記憶體配置參數,特別database_memory是數據庫管理器保留的記憶體可能不足以立即分配新的緩衝池。

還可能存在時間問題,這從稍後添加到問題的診斷日誌片段中可以明顯看出,其中可以看到在成功分配緩衝池之前發生表空間創建(帶有警告)。為 BP 分配新的共享記憶體需要一些時間——數據庫管理器執行“記憶體漫遊”,訪問其中的每個頁面以確保它已由作業系統送出。create bufferpool在和之間引入暫停create tablespace可能會解決問題。

引用自:https://dba.stackexchange.com/questions/262775