ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 坏块故障的恢复

坏块故障的恢复

原创 Linux操作系统 作者:shilei1 时间:2012-04-06 07:12:51 0 删除 编辑
 

完整的备份恢复策略是恢复坏块最有效的方法。备份恢复策略至少应该包括定期的数据库物理备份和日志归档。其中,归档日志还可以作为判别坏块产生原因的工具。
1、当出现坏块时,使用物理备份进行文件还原,在此文件基础上使用归档日志恢复至故障时间点。以Recovery Manager为例:
1)先offline受影响的数据文件,执行以下的语句:
ALTER DATABASE DATAFILE 'name_file' OFFLINE;
2)保留有坏块的数据文件,然后拷贝备份的数据文件。如果恢复的数据文件要求路径
不同,执行以下的语句:
ALTER DATABASE RENAME FILE 'old_name' TO 'new_name';
3)恢复数据文件,执行以下语句:
RECOVER DATAFILE 'name_of_file';
4) Online恢复后的数据文件,执行以下的语句:
ALTER DATABASE DATAFILE 'name_of_file' ONLINE;
2、在特定情况下(9i以上版本可用),还可以使用块级恢复,以加快恢复进程:
RMAN> blockrecover datafile n block nnnn;
3、通过ROWID RANGE SCAN保存数据
1)先取得坏块中ROW ID的最小值,执行以下的语句:
SELECT dbms_rowid.rowid_create(1,,,,0) from
DUAL;
2)取得坏块中的ROW ID的最大值,执行以下的语句:
SELECT dbms_rowid.rowid_create(1,,,+1,0) from
DUAL;
3)建议一个临时表存储那些没有坏块的数据,执行以下的语句:
CREATE TABLE salvage_table AS SELECT * FROM corrupt_tab Where 1=2;
4)保存那些不存在坏块的数据到临时表中,执行以下的语句:
INSERT INTO salvage_table SELECT /*+ ROWID(A) */ * FROM
A WHERE rowid < '';
INSERT INTO salvage_table SELECT /*+ ROWID(A) */ * FROM
A WHERE rowid >= '‘;
5)根据临时表中的数据重建表,重建表上的索引,限制。
4、使用10231诊断事件,在做全表扫描的时候跳过坏块
可以在session级别设定:
ALTER SESSION SET EVENTS '10231 TRACE NAME CONTEXT FOREVER,
LEVEL 10';
也可以在数据库级别上设定,在初始化参数中加入:event="10231 trace name
context forever, level 10",然后重启数据库。
然后从存在坏块的表中取出不存在坏块的数据,执行以下的语句:
CREATE TABLE salvage_emp AS SELECT * FROM corrupt_table;
最后rename生成的corrupt_table为原来表的名字,并重建表上的索引和限制。
5、使用dbms_repair包进行恢复
使用dbms_repair标记有坏块的表,在做全表扫描的时候跳过坏块,执行以下的
语句:
Execute
DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('','');
然后使用exp工具或者createtable as select的方法取出没有坏块数据,然后
重建表,表上的索引和限制。
6、UNDO表空间坏块
1) dump undoheader(如果数据库不能open用event 1015升成trace文件,本案例的情况)找到活动事务(状态为10)和对应的undo dba地址和使用的回滚段:
SQL>alter system dump undo header "_SYSSMU22$";
SQL>alter system dump undo header "_SYSSMU27$";
或者:
ALTER SYSTEM SET event="10015 trace name context forever, level 10"
SCOPE=SPFILE;
index state cflags wrap# uel scn dba
parent-xid nub
stmt_num
------------------------------------------------------------------------------------------------
0x11 10 0x90 0x5a1a0 0x0007 0x000b.4a936c82 0x0140d7bf
0x0000.000.00000000 0x00000001 0x00000000 0x0000
……
Recovering rollback segment _SYSSMU27$
Recovering rollback segment _SYSSMU22$
SQL> select dbms_utility.data_block_address_file(21026751) "file",
2 dbms_utility.data_block_address_block(21026751) "block"
3 from dual;
file block
---------- ----------
5 55231
2) dump回滚段内容得到相关活动事物对应的对象以便以后进行处理(也可以数据库启动后查询系统表来判断 select owner,segment_name from dba_segments where segment_name='PENDING_TRANS$';):
SQL> alter system dump datafile 5 block55231;
********************************************************************************
UNDO BLK:
xid: 0x0016.010.0005a635 seq: 0x3696 cnt: 0x42 irb: 0x42 icl: 0x0 flg: 0x0000
*-----------------------------
* Rec #0x42 slt: 0x10 objn: 17674(0x0000450a) objd: 17674 tblspc: 12(0x0000000c)
* Layer: 10 (Index) opc: 22 rci 0x41
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
3) 设置隐含参数跳过相应回滚段:
_offline_rollback_segments= _SYSSMU22$, _SYSSMU27$
4)启动数据库,删除offline的回滚段并处理活动事物对应的对象:
drop rollback segemnt "_SYSSMU22$";
drop rollback segemnt "_SYSSMU27$";
处理活动事务相关的对象(rebuild index,exchange partition,drop
table)等。

