利用DBMS_REPAIR包檢查以及COPY處理壞塊:

趙宇發表於2008-05-05

用UE隨便修改了幾個字元:

SQL> select distinct ename from emp3;
select distinct ename from emp3
                           *
第 1 行出現錯誤:
ORA-01578: ORACLE 資料塊損壞 (檔案號 6, 塊號 201)
ORA-01110: 資料檔案 6: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DBF'


DBV檢查資料檔案,發現有1壞塊:

D:\>dbv file='D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DBF' blocksize=8192

DBVERIFY: Release 10.2.0.4.0 - Production on 星期一 5月 5 14:13:13 2008

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

DBVERIFY - 開始驗證: FILE = D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DBF
頁 201 標記為損壞
Corrupt block relative dba: 0x018000c9 (file 6, block 201)
Bad check value found during dbv:
Data in bad block:
 type: 6 format: 2 rdba: 0x018000c9
 last change scn: 0x0000.000b0e50 seq: 0x1 flg: 0x06
 spare1: 0x0 spare2: 0x0 spare3: 0x0
 consistency value in tail: 0x0e500601
 check value in block header: 0x2969
 computed block checksum: 0x3939

 

DBVERIFY - 驗證完成

檢查的頁總數: 638
處理的頁總數 (資料): 495
失敗的頁總數 (資料): 0
處理的頁總數 (索引): 0
失敗的頁總數 (索引): 0
處理的頁總數 (其它): 24
處理的總頁數 (段)  : 0
失敗的總頁數 (段)  : 0
空的頁總數: 118
標記為損壞的總頁數: 1
流入的頁總數: 0
最高塊 SCN            : 725123 (0.725123)

D:\>

建立修復的表,儲存壞塊的資訊:

SQL> begin
  2  dbms_repair.admin_tables(
  3  table_name=>'REPAIR_TABLE',
  4  TABLE_TYPE=>DBMS_REPAIR.REPAIR_TABLE,
  5  ACTION=>DBMS_REPAIR.CREATE_ACTION,TABLESPACE=>'TEST');
  6  END;
  7  /

PL/SQL 過程已成功完成。

SQL> SHOW USER
USER 為 "SYS"
SQL> select owner,tablespace_name from dba_tables where table_name='REPAIR_TABLE';

OWNER                          TABLESPACE_NAME
------------------------------ ------------------------------
SYS                            TEST

 

SQL> set serveroutput on
SQL> declare  num_corrupt int;
  2  begin
  3  num_corrupt :=0;
  4  dbms_repair.check_object(schema_name=>'SCOTT',object_name=>'EMP3',
  5  repair_table_name=>'REPAIR_TABLE',corrupt_count=>num_corrupt);
  6  end;
  7  /

PL/SQL 過程已成功完成。

 


SQL> select OBJECT_ID,TABLESPACE_ID,RELATIVE_FILE_ID,BLOCK_ID,SCHEMA_NAME,OBJECT_NAME,
  2      REPAIR_DESCRIPTION,MARKED_CORRUPT  from repair_table;

 OBJECT_ID TABLESPACE_ID RELATIVE_FILE_ID   BLOCK_ID SCHEMA_N OBJECT_ REPAIR_DESCRIPTION             MARKED
---------- ------------- ---------------- ---------- -------- ------- ------------------------------ ------
     53322             7                6        201 SCOTT    EMP3    mark block software corrupt    TRUE

 

SQL> DECLARE NUM_FIX INT;
  2  BEGIN
  3  NUM_FIX :=0;
  4  DBMS_REPAIR.FIX_CORRUPT_BLOCKS(SCHEMA_NAME=>'SCOTT',
  5  OBJECT_NAME=>'EMP3',
  6  OBJECT_TYPE=>DBMS_REPAIR.TABLE_OBJECT,
  7  REPAIR_TABLE_NAME=>'REPAIR_TABLE',
  8  FIX_COUNT=>NUM_FIX);
  9  END;
 10  /

PL/SQL 過程已成功完成。


發現REPAIR_TABLE又插入了一條:

SQL> select OBJECT_ID,TABLESPACE_ID,RELATIVE_FILE_ID,BLOCK_ID,SCHEMA_NAME,OBJECT_NAME,
  2  REPAIR_DESCRIPTION,MARKED_CORRUPT  from repair_table;

 OBJECT_ID TABLESPACE_ID RELATIVE_FILE_ID   BLOCK_ID SCHEMA_N OBJECT_ REPAIR_DESCRIPTION            MARKED
---------- ------------- ---------------- ---------- -------- ------- ----------------------------- ------
     53322             7                6        201 SCOTT    EMP3    mark block software corrupt    TRUE
     53322             7                6        201 SCOTT    EMP3    mark block software corrupt    TRUE


SQL> conn scott/tiger
已連線。
SQL> select distinct ename from emp3;
select distinct ename from emp3
*
第 1 行出現錯誤:
ORA-01578: ORACLE 資料塊損壞 (檔案號 6, 塊號 201)
ORA-01110: 資料檔案 6: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DBF'


SQL>select SKIP_CORRUPT from user_tables where table_name='EMP3';

SKIP_CORRUPT
--------------------
DISABLED


