所谓数据库损坏也就是说数据库中的某些页面被损坏了。对于DB2而言,页面是操作系统分配的最小数据单元,它在主内存与任何其它辅助存储(比如硬盘驱动器)之间传输。坏页问题可能会对系统造成严重的性能冲击。在某些情况下,它可能会导致频繁的数据库宕机。
一、坏页的产生
数据库坏页可能在页面的写入、读取、存储、传输或处理过程中发生,这会向原始数据引入一些非计划中的更改。数据库坏页问题的一些常见原因:
文件系统的损坏。
硬件故障。
内存损坏。
DB2 BUG。
I/O和网络问题。
不正确的应用程序编码。
缓冲池 (sqldPage) 和文件系统中存储的页面的值不一致。
虽说损坏问题由各种原因而致,确切地查明是什么导致了数据损坏是极具挑战的。当 DB2检测到一个页面损坏时,它会停止所有处理,将数据库关闭,阻止进一步的数据损害或丢失。
二、坏页的类型
1.数据页面损坏
2017-03-14-10.13.05.261082-360 I3442A358 LEVEL: Error PID : 393470 TID : 1 PROC : db2pfchr 0 INSTANCE: inst1 NODE : 000 FUNCTION: DB2 UDB, buffer pool services, sqlbReadAndReleaseBuffers, probe:13 RETCODE : ZRC=0x86020001=-2046689279=SQLB_BADP "page is bad" DIA8400C A bad page was encountered. 2017-03-14-10.13.05.264301-360 I3801A437 LEVEL: Error PID : 393470 TID : 1 PROC : db2pfchr 0 INSTANCE: inst1 NODE : 000 FUNCTION: DB2 UDB, buffer pool services, sqlbReadAndReleaseBuffers, probe:13 DATA #1 : String, 158 bytes Obj={pool:9;obj:20;type:0} State=x27 Parent={9;20}, EM=1120, PP0=1152
如上错误消息所示,DB2 遇到了一个表空间 ID 为 9、表 ID 为 20 的坏页。坏页的对象类型被标记为0,表明有数据页面损坏。
可以通过查询目录表,确定哪个表有损坏的页面:
db2 "select char(tabname,30),char(tabschema,30) from syscat.tables where tableid=20 and tbspaceid=9";
2.索引页面损坏
2017-03-14-10.35.50.952434+000 I29308542A2532 LEVEL: Severe PID : 1175792 TID : 33926 PROC : db2sysc 0 INSTANCE: inst1 NODE : 000 DB : SAMPLE APPHDL : 0-7 APPID: *LOCAL.inst1.120130013528 AUTHID : TP0ADM EDUID : 33926 EDUNAME: db2redow (TP0) 0 FUNCTION: DB2 UDB, buffer pool services, sqlb_verify_page, probe:3 MESSAGE : ZRC=0x86020001=-2046689279=SQLB_BADP "page is bad" DIA8400C A bad page was encountered. DATA #1 : String, 64 bytes Error encountered trying to read a page - information follows : DATA #2 : String, 23 bytes Page verification error DATA #3 : Page ID, PD_TYPE_SQLB_PAGE_ID, 4 bytes 23046981 DATA #4 : Object descriptor, PD_TYPE_SQLB_OBJECT_DESC, 72 bytes Obj: {pool:9;obj:11076;type:1} Parent={8;11076}
如上错误消息所示,DB2 遇到了一个表空间中ID 为9,索引I