解决db2 bufferpool不足的问题

问题:

     对Mars服务端程序同时开10个用户用复杂的XQuery语句查询,出错。
--CLI ERROR-------------
  cliRC = -1
  line  = 806
  file  = dbapi.c

 SQLSTATE     = 57011
 Native Error Code = -1218
[IBM][CLI Driver][DB2/LINUXX8664] SQL1218N  There are no pages currently available in bufferpool "4096".  SQLSTATE=57011

 

解决思路:

      调整buffpool的大小

 

解决方法:

         1> 启动数据库 
             db2inst1@mars: db2start
           启动db2命令行 
             db2inst1@mars:db2


        2>  连接数据库
              db2 =>connect to test

 

         3>  修改buffer pool


             检查当前数据库已有的buffer pool
             db2=>select * from syscat.bufferpools 
              结果显示系统存在默认的bufferpool   IBMDEFAULTBP, 大小为4K(1*4096),这个数值明显太小;


             直接修改IBMDEFAULTBP的大小:
               db2 =>alter bufferpool IBMDEFAULTBP immediate size 50000
               现在bufferpool的大小为200M(50000*4096) ,可以满足当前应用需求。

 

        4> 重启数据库管理程序
               db2inst1@mars: db2stop force
               db2inst1@mars: db2start

 

 

参考资料:  Beginning DB2 From Novice to Professional 第十八章


-------

------

但是也有可能遇到这样的问题:不管设置bufferbool多大都说无页面可用,即使重启服务器后还是出现这个错误!!!!


"SQL1218N 在缓冲池 4096 中当前没有任何页面可用"问题的解决(由于隐藏的buffer引发的血案)

1.报错信息:SQL1218N 在缓冲池 4096 中当前没有任何页面可用(表面上看是4k的buffer不足,调大后错误仍然存在)

2.经定位后找到原因:由于自定义的表空间过大初始化失败.

(1)使用db2diag -time 2011-05-18找到的错误信息:

      db2 will use buffer pool ID "4096" 2011-05-18-20.03.01.859000+480 E10001937H805 LEVEL: Warning PID : 9544 TID : 9492 PROC : db2syscs.exe INSTANCE: DB2 NODE : 000 DB : EDW_BACK APPHDL : 0-7 APPID: *LOCAL.DB2.110518120300 AUTHID : EDWDATA EDUID : 9492 EDUNAME: db2agent (EDW_BACK) 0 FUNCTION: DB2 UDB, buffer pool services, sqlbStartPools, probe:2 MESSAGE : ADM6073W The table space "SYSTOOLSTMPSPACE" (ID "9") is configured to use buffer pool ID "1", but this buffer pool is not active at this time. In the interim the table space will use buffer pool ID "4096". The inactive buffer pool should become available at next database startup provided that the required memory is available.

 (2)另外察看buffer的使用情况,也没有自己定义的buffer 
     update monitor switches using bufferpool on 
     db2 get snapshot for bufferpools on edw

 

3.最终导致的错误:buffer不足。(因为db2隐藏的buffer很小,只有16个页面,导致不够用)

2011-05-18-20.03.14.593000+480 E10004447H557 LEVEL: Error PID : 9544 TID : 588 PROC : db2syscs.exe INSTANCE: DB2 NODE : 000 DB : EDW_BACK APPHDL : 0-11 APPID: *LOCAL.DB2.110518120312 AUTHID : EDWDATA EDUID : 588 EDUNAME: db2agent (EDW_BACK) 0 FUNCTION: DB2 UDB, Common Trace API, sqlbFreeUpSlot, probe:122 MESSAGE : ADM6019E All pages in buffer pool "IBMSYSTEMBP4K" (ID "4096") are in use. Refer to the documentation for SQLCODE -1218.

 

4.隐藏的buffer: IBMSYSTEMBP4K IBMSYSTEMBP8K IBMSYSTEMBP16K IBMSYSTEMBP32K 只有在buffer pool initialization failed时才使用这些buffer

2011-05-18-20.03.02.125000+480 I10003780H665 LEVEL: Warning PID : 9544 TID : 9492 PROC : db2syscs.exe INSTANCE: DB2 NODE : 000 DB : EDW_BACK APPHDL : 0-7 APPID: *LOCAL.DB2.110518120300 AUTHID : EDWDATA EDUID : 9492 EDUNAME: db2agent (EDW_BACK) 0 FUNCTION: DB2 UDB, Self tuning memory manager, stmmStartSTMMIfNecessary, probe:490 MESSAGE : ZRC=0x87AE015F=-2018639521=STMM_DAEMON_COULD_NOT_START "STMM Daemon could not be started" DATA #1 : String, 89 bytes The self tuning memory manager was not started because buffer pool initialization failed.

 

 5.解决方案:减小buffer的大小.

 

 6.问题的诱因:2011-05-18,由于机房的空调出现问题,导致这个主机重新启动.启动之后数据也正常启动(表面上看是正常启动,实际上错误日志里已经有了警告信息).另外在该主机上我们还部署了etl工具的agent上一周我们把agent的个数调大了,一直没有重新启动agent服务.这次的机器重启,引发了agent服务和db的资源争用,导致数据库表空间自定义的buffer初始化失败,系统使用隐藏的buffer,隐藏的buffer都比较小,所以报"缓冲池 4096 中当前没有任何页面可用"

 

7.总结:db2 vs oracle

 如果oracle的内存(sga+pga)初始化失败,会导致数据库启动失败.

 如果db2的内存初始化失败,会使用隐藏的buffer,以保证数据库的启动.但是后续的应用会出现很多问题.



你可能感兴趣的:(DB2@BK)