非常规数据恢复的几种场景(跳过坏块导出数据)

来源:互联网 发布:网络言论自由的例子 编辑:程序博客网 时间:2024/06/05 05:31
创建测试表、测试表空间。
SQL> select count(*) from b.t;


  COUNT(*)
----------
      5895


修改测试表空间对应数据文件(二进制),启动后查询该表空间内的某张表时发现有数据坏块:
SQL> select count(*) from b.t;
select count(*) from b.t
       *
第 1 行出现错误:
ORA-01578: ORACLE 数据块损坏 (文件号 9, 块号 124)
ORA-01110: 数据文件 9: 'F:\ORACLE\ORADATA\TEST\TBS_BLOCK.DBF'




使用dbv查看数据文件,发现也是(file 9, block 124)数据块损坏:
SQL> ho dbv file='F:\ORACLE\ORADATA\TEST\TBS_BLOCK.DBF' blocksize=8192


DBVERIFY: Release 12.1.0.2.0 - Production on 星期五 6月 17 09:23:15 2016


Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.


DBVERIFY - 开始验证: FILE = F:\ORACLE\ORADATA\TEST\TBS_BLOCK.DBF
页 124 标记为损坏
Corrupt block relative dba: 0x0240007c (file 9, block 124)
Bad check value found during dbv:
Data in bad block:
 type: 6 format: 2 rdba: 0x0240007c
 last change scn: 0x0000.0031079d seq: 0x1 flg: 0x06
 spare1: 0x0 spare2: 0x0 spare3: 0x0
 consistency value in tail: 0x079d0601
 check value in block header: 0xfe35
 computed block checksum: 0x332c
DBVERIFY - 验证完成
检查的页总数: 128
处理的页总数 (数据): 109
失败的页总数 (数据): 0
处理的页总数 (索引): 0
失败的页总数 (索引): 0
处理的页总数 (其他): 17
处理的总页数 (段)  : 0
失败的总页数 (段)  : 0
空的页总数: 1
标记为损坏的总页数: 1
流入的页总数: 0
加密的总页数        : 0
最高块 SCN            : 3213215 (0.3213215)




在这种情况下,如果有备份,需要从备份中恢复。如果没有备份,那么坏块部分的数据肯定要丢失了
这时候用exp/imp尝试导数据,表的定义可以导出/导入,但是表数据是无法导出/导入的。


查出这个数据坏块对应的对象:
select tablespace_name,segment_type,owner,segment_name from dba_extents
 where file_id=9 and 124 between block_id and block_id+blocks-1;
TABLESPACE_NAME      SEGMENT_TYPE         OWNER      SEGMENT_NAME
-------------------- -------------------- ---------- --------------------
TBS_BLOCK            TABLE                B          T


如果损失的是数据,ok
我们可以设置内部10231事件,该事件能够让Oracle在全表扫描时跳过损坏的数据块,也就是使exp跳过这些损坏的block
SQL> alter system set events='10231 trace name context forever,level 10';


然后就可以正常exp这张表了。
最后drop掉表再imp即可
SQL> ho imp b/b file=d:\b.dbf fromuser=b touser=b
.............
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
导入服务器使用 AL32UTF8 字符集 (可能的字符集转换)
. . 正在导入表                             "T"导入了        5841 行
成功终止导入, 没有出现警告。


可以看到丢失了部分数据。


--成功导出后记得要关闭10231内部事件
alter system set events='10231 trace name context off';


0 0
原创粉丝点击