db2dart诊断数据页损坏问题

本文详细介绍了如何利用db2dart和inspect命令来诊断和修复DB2数据库中遇到的数据页损坏问题。通过分析db2diag.log文件中的错误信息,可以定位受损数据页的位置。对于轻微损坏,可以尝试系统命令检查硬件状态、重启数据库或从备份恢复。对于严重损坏导致无法连接的情况,推荐使用db2dart命令导出数据,或者在其他用户连接下使用inspect命令验证数据库完整性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

db2dart诊断数据页损坏问题

2009-06-18 09:26 牛新庄 清华大学出版社
《深入解析DB2--高级管理、内部体系结构与诊断案例》第9章高级诊断,本章介绍的工具有db2dart和inspect、db2pdcfg、db2trc、db2_call_stack和db2nstck,并结合这些工具给出了大量的诊断问题的实例。本节为大家介绍db2dart诊断数据页损坏问题。

AD:


9.1.4 db2dart诊断数据页损坏问题

下面我们讨论一个实际的案例,请看下面的db2diag.log文件:

 
  
  1. 2008-09-22-11.46.45.864000+480I805726H366LEVEL:Error
  2. PID:1860TID:2732PROC:db2syscs.exe
  3. INSTANCE:DB2INSTNODE:000
  4. FUNCTION:DB2UDB,bufferpoolservices,sqlbReadAndReleaseBuffers,probe:13
  5. RETCODE:ZRC=0x86020001=-2046689279=SQLB_BADP"pageisbad"
  6. DIA8400CAbadpagewasencountered.
  7. 2008-09-22-11.46.45.910000+480I806094H413LEVEL:Error
  8. PID:1860TID:2732PROC:db2syscs.exe
  9. INSTANCE:DB2INSTNODE:000
  10. FUNCTION:DB2UDB,bufferpoolservices,sqlbReadAndReleaseBuffers,probe:13
  11. DATA#1:String,126bytes
  12. Obj={pool:34;obj:6;type:0}State=x27Page=140354Cont=0Offset=140352
  13. BlkSize=12
  14. sqlbReadAndReleaseBufferserror:num-pages=8
  15. 2008-09-22-11.46.45.942000+480I806509H593LEVEL:Error
  16. PID:1860TID:2732PROC:db2syscs.exe
  17. INSTANCE:DB2INSTNODE:000
  18. MESSAGE:SQLB_OBJECT_DESC
  19. DATA#1:Hexdump,68bytes
  20. 0x04B6B5DC:220006002200060000000000003AA2A6"..."........:..
  21. 0x04B6B5EC:40E50000000000000000000000000000@...............
  22. 0x04B6B5FC:00000000010100002700000000000000........'.......
  23. 0x04B6B60C:00100000200000000100000022000600..........."...
  24. 0x04B6B61C:408C7400@.t.
  25. SQL1034CThedatabaseisdamaged.
  26. 2008-09-22-11.46.46.020000+480I807104H356LEVEL:Error
  27. PID:1860TID:2732PROC:db2syscs.exe
  28. INSTANCE:DB2INSTNODE:000
  29. FUNCTION:DB2UDB,bufferpoolservices,sqlbErrorHandler,probe:0
  30. RETCODE:ZRC=0x86020001=-2046689279=SQLB_BADP"pageisbad"
  31. DIA8400CAbadpagewasencountered.
  32. 2008-09-22-11.46.46.020000+480I807462H351LEVEL:Error
  33. PID:1860TID:2732PROC:db2syscs.exe
  34. INSTANCE:DB2INSTNODE:000
  35. FUNCTION:DB2UDB,bufferpoolservices,sqlbErrorHandler,probe:0
  36. DATA#1:String,75bytes
  37. Obj={pool:34;obj:6;type:0}State=x27
  38. --注:Obj={pool:34;obj:6;type:0}State=x27,"pool"指的表空间ID,"obj"指的
  39. 对象ID
  40. PrefetcherError,insqlbProcessRange
  41. 2008-09-22-11.46.46.020000+480I807815H593LEVEL:Error
  42. PID:1860TID:2732PROC:db2syscs.exe
  43. INSTANCE:DB2INSTNODE:000
  44. MESSAGE:SQLB_OBJECT_DESC
  45. DATA#1:Hexdump,68bytes
  46. 0x04B6B5DC:220006002200060000000000003AA2A6"..."........:..
  47. 0x04B6B5EC:40E50000000000000000000000000000@...............
  48. 0x04B6B5FC:00000000010100002700000000000000........'.......
  49. 0x04B6B60C:00100000200000000100000022000600..........."...
  50. 0x04B6B61C:408C7400@.t.

