问题:
对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,以保证数据库的启动.但是后续的应用会出现很多问题.