SQL1218N 错误处理记录(ADM6019E)

来源:互联网 发布:linux root登陆 编辑:程序博客网 时间:2024/06/03 16:56

f问题描述:
在对数据库进行操作时候,在SAP系统中经常报SQL1218N错误,导致程序运行失败。
问题分析:
SQL1218N错误为数据库缓冲池错误,详细错误信息如下:
D:>db2 ? sql1218n

SQL1218N在缓冲池 “<缓冲池号>” 中当前没有任何页面可用。
解释:
当前正在使用缓冲池中的所有页。请求使用另一个页面失败。
不能处理该语句。
用户响应:
缓冲池不是足够大,此时无法向所有数据库进程或线程提供页。缓冲池太小
,或者存在的活动进程或线程太多。
若再次执行,该语句可能成功。如果频繁发生此错误,则下列某些操作或所
有操作可能会防止进一步的故障:
1. 增加缓冲池大小
2. 减小数据库代理进程和/或连接的最大数目。
3. 减小最大并行度
4. 减小此缓冲池中表空间的预取大小。
5. 将某些表空间移到其它缓冲池中。
sqlcode : -1218
sqlstate : 57011
查看诊断日志db2diag.log ,发现如下错误信息:

2006-07-03-13.50.32.703000+480 E1021043H463 LEVEL: Error
PID : 4280 TID : 4316 PROC : db2syscs.exe
INSTANCE: DB2EGT NODE : 000 DB : EGT
APPHDL : 0-44 APPID: *LOCAL.DB2EGT.060701054858
FUNCTION: DB2 UDB, Common Trace API, sqlbFreeUpSlot, probe:122
MESSAGE : ADM6019E All pages in buffer pool “SAPBP32” (ID “2”) are in use.
Refer to the documentation for SQLCODE -1218.

2006-07-03-13.46.35.812000+480 E1016703H468 LEVEL: Error
PID : 4280 TID : 3204 PROC : db2syscs.exe
INSTANCE: DB2EGT NODE : 000 DB : EGT
APPHDL : 0-34 APPID: *LOCAL.DB2EGT.060701054848
FUNCTION: DB2 UDB, Common Trace API, sqlbFreeUpSlot, probe:122
MESSAGE : ADM6019E All pages in buffer pool “IBMDEFAULTBP” (ID “1”) are in use. Refer to the documentation for SQLCODE -1218.

根据日志中的错误信息,可以确定是IBMDEFAULTBP和SAPBP32两个缓冲池太小导致的错误。
通过快照监控Db2 get snapshot for bufferpools on egt >egt.txt
监控结果,发现IBMDEFAULTBP和SAPBP32 都只分配了16个页大小,检查缓冲池配置信息,IBMDEFAULTBP 的大小为64000页(1G)大小,sapbp32 为16000页(512M)大小。
因为缓冲池实际分配大小与缓冲池配置大小不一致,因此检查数据库注册表环境变量 DB2_OVERRIDE_BPF 值,发现此值的当前值为yes。
此值设为yes后,数据库将为每个缓冲池分配16个页大小,而覆盖数据库中为缓冲池设置的值。16页的缓冲池太小,不能满足表空间预取要求,因此报SQL1218N 错误。
问题解决:
解决此问题的方法有两个:
1. 重新设置注册表环境变量DB2_OVERRIDE_BPF 值,将此值设置为10000.以满足需要,设置后,要重新启动数据库。
Db2set DB2_OVERRIDE_BPF=10000
Db2stop
Db2start
2.去掉注册表环境变量DB2_OVERRIDE_BPF 值,在数据库中重新设置缓冲池大小。
Db2set DB2_OVERRIDE_BPF=
修改IBMDEFAULTBP和SAPBP32 缓冲池大小,在32位的数据库系统中,每个数据库所分配的缓冲池之和,一般不能超过1.25G。对于32位的数据库系统,如果想让数据库使用超过2G内存,可以考虑启用数据库的扩充存储段。
(目前在直接修改数据库缓冲池的时候,数据库重新启动时候,仍然存在一些问题,不能启动设置的缓冲池大小。只能为每个不同页大小的缓冲池,启用对应的隐藏缓冲池,造成此问题的原因还需要近一步检查,目前采用第一种方法解决此问题)。
总结:最好在一开始建库的时候设计好SAPBP32为自动扩展
db2 “alter bufferpool SAPBP32 size automatic”
其中SAPBP32缓冲池名称还有可能是不一样的,也许一开始没有注意到可能会导致数据库出现不能连接的情况,最后还是要看db2diag.log日志中的错误信息,再进行修改;DB2_OVERRIDE_BPF是当你的物理内存不足,无法启动数据库时,设置一下这个参数,可以让你的数据库在一个比较小的缓冲池(占用较小内存)的情况下启动。

0 0