可以从系统表中读取判断是哪个表受到损坏。例如:

 
  
  1. selecttabnamefromsyscat.tableswheretbspaceid=34andtableid=6

数据库最严重的故障莫过于数据库损坏。从上面的例子来看,我们的数据库中有数据页受到损坏。出现SQL1034C错误时,我们首先执行操作系统命令。例如在AIX操作系统上,执行"errpt -d H -T PERM"命令来判断系统是否出现硬件损坏。然后尝试使用"db2 restart db sample"命令让数据库执行崩溃恢复。

如果上述办法不能解决问题,那么最好的办法是从备份恢复数据库。如果无法从备份恢复,那么可以根据损坏的原因尝试相应的解决方案。对于存储问题导致部分数据文件损坏,但是数据库还可以连接的情况,可以采用导出数据库的表结构和数据的方法来恢复数据库。当然对于损坏的表,导出是无法完成的。这时可以使用db2dart的导出数据功能来导出这些损坏的表的数据。如果数据库损坏到已经无法连接的程度,那么除了从备份恢复,唯一的办法就是使用db2dart来导出所有数据了。下面展示了使用db2dart命令时的提示信息:

 
  
  1. 运行命令db2dart[DBNAME] /DDEL
  2. #Tableobjectdataformattingstart.
  3. #Pleaseenter
  4. #TableIDorname,tablespaceID,firstpage,numofpages:
  5.  #(sufficpagenumberwith'p'forpoolrelative),
按照提示输入表名、表空间ID、起始页数、需要导出的页数。如果你的数据库非常大的话,这将是一个工作量非常大的事情。因此建议大家做好数据库备份。
inspect命令使用案例
2009-06-18 09:26 牛新庄 清华大学出版社
《深入解析DB2--高级管理、内部体系结构与诊断案例》第9章高级诊断,本章介绍的工具有db2dart和inspect、db2pdcfg、db2trc、db2_call_stack和db2nstck,并结合这些工具给出了大量的诊断问题的实例。本节为大家介绍inspect命令使用案例。

AD:


9.1.5 inspect命令使用案例

inspect命令类似于db2dart命令,它同样可以用来检查数据库、表空间和表。 inspect命令和db2dart命令的主要区别是:inspect命令需要与数据库连接,并且可以在该数据库上同时有多个活动的数据库连接时执行;而db2dart命令在执行之前需要断开所有数据库连接,数据库上不能有活动的数据库连接。

inspect命令可以在有其他用户连接的情况下验证数据库的完整性。例如,使用"db2 inspect check database results keep <filename>"命令可以验证整个数据库的完整性,具体语法如下所示:

 
    
  1. db2"inspectcheckdatabaseresultskeepinspect.rel"
  2. DB20000IINSPECT命令成功完成。

在Windows平台下,输出文件在"C:\IBM\SQLLIB\实例名"或DB2INSTPORF变量指定的目录下;在Linux/UNIX平台下,输出文件在"$INSTHOME/sqllib/db2dump"目录下。输出的文件需要由db2instpf命令进行格式化,db2instpf命令的语法是:

 
    
  1. db2inspf<datafile><outfile>

例如:

 
    
  1. db2inspfINSPECT.relINSPECT.out

执行inspect命令时还可以加很多参数,使用时可以执行"db2 ? inspect"查看详细的命令选项。下面我们举几个inspect的使用案例:

例如,如果希望只检查表空间2中的数据,可执行以下命令:

 
    
  1. db2"inspectchecktablespacetbspaceid2resultskeepinspect.rel"
  2. DB20000IINSPECT命令成功完成。

对数据库从表空间11对象2开始执行一致性检查,可执行以下命令:

 
    
  1. db2inspectcheckdatabasebeginTBSPACEID11OBJECTID2resultscheckts.out

产生的checkts.out报告的具体信息如下所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值