注:此文章属原创,转载请注明出处,谢谢。
环境: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;