所谓数据库损坏也就是说数据库中的某些页面被损坏了。对于DB2而言,页面是操作系统分配的最小数据单元,它在主内存与任何其它辅助存储(比如硬盘驱动器)之间传输。坏页问题可能会对系统造成严重的性能冲击。在某些情况下,它可能会导致频繁的数据库宕机。

一、坏页的产生

数据库坏页可能在页面的写入、读取、存储、传输或处理过程中发生,这会向原始数据引入一些非计划中的更改。数据库坏页问题的一些常见原因:

  1. 文件系统的损坏。

  2. 硬件故障。

  3. 内存损坏。

  4. DB2 BUG

  5. I/O和网络问题。

  6. 不正确的应用程序编码。

  7. 缓冲池      (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