AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 262775
Accepted
Lennart - Slava Ukraini
Lennart - Slava Ukraini
Asked: 2020-03-28 02:03:11 +0800 CST2020-03-28 02:03:11 +0800 CST 2020-03-28 02:03:11 +0800 CST

未使用新的缓冲池

  • 772

作为迁移的一部分,我创建了一个新的缓冲池——比如 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 @

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

db2 db2-luw
  • 2 2 个回答
  • 752 Views

2 个回答

  • Voted
  1. Best Answer
    mustaccio
    2020-03-28T05:57:38+08:002020-03-28T05:57:38+08:00

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

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

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

    取决于有效的各种内存配置参数,特别database_memory是数据库管理器保留的内存可能不足以立即分配新的缓冲池。

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

    • 4
  2. Mark Barinstein
    2020-03-28T05:52:25+08:002020-03-28T05:52:25+08:00

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

    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
    @
    
    • 2

相关问题

  • 从 DB2 迁移到 MySQL

  • 解释计划中的 TBSCAN GERROW 是什么意思?

  • 在 DB2 SQL 中模拟类似 REGEXP 的行为

  • z/OS 上 DB2 v9 上的 BLOB

  • 解释计划中的 HSJOIN 是什么意思?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve