作为迁移的一部分,我创建了一个新的缓冲池——比如 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 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
不需要使新创建的缓冲池可用,但在大多数情况下,您必须停用并重新激活数据库才能使表空间能够使用新的缓冲池。这是因为,即使
IMMEDIATE
选项被指定或隐含假设取决于有效的各种内存配置参数,特别
database_memory
是数据库管理器保留的内存可能不足以立即分配新的缓冲池。还可能存在时间问题,这从稍后添加到问题的诊断日志片段中可以明显看出,其中可以看到在成功分配缓冲池之前发生表空间创建(带有警告)。为 BP 分配新的共享内存需要一些时间——数据库管理器执行“内存漫游”,访问其中的每个页面以确保它已由操作系统提交。
create bufferpool
在和之间引入暂停create tablespace
可能会解决问题。您应该在 之后处理可能的
SQLCODE = 20189
(SQLSTATE = '01657'
) 消息CREATE BUFFERPOOL
。相应的消息如下所示:
相应的 db2diag.log 消息:
如果在创建时无法分配缓冲池,我可能会为此建议使用以下命令,这会引发 sqlexception。