未使用新的緩衝池
作為遷移的一部分,我創建了一個新的緩衝池——比如 BP8K——大小為 8K,以及一個使用該 bp 的表空間,以及該表空間中的一個表,該表載入了數據。但是,我得到一個:
SQL1218N There are no pages currently available in bufferpool "4097"
在那個過程中。看起來
db2top
好像使用預設緩衝池 IBMSYSTEMBP8K 而不是 BP8K 來解釋這種現象。當沒有足夠的共享記憶體來啟動緩衝池時,我也看到過類似的情況,但在這種情況下,BP8K 會同時出現在
db2top
, 和db2pd -d ... -bufferpools
. 也可以更改 bp 的大小,在記憶體不足的情況下,通常會導致緩衝池未啟動的警告。A
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 Barinstein幫我確定緩衝池畢竟沒有啟動:
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
不需要使新創建的緩衝池可用,但在大多數情況下,您必須停用並重新啟動數據庫以使表空間能夠使用新的緩衝池。如果數據庫共享記憶體中沒有足夠的保留空間來分配新的緩衝池(SQLSTATE 01657),則語句將執行為
DEFERRED
.取決於有效的各種記憶體配置參數,特別
database_memory
是數據庫管理器保留的記憶體可能不足以立即分配新的緩衝池。還可能存在時間問題,這從稍後添加到問題的診斷日誌片段中可以明顯看出,其中可以看到在成功分配緩衝池之前發生表空間創建(帶有警告)。為 BP 分配新的共享記憶體需要一些時間——數據庫管理器執行“記憶體漫遊”,訪問其中的每個頁面以確保它已由作業系統送出。
create bufferpool
在和之間引入暫停create tablespace
可能會解決問題。