在没有完整备份恢复策略的情况下,可以使用应急手段进行恢复,但过程较为
复杂且风险较大。
完整备份恢复策略需要合理规划和相应的资源投入。

总结

数据库坏块问题原因复杂,破坏性大。但完整的备份恢复策略,经常性的检查,有效的故障识别以及对应的恢复手段,可以帮助用户最大限度的应对数据库坏块问题所带来的风险。



RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: backup plus archivelog 命令 (在 01/09/2012 00:06:50 上) 失败
ORA-19501: 文件 "E:\ORACLEDB\JSFC\STIMGDB_SPACE04_03", 块编号 806081 读错误 (块大小 = 8192)
ORA-27070: 异步读取/写入失败
OSD-04006: ReadFile() 失败, 无法读取文件
O/S-Error: (OS 23) 数据错误(循环冗余检查)。


恢复管理器: Release 10.2.0.1.0 - Production on 星期三 1月 4 20:07:13 2012

Copyright (c) 1982, 2005, Oracle. All rights reserved.

# -----------------------------------------------------------------
# RMAN command section
# -----------------------------------------------------------------
RUN {
ALLOCATE CHANNEL ch0
TYPE 'SBT_TAPE';
SEND 'BSA_SERVICE_HOST=192.168.3.2,NBBSA_TOTAL_STREAMS=1,NBBSA_JOB_COOKIE={62453847-EF42-47BD-AD3D-7BF071E4364F},NBBSA_DB_DEVICE_NAME=Oracle-Win::\\JSFGCDB\JSFC';
BACKUP
INCREMENTAL LEVEL=0
FORMAT 'BE_U'
DATABASE FORCE PLUS ARCHIVELOG FORCE NOT BACKED UP DELETE INPUT;
BACKUP CURRENT CONTROLFILE
FORMAT 'BE_U';
RELEASE CHANNEL ch0;
}
连接到目标数据库: JSFC (DBID=2844383025)

使用目标数据库控制文件替代恢复目录
分配的通道: ch0
通道 ch0: sid=113 devtype=SBT_TAPE
通道ch0: Symantec/BackupExec/1.1.0

向通道发命令: ch0


