作为迁移的一部分,我创建了一个新的缓冲池--比如BP8K大小的8K,使用该bp创建了一个表空间,并在该表空间中创建了一个包含数据的表。然而,我得到了一个:
SQL1218N There are no pages currently available in bufferpool "4097"在这个过程中。从db2top的角度来看,似乎使用了默认的缓冲池IBMSYSTEMBP8K而不是BP8K,这就解释了这种现象。
当没有足够的共享内存启动缓冲池时,我也看到过类似的情况,但在本例中,BP8K同时出现在db2top和db2pd -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马克·巴恩斯坦帮助我确定缓冲区池毕竟没有启动:
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,所以我不知道为什么不能启动它。服务器上有大量可用内存,数据库使用的是~1.8Gb (主要是缓冲池)--我不知道为什么Db2不能启动新的缓冲池。我试图在bp,tbspace创建之后添加一个commit,但这并没有帮助。
现在的问题是:为什么Db2不能启动这个BP。根据医生们的说法:
如果有足够的内存可用,缓冲池可以立即激活。默认情况下,使用即时关键字创建新的缓冲池,并且在大多数平台上,数据库管理器能够获得更多的内存。
服务器上似乎有足够的内存可用。在创建新的表空间之前,数据库大致分配了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 using SELF_TUNING_MEM ON
db2 update db cfg for using DATABASE_MEMORY AUTOMATIC
db2 update db cfg for using SORTHEAP AUTOMATIC
db2 update db cfg for using SHEAPTHRES_SHR AUTOMATIC
db2 connect reset
db2 connect to 并检查SEL_TUNING_MEMORY是否处于活动状态:
db2 get db cfg for 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" 说到底,我不知道如何检测缓冲池是否已经启动。
在test.sh (以及我的原始脚本中)中提交每个语句,都会成功,而对角线日志中没有条目。尽管这似乎解决了问题,但在创建缓冲池之后,我还添加了一个延迟:
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 @这是我的实验室机器,上面几乎没有其他的活动。
发布于 2020-03-27 13:57:38
不需要db2stop/db2start来使新创建的缓冲池可用,但在大多数情况下,您必须禁用和重新激活数据库,以便表空间能够使用新的缓冲池。
如果数据库共享内存中没有足够的保留空间来分配新的缓冲池(SQLSTATE 01657),则语句将作为
DEFERRED执行。
根据有效的各种内存配置参数,特别是database_memory,数据库管理器可能没有足够的内存来立即分配新的缓冲池。
还有一个时间问题,从后来添加到问题中的诊断日志片段可以看出,在为其成功分配缓冲池之前,表空间的创建(带有警告)发生。为BP分配新的共享内存需要一段时间--数据库管理器进行“内存遍历”,访问其中的每个页面,以确保它是由操作系统提交的。在create bufferpool和create tablespace之间引入暂停可能会解决这个问题。
发布于 2020-03-27 13:52:25
您应该在SQLCODE = 20189之后处理可能的CREATE BUFFERPOOL (SQLSTATE = '01657')消息。相应的消息如下所示:
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
@https://dba.stackexchange.com/questions/262775
复制相似问题