【原创】DB2 表坏故障处理小记

注:此文章属原创,转载请注明出处,谢谢。 

 

环境:DB2 v9.7 , AIX 6.1

处理过程描述:

1. 机房停电后,服务器文件系统损坏;

2. 修复文件系统后,数据库不能正常启动;

3. 通过全备恢复(restore)后,能正常打开,数据库读写正常;但是业务一访问数据库,DB2实例就CRASH;

4. 通过创建一个新的实例,再恢复一个同名的数据库,故障依旧; ---- 排除了磁盘问题

5. 检查发现有两个主要业务表有报错; ---- 实际处理过程中共有4张表有问题

6. 通过全备重新恢复后,把故障表中的可用数据读出来进行备份(丢失少量数据,80条左右,记录丢失的记录的表中的ID信息)(此时故障表中的大部分数据可读取,只有几十条有问题的表中的记录的部分字段不可以读取,表中的有问题的记录的ID字段可读取);

7. 再重建故障表,然后从之前逻辑备份的数据中,根据丢失数据的ID记录来抽取数据恢复到业务表中

8. 数据恢复完成,业务恢复正常;

9. 运行观察后,发现还有一张包含大字段的表有报错;

10. 导出大字段的表数据,再重建该表,然后导入数据,修复完成;

11. 另外有一张短信表,完全不能读取数据,一读就报错,软件开发确认后,直接重建该表,故障解决。

 

 

部分日志:

1)、主要业务表报错:表空间5,表对象579

EDUID : 8858 EDUNAME: db2agent (DTGLDB) 0
FUNCTION: DB2 UDB, data management, sqldReadRow, probe:3046
MESSAGE : ADM6007C DB2 detected an error while processing page "508" from
table space "5" for object "579" of object type "0".

 

通过上述信息,可以查询表名称、schema信息和表类型:

SELECT TABSCHEMA,tabname,owner,type FROM SYSCAT.TABLES WHERE TBSPACEID = 5 AND TABLEID = 579 

  

2)、大字段表报错:

FUNCTION: DB2 UDB, data management, sqldRowInsert, probe:871
RETCODE : ZRC=0x87480001=-2025324543=SQLDXE_BADPAGE "Bad LOB Page"
DIA8500C A data file error has occurred, record id is "".

 

3)、短信表报错:

FUNCTION: DB2 UDB, buffer pool services, sqlbCleanupBeforeTerm, probe:837
MESSAGE : ZRC=0x8602001A=-2046689254=SQLB_BADD "Bad Database, Can't flush"
DIA8427C The database has been marked as being damaged.
DATA #1 : String, 48 bytes
A portion of SQLB termination processing failed.


FUNCTION: DB2 UDB, buffer pool services, sqlbErrorHandler, probe:0
DATA #1 : String, 107 bytes
Obj={pool:5;obj:14;type:0} State=x27 Parent={5;14}, EM=435552, PP0=0
Prefetcher Error, in sqlbProcessRange

其中pool为表空间,obj为表,type为对象类型,0为数据表

查询表信息:

SELECT TABSCHEMA,tabname,owner,type FROM SYSCAT.TABLES WHERE TBSPACEID = 5 AND TABLEID = 14 

 

其它命令:

1)、查看表DDL信息

db2look -d DBNAME -t "TABLE1" -a -e -l -x -c ; ---- 不包含更新统计信息语句


2)、导出大字段表到服务器中

db2 connect to dbname user user1 using password
export to "USER1.TABLE1.exp.del" of del lobs to "/db2data/export/20171218.bak/" lobfile lob_doc1 modified by lobsinfile messages USER1.TABLE1.exp.del.msg select * from TABLE1


3)、导入命令

db2 connect to dbname user user1 using password
db2 import from "USER1.TABLE1.exp.del" of del lobs from "/db2data/export/20171218.bak/" modified by lobsinfile replace into TABLE1

 

4)、修改表序列

ALTER TABLE "USER1"."TABLE1" ALTER COLUMN "FILEID" RESTART WITH 90000

 

5)、授予DBA角色
# su - db2inst1
CONNECT TO DBNAME;
GRANT DBADM,SECADM ON DATABASE TO USER DB2INST2; ---- 授予 dba 和安全管理员角色
CONNECT RESET;

 

转载于:https://www.cnblogs.com/fengaix6/p/8183765.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值