利用過程SKIP_CORRUPT_BLOCKS進行跳過壞塊:

SQL> BEGIN
  2  DBMS_REPAIR.SKIP_CORRUPT_BLOCKS (
  3  SCHEMA_NAME => 'SCOTT',
  4  OBJECT_NAME => 'EMP3',
  5  OBJECT_TYPE => dbms_repair.table_object,
  6  FLAGS => dbms_repair.skip_flag);
  7  END;
  8  /

PL/SQL 過程已成功完成。

 


SQL> select SKIP_CORRUPT from dba_tables where table_name='EMP3';

SKIP_CORRUPT
--------------------
ENABLED


SQL> conn scott/tiger
已連線。
SQL> select distinct ename from emp3;

ENAME
----------
ALLEN
JONES
FORD
CLARK
MILLER
DD
SMITH
WARD
MARTIN
SCOTT
TURNER

ENAME
----------
ADAMS
BLAKE
KING
JAMES

已選擇15行。

 

 

測試:DBSM_REPAIR跳過壞塊是否通過REPAIR_TABLE表呢?

SQL> show user
USER 為 "SCOTT"
SQL> conn / as sysdba
已連線。
SQL> create table repair_table_bak as select * from repair_table;

表已建立。

SQL> delete from  repair_table;

已刪除2行。

SQL> commit;

提交完成。

SQL> conn scott/tiger
已連線。
SQL> select distinct ename from emp3;

ENAME
----------
ALLEN
JONES
FORD
CLARK
MILLER
DD
SMITH
WARD
MARTIN
SCOTT
TURNER

ENAME
----------
ADAMS
BLAKE
KING
JAMES

已選擇15行。

SQL>

 

 

D:\>rman target / nocatalog

恢復管理器: Release 10.2.0.4.0 - Production on 星期一 5月 5 15:28:01 2008

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

連線到目標資料庫: DEVDB (DBID=557726576)
使用目標資料庫控制檔案替代恢復目錄

RMAN> report schema;

資料庫方案報表

永久資料檔案列表
===========================
檔案大小 (MB) 表空間           回退段資料檔名稱
---- -------- -------------------- ------- ------------------------
1    490      SYSTEM               ***     +DISK_GROUP1/devdb/datafile/system.260.652996483
2    35       UNDOTBS1             ***     +DISK_GROUP1/devdb/datafile/undotbs1.292.652996483
3    270      SYSAUX               ***     +DISK_GROUP1/devdb/datafile/sysaux.293.652996483
4    5        USERS                ***     +DISK_GROUP1/devdb/datafile/users.291.652996483
5    104      EXAMPLE              ***     +DISK_GROUP1/devdb/datafile/example.256.652996665
6    10       TEST                 ***     D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DBF

臨時檔案列表
=======================
檔案大小 (MB) 表空間           最大大小 (MB) 臨時檔名稱
---- -------- -------------------- ----------- --------------------
1    20       TEMP                 32767       +DISK_GROUP1/devdb/tempfile/temp.257.652996649

RMAN> list backup of datafile 6;


RMAN> list copy of datafile 6;


RMAN>


雖然沒有啟動catalog,但是仍然可以在rman中註冊手工COPY的備份.這個COPY是5M,現在資料檔案是10m,
用最舊的COPY進行恢復,保證資料不丟失.

RMAN> catalog datafilecopy 'D:\oracle\product\10.2.0\oradata\TEST.DBF1';

已將資料檔案副本列入目錄
資料檔案副本 filename=D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DBF1 recid=3 stamp=653931136


RMAN> list copy of datafile 6;


資料檔案副本列表
關鍵字     檔案 S 完成時間            Ckp SCN    Ckp 時間            名稱
------- ---- - ------------------- ---------- ------------------- ----
3       6    A 2008-05-05 15:32:16 725421     2008-05-05 14:07:38 D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DBF1

RMAN> blockrecover datafile 6 block 201;

啟動 blockrecover 於 2008-05-05 15:44:10
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=138 devtype=DISK

通道 ORA_DISK_1: 正在從資料檔案副本 D:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST.DBF1 還原塊

正在開始介質的恢復
介質恢復完成, 用時: 00:00:07

完成 blockrecover 於 2008-05-05 15:44:19

 


D:\>dbv file='D:\oracle\product\10.2.0\oradata\TEST.DBF' blocksize=8192

DBVERIFY: Release 10.2.0.4.0 - Production on 星期一 5月 5 15:46:05 2008

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

DBVERIFY - 開始驗證: FILE = D:\oracle\product\10.2.0\oradata\TEST.DBF


DBVERIFY - 驗證完成

檢查的頁總數: 1280
處理的頁總數 (資料): 501
失敗的頁總數 (資料): 0
處理的頁總數 (索引): 0
失敗的頁總數 (索引): 0
處理的頁總數 (其它): 30
處理的總頁數 (段)  : 0
失敗的總頁數 (段)  : 0
空的頁總數: 749
標記為損壞的總頁數: 0
流入的頁總數: 0
最高塊 SCN            : 727930 (0.727930)

D:\>


已經沒有壞塊.


 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/175005/viewspace-260371/,如需轉載,請註明出處,否則將追究法律責任。

相關文章