启动 backup 于 04-1月 -12
当前日志已存档
通道 ch0: 正在启动存档日志备份集
通道 ch0: 正在指定备份集中的存档日志
输入存档日志线程 =1 序列 =21350 记录 ID=18583 时间戳=771656434
输入存档日志线程 =1 序列 =21351 记录 ID=18584 时间戳=771671796
输入存档日志线程 =1 序列 =21352 记录 ID=18585 时间戳=771671799
输入存档日志线程 =1 序列 =21353 记录 ID=18586 时间戳=771672699
输入存档日志线程 =1 序列 =21354 记录 ID=18587 时间戳=771672942
输入存档日志线程 =1 序列 =21355 记录 ID=18588 时间戳=771673128
输入存档日志线程 =1 序列 =21356 记录 ID=18589 时间戳=771673565
输入存档日志线程 =1 序列 =21357 记录 ID=18590 时间戳=771673822
输入存档日志线程 =1 序列 =21358 记录 ID=18591 时间戳=771674062
输入存档日志线程 =1 序列 =21359 记录 ID=18592 时间戳=771674341
输入存档日志线程 =1 序列 =21360 记录 ID=18593 时间戳=771675655
输入存档日志线程 =1 序列 =21361 记录 ID=18594 时间戳=771688254
输入存档日志线程 =1 序列 =21362 记录 ID=18595 时间戳=771689169
输入存档日志线程 =1 序列 =21363 记录 ID=18596 时间戳=771689389
输入存档日志线程 =1 序列 =21364 记录 ID=18597 时间戳=771690052
输入存档日志线程 =1 序列 =21365 记录 ID=18598 时间戳=771690933
输入存档日志线程 =1 序列 =21366 记录 ID=18599 时间戳=771691244
输入存档日志线程 =1 序列 =21367 记录 ID=18600 时间戳=771691704
输入存档日志线程 =1 序列 =21368 记录 ID=18601 时间戳=771691912
输入存档日志线程 =1 序列 =21369 记录 ID=18602 时间戳=771691917
输入存档日志线程 =1 序列 =21370 记录 ID=18603 时间戳=771692285
输入存档日志线程 =1 序列 =21371 记录 ID=18604 时间戳=771692288
输入存档日志线程 =1 序列 =21372 记录 ID=18605 时间戳=771692780
输入存档日志线程 =1 序列 =21373 记录 ID=18606 时间戳=771692785
输入存档日志线程 =1 序列 =21374 记录 ID=18607 时间戳=771693078
输入存档日志线程 =1 序列 =21375 记录 ID=18608 时间戳=771693397
输入存档日志线程 =1 序列 =21376 记录 ID=18609 时间戳=771693726
输入存档日志线程 =1 序列 =21377 记录 ID=18610 时间戳=771693730
输入存档日志线程 =1 序列 =21378 记录 ID=18611 时间戳=771694148
输入存档日志线程 =1 序列 =21379 记录 ID=18612 时间戳=771696886
输入存档日志线程 =1 序列 =21380 记录 ID=18613 时间戳=771710835
通道 ch0: 正在启动段 1 于 04-1月 -12
通道 ch0: 已完成段 1 于 04-1月 -12
段句柄=BE_r9mvunrk_1_1 标记=TAG20120104T200715 注释=API Version 2.0,MMS Version 1.1.0.0
通道 ch0: 备份集已完成, 经过时间:00:02:36
通道 ch0: 正在删除存档日志
存档日志文件名 =E:\ARCH\ARC21350_0683057395.001 记录 ID=18583 时间戳 =771656434
存档日志文件名 =E:\ARCH\ARC21351_0683057395.001 记录 ID=18584 时间戳 =771671796
存档日志文件名 =E:\ARCH\ARC21352_0683057395.001 记录 ID=18585 时间戳 =771671799
存档日志文件名 =E:\ARCH\ARC21353_0683057395.001 记录 ID=18586 时间戳 =771672699
存档日志文件名 =E:\ARCH\ARC21354_0683057395.001 记录 ID=18587 时间戳 =771672942
存档日志文件名 =E:\ARCH\ARC21355_0683057395.001 记录 ID=18588 时间戳 =771673128
存档日志文件名 =E:\ARCH\ARC21356_0683057395.001 记录 ID=18589 时间戳 =771673565
存档日志文件名 =E:\ARCH\ARC21357_0683057395.001 记录 ID=18590 时间戳 =771673822
存档日志文件名 =E:\ARCH\ARC21358_0683057395.001 记录 ID=18591 时间戳 =771674062
存档日志文件名 =E:\ARCH\ARC21359_0683057395.001 记录 ID=18592 时间戳 =771674341
存档日志文件名 =E:\ARCH\ARC21360_0683057395.001 记录 ID=18593 时间戳 =771675655
存档日志文件名 =E:\ARCH\ARC21361_0683057395.001 记录 ID=18594 时间戳 =771688254
存档日志文件名 =E:\ARCH\ARC21362_0683057395.001 记录 ID=18595 时间戳 =771689169
存档日志文件名 =E:\ARCH\ARC21363_0683057395.001 记录 ID=18596 时间戳 =771689389
存档日志文件名 =E:\ARCH\ARC21364_0683057395.001 记录 ID=18597 时间戳 =771690052
存档日志文件名 =E:\ARCH\ARC21365_0683057395.001 记录 ID=18598 时间戳 =771690933
存档日志文件名 =E:\ARCH\ARC21366_0683057395.001 记录 ID=18599 时间戳 =771691244
存档日志文件名 =E:\ARCH\ARC21367_0683057395.001 记录 ID=18600 时间戳 =771691704
存档日志文件名 =E:\ARCH\ARC21368_0683057395.001 记录 ID=18601 时间戳 =771691912
存档日志文件名 =E:\ARCH\ARC21369_0683057395.001 记录 ID=18602 时间戳 =771691917
存档日志文件名 =E:\ARCH\ARC21370_0683057395.001 记录 ID=18603 时间戳 =771692285
存档日志文件名 =E:\ARCH\ARC21371_0683057395.001 记录 ID=18604 时间戳 =771692288
存档日志文件名 =E:\ARCH\ARC21372_0683057395.001 记录 ID=18605 时间戳 =771692780
存档日志文件名 =E:\ARCH\ARC21373_0683057395.001 记录 ID=18606 时间戳 =771692785
存档日志文件名 =E:\ARCH\ARC21374_0683057395.001 记录 ID=18607 时间戳 =771693078
存档日志文件名 =E:\ARCH\ARC21375_0683057395.001 记录 ID=18608 时间戳 =771693397
存档日志文件名 =E:\ARCH\ARC21376_0683057395.001 记录 ID=18609 时间戳 =771693726
存档日志文件名 =E:\ARCH\ARC21377_0683057395.001 记录 ID=18610 时间戳 =771693730
存档日志文件名 =E:\ARCH\ARC21378_0683057395.001 记录 ID=18611 时间戳 =771694148
存档日志文件名 =E:\ARCH\ARC21379_0683057395.001 记录 ID=18612 时间戳 =771696886
存档日志文件名 =E:\ARCH\ARC21380_0683057395.001 记录 ID=18613 时间戳 =771710835
完成 backup 于 04-1月 -12

