首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有使用新的缓冲池

没有使用新的缓冲池
EN

Database Administration用户
提问于 2020-03-27 10:03:11
回答 2查看 1K关注 0票数 3

作为迁移的一部分,我创建了一个新的缓冲池--比如BP8K大小的8K,使用该bp创建了一个表空间,并在该表空间中创建了一个包含数据的表。然而,我得到了一个:

代码语言:javascript
复制
 SQL1218N There are no pages currently available in bufferpool "4097"

在这个过程中。从db2top的角度来看,似乎使用了默认的缓冲池IBMSYSTEMBP8K而不是BP8K,这就解释了这种现象。

当没有足够的共享内存启动缓冲池时,我也看到过类似的情况,但在本例中,BP8K同时出现在db2topdb2pd -d ... -bufferpools中。还可以更改bp的大小,在内存不足的情况下,通常会导致缓冲区池未启动的警告。

db2stop; db2start解决了这个问题,但这真的是必要的吗?迁移是一个从升级框架运行的sql脚本,所以我不想添加强制所有应用程序的钩子。有什么想法?

代码语言:javascript
复制
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

马克·巴恩斯坦帮助我确定缓冲区池毕竟没有启动:

代码语言:javascript
复制
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创建语句如下所示:

代码语言:javascript
复制
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

代码语言:javascript
复制
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是否处于活动状态:

代码语言:javascript
复制
db2 get db cfg for  show detail | grep SELF

但我还是遇到了同样的问题。

在还原数据库(即所有内存设置)之后,我做了一个小测试:

代码语言:javascript
复制
~]$ 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

然后我做了这个测试:

代码语言:javascript
复制
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中我发现:

代码语言:javascript
复制
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 (以及我的原始脚本中)中提交每个语句,都会成功,而对角线日志中没有条目。尽管这似乎解决了问题,但在创建缓冲池之后,我还添加了一个延迟:

代码语言:javascript
复制
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 @

这是我的实验室机器,上面几乎没有其他的活动。

EN

回答 2

Database Administration用户

回答已采纳

发布于 2020-03-27 13:57:38

不需要db2stop/db2start来使新创建的缓冲池可用,但在大多数情况下,您必须禁用和重新激活数据库,以便表空间能够使用新的缓冲池。

这是因为,即使IMMEDIATE选项被指定或隐式假定。

如果数据库共享内存中没有足够的保留空间来分配新的缓冲池(SQLSTATE 01657),则语句将作为DEFERRED执行。

根据有效的各种内存配置参数,特别是database_memory,数据库管理器可能没有足够的内存来立即分配新的缓冲池。

还有一个时间问题,从后来添加到问题中的诊断日志片段可以看出,在为其成功分配缓冲池之前,表空间的创建(带有警告)发生。为BP分配新的共享内存需要一段时间--数据库管理器进行“内存遍历”,访问其中的每个页面,以确保它是由操作系统提交的。在create bufferpoolcreate tablespace之间引入暂停可能会解决这个问题。

票数 4
EN

Database Administration用户

发布于 2020-03-27 13:52:25

您应该在SQLCODE = 20189之后处理可能的CREATE BUFFERPOOL (SQLSTATE = '01657')消息。相应的消息如下所示:

代码语言:javascript
复制
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消息:

代码语言:javascript
复制
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。

代码语言:javascript
复制
--#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
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/262775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档