利用DBMS_REPAIR包檢查以及COPY處理壞塊:
用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DBMS_REPAIR修復壞塊AI
- 檢查 oracle 壞塊Oracle
- Oracle壞塊處理Oracle
- rootvg壞塊處理
- ORACLE 壞塊處理Oracle
- 處理塊損壞
- 使用dbms_repair修復塊損壞AI
- DBA實踐---壞塊處理
- 資料庫壞塊處理資料庫
- Oracle壞塊處理相關Oracle
- Oracle壞塊問題處理Oracle
- oracle corrupt block壞塊處理OracleBloC
- 使用DBMS_REPAIR確定和跳過壞塊AI
- 第7章 處理塊損壞
- BAD Block 壞塊的處理BloC
- 檢查資料塊損壞(Block Corruption)BloC
- ORACLE資料庫壞塊的處理 (處理無物件壞快的方法)Oracle資料庫物件
- 叢集故障處理之處理思路以及健康狀態檢查(三十二)
- ORACLE資料庫壞塊的處理 (一次壞快處理過程)Oracle資料庫
- 【BLOCK】Oracle壞塊處理命令參考BloCOracle
- oracle壞塊模擬處理(筆記)Oracle筆記
- Oracle 壞塊處理三板斧Oracle
- Oracle壞塊修復處理實驗Oracle
- 一次使用BBED處理壞塊
- 怎樣檢查資料庫壞塊(DBV)資料庫
- [20121016]壞塊處理以及資料恢復.txt資料恢復
- 壞塊的處理思維(用程式製作壞塊不如用系統)
- bad block表上壞塊的處理BloC
- ORA-01578(資料塊損壞)跳過壞塊處理辦法
- 一次壞塊的處理過程(一)
- 一次壞塊的處理過程(二)
- 資料庫壞塊Corrupt block的處理方法資料庫BloC
- 對oracle中出現的壞塊的處理方法Oracle
- 一次壞塊的處理過程 [轉]
- ORACLE壞塊(ORA-01578)處理方法Oracle
- ReiserFS檔案系統壞塊的處理(轉)
- rman備份後發現壞塊的處理
- 發生壞塊後的處理及確認