启动 backup 于 04-1月 -12
通道 ch0: 启动增量级别 0 数据文件备份集
通道 ch0: 正在指定备份集中的数据文件
输入数据文件 fno=00047 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE08_04
输入数据文件 fno=00021 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE03_03
输入数据文件 fno=00046 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE08_03
输入数据文件 fno=00048 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE08_05
输入数据文件 fno=00022 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE03_04
输入数据文件 fno=00040 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE07_02
输入数据文件 fno=00039 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE07_01
输入数据文件 fno=00020 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE03_02
输入数据文件 fno=00025 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE04_02
输入数据文件 fno=00030 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE05_02
输入数据文件 fno=00034 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE06_01
输入数据文件 fno=00036 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE06_03
输入数据文件 fno=00037 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE06_04
输入数据文件 fno=00038 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE06_05
输入数据文件 fno=00041 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE07_03
输入数据文件 fno=00031 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE05_03
输入数据文件 fno=00033 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE05_05
输入数据文件 fno=00035 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE06_02
输入数据文件 fno=00019 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE03_01
输入数据文件 fno=00026 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE04_03
输入数据文件 fno=00027 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE04_04
输入数据文件 fno=00042 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE07_04
输入数据文件 fno=00043 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE07_05
输入数据文件 fno=00044 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE08_01
输入数据文件 fno=00045 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE08_02
输入数据文件 fno=00023 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE03_05
输入数据文件 fno=00032 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE05_04
输入数据文件 fno=00024 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE04_01
输入数据文件 fno=00028 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE04_05
输入数据文件 fno=00029 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE05_01
输入数据文件 fno=00057 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE10_04
输入数据文件 fno=00009 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE01_01
输入数据文件 fno=00013 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE01_05
输入数据文件 fno=00016 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE02_03
输入数据文件 fno=00050 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE09_02
输入数据文件 fno=00051 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE09_03
输入数据文件 fno=00056 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE10_03
输入数据文件 fno=00015 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE02_02
输入数据文件 fno=00017 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE02_04
输入数据文件 fno=00052 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE09_04
输入数据文件 fno=00014 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE02_01
输入数据文件 fno=00049 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE09_01
输入数据文件 fno=00058 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE10_05
输入数据文件 fno=00010 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE01_02
输入数据文件 fno=00011 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE01_03
输入数据文件 fno=00012 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE01_04
输入数据文件 fno=00018 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE02_05
输入数据文件 fno=00053 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE09_05
输入数据文件 fno=00054 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE10_01
输入数据文件 fno=00055 name=E:\ORACLEDB\JSFC\STIMGDB_SPACE10_02
输入数据文件 fno=00002 name=E:\ORACLEDB\JSFC\UNDOTBS01.DBF
输入数据文件 fno=00006 name=E:\ORACLEDB\JSFC\STDOCDB
输入数据文件 fno=00008 name=E:\ORACLEDB\JSFC\STSDEDB
输入数据文件 fno=00001 name=E:\ORACLEDB\JSFC\SYSTEM01.DBF
输入数据文件 fno=00003 name=E:\ORACLEDB\JSFC\SYSAUX01.DBF
输入数据文件 fno=00007 name=E:\ORACLEDB\JSFC\STIMGDB
输入数据文件 fno=00059 name=E:\ORACLEDB\JSFC\SDE.DBF
输入数据文件 fno=00005 name=E:\ORACLEDB\JSFC\STSYSDB
输入数据文件 fno=00004 name=E:\ORACLEDB\JSFC\USERS01.DBF
通道 ch0: 正在启动段 1 于 04-1月 -12
释放的通道: ch0
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: backup plus archivelog 命令 (在 01/04/2012 21:09:20 上) 失败
ORA-19501: 文件 "E:\ORACLEDB\JSFC\STIMGDB_SPACE04_03", 块编号 806081 读错误 (块大小 = 8192)
ORA-27070: 异步读取/写入失败
OSD-04006: ReadFile() 失败, 无法读取文件
O/S-Error: (OS 23) 数据错误(循环冗余检查)。

恢复管理器完成。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/196700/viewspace-720543/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-10-10

  • 博文量
    546
  • 访问量
    26562