oracle實驗記錄 (恢復,備份-含壞塊資料檔案)

fufuh2o發表於2009-10-28

 

 

 


恢復壞塊幾種方式及其rman備份與壞塊

 

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production


SQL> create tablespace ss  datafile 'e:\datafile\ss.dbf' size 1m;

表空間已建立。

SQL> conn xh/a831115
已連線。
SQL> show user
USER 為 "XH"
SQL> create table ss (a char(2000), b char(2000), c char(2000) ) tablespace ss;

表已建立。

SQL> declare
  2  begin
  3  for i in 1..1000 loop
  4  insert into ss values('a','b','c');
  5  commit;
  6  end loop;
  7  end;
  8  /
declare
*
第 1 行出現錯誤:
ORA-01653: 表 XH.SS 無法通過 8 (在表空間 SS 中) 擴充套件
ORA-06512: 在 line 4


SQL> select count(*) from ss;

  COUNT(*)
----------
       110


RMAN> list backup of database;


RMAN> backup database;

啟動 backup 於 27-10月-09
使用通道 ORA_DISK_1
完成 Control File and SPFILE Autobackup 於 27-10月-09

 

shutdown immediate
SQL> conn xh/a831115
已連線。

~~~~~~UltraEdit~~破壞
SQL> select count(*) from ss;
select count(*) from ss
                     *
第 1 行出現錯誤:
ORA-01578: ORACLE 資料塊損壞 (檔案號 7, 塊號 82)
ORA-01110: 資料檔案 7: 'E:\DATAFILE\SS.DBF'


看見 出現 壞塊了
順便使用下
dbverify工具 檢查資料檔案

C:\>dbv

DBVERIFY: Release 10.2.0.1.0 - Production on 星期二 10月 27 20:47:36 2009

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

關鍵字      說明                    (預設值)
----------------------------------------------------
FILE        要驗證的檔案                 (無)
START       起始塊                    (檔案的第一個塊)
END         結束塊                      (檔案的最後一個塊)
BLOCKSIZE   邏輯塊大小             (8192)
LOGFILE     輸出日誌                     (無)
FEEDBACK    顯示進度               (0)
PARFILE     引數檔案                 (無)
USERID      使用者名稱/口令              (無)
SEGMENT_ID  段 ID (tsn.relfile.block) (無)
HIGH_SCN    要驗證的最高塊 SCN    (無)
            (scn_wrap.scn_base 或 scn)

工具可使用的引數

C:\>dbv file=e:\datafile\ss.dbf feedback=100

DBVERIFY: Release 10.2.0.1.0 - Production on 星期二 10月 27 20:49:28 2009

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

DBVERIFY - 開始驗證: FILE = e:\datafile\ss.dbf
頁 82 標記為損壞
Corrupt block relative dba: 0x01c00052 (file 7, block 82)
Bad check value found during dbv:
Data in bad block:
 type: 6 format: 2 rdba: 0x01c00052
 last change scn: 0x0000.0050f79a seq: 0x2 flg: 0x04
 spare1: 0x0 spare2: 0x0 spare3: 0x0
 consistency value in tail: 0xf79a0602
 check value in block header: 0xdd15
 computed block checksum: 0x207c

..(每驗證100個塊出現一個.)

DBVERIFY - 驗證完成

檢查的頁總數: 128
處理的頁總數 (資料): 109
失敗的頁總數 (資料): 0
處理的頁總數 (索引): 0
失敗的頁總數 (索引): 0
處理的頁總數 (其它): 18
處理的總頁數 (段)  : 0
失敗的總頁數 (段)  : 0
空的頁總數: 0
標記為損壞的總頁數: 1
流入的頁總數: 0
最高塊 SCN            : 5306362 (0.5306362)

出現一個壞塊 82


rman與壞塊
SQL> col name format a30
SQL> select name,file# from v$datafile;

NAME                                FILE#
------------------------------ ----------
F:\ORACLE\PRODUCT\10.2.0\ORADA          1
TA\XHTEST\SYSTEM01.DBF

F:\ORACLE\PRODUCT\10.2.0\ORADA          2
TA\XHTEST\UNDOTBS01.DBF

F:\ORACLE\PRODUCT\10.2.0\ORADA          3
TA\XHTEST\SYSAUX01.DBF

F:\ORACLE\PRODUCT\10.2.0\ORADA          4
TA\XHTEST\USERS01.DBF

NAME                                FILE#
------------------------------ ----------

F:\ORACLE\PRODUCT\10.2.0\ORADA          5
TA\XHTEST\EXAMPLE01.DBF

E:\DATAFILE\TEST.DBF                    6
E:\DATAFILE\SS.DBF                      7

已選擇7行。


C:\>rman target /

恢復管理器: Release 10.2.0.1.0 - Production on 星期二 10月 27 20:54:22 2009

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

連線到目標資料庫: XHTEST (DBID=1778946334)

RMAN> backup datafile 7
2> ;

啟動 backup 於 27-10月-09
使用目標資料庫控制檔案替代恢復目錄
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=140 devtype=DISK
通道 ORA_DISK_1: 啟動全部資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集中的資料檔案
輸入資料檔案 fno=00007 name=E:\DATAFILE\SS.DBF
通道 ORA_DISK_1: 正在啟動段 1 於 27-10月-09

備份不成功


SQL> desc v$database_block_corruption;
 名稱                                      是否為空? 型別
 ----------------------------------------- -------- ------------------------

 FILE#                                              NUMBER
 BLOCK#                                             NUMBER
 BLOCKS                                             NUMBER
 CORRUPTION_CHANGE#                                 NUMBER
 CORRUPTION_TYPE                                    VARCHAR2(9)

SQL> select count(*) from v$database_block_corruption where file#=7;

  COUNT(*)
----------
         0

RMAN> run{set maxcorrupt for datafile 7 to 2;
2> backup datafile 7;}

正在執行命令: SET MAX CORRUPT

啟動 backup 於 27-10月-09
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 啟動全部資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集中的資料檔案
輸入資料檔案 fno=00007 name=E:\DATAFILE\SS.DBF
通道 ORA_DISK_1: 正在啟動段 1 於 27-10月-09
通道 ORA_DISK_1: 已完成段 1 於 27-10月-09
段控制程式碼=F:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\XHTEST\BACKUPSET\2009_10_27\
O1_MF_NNNDF_TAG20091027T220531_5GFZKFVC_.BKP 標記=TAG20091027T220531 註釋=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:01
完成 backup 於 27-10月-09

啟動 Control File and SPFILE Autobackup 於 27-10月-09
段 handle=F:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\XHTEST\AUTOBACKUP\2009_10
_27\O1_MF_S_701388335_5GFZKJ0H_.BKP comment=NONE
完成 Control File and SPFILE Autobackup 於 27-10月-09

SQL> select * from v$database_block_corruption where file#=7;

     FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
         7         82          1                  0 CHECKSUM

 

用copy命令:
RMAN> run{set maxcorrupt for datafile 7 to 2;
2> copy datafile 7 to 'd:\tt.dbf';}

正在執行命令: SET MAX CORRUPT

啟動 backup 於 27-10月-09
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 啟動資料檔案副本
輸入資料檔案 fno=00007 name=E:\DATAFILE\SS.DBF
輸出檔名 = D:\TT.DBF 標記 = TAG20091027T221051 recid = 75 時間戳 = 701388651
通道 ORA_DISK_1: 資料檔案複製完畢, 經過時間: 00:00:01
完成 backup 於 27-10月-09

啟動 Control File and SPFILE Autobackup 於 27-10月-09
段 handle=F:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\XHTEST\AUTOBACKUP\2009_10
_27\O1_MF_S_701388652_5GFZVFPY_.BKP comment=NONE
完成 Control File and SPFILE Autobackup 於 27-10月-09
SQL> select file#,blocks from v$copy_corruption where file#=7;

     FILE#     BLOCKS
---------- ----------
         7          1


關於解決壞塊

rman解決

RMAN> blockrecover device type disk datafile 5 block 82;

啟動 blockrecover 於 27-10月-09
釋放的通道: ORA_DISK_1
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=140 devtype=DISK

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

完成 blockrecover 於 27-10月-09

RMAN> blockrecover device type disk datafile 7 block 82;

啟動 blockrecover 於 27-10月-09
釋放的通道: ORA_DISK_1
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=140 devtype=DISK

通道 ORA_DISK_1: 正在從資料檔案副本 D:\TT.DBF 復原塊
故障轉移到上一個備份

通道 ORA_DISK_1: 正在恢復塊
通道 ORA_DISK_1: 正在指定要從備份集恢復的塊
正在恢復資料檔案 00007 的塊
通道 ORA_DISK_1: 正在讀取備份段 F:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\XHT
EST\BACKUPSET\2009_10_27\O1_MF_NNNDF_TAG20091027T220531_5GFZKFVC_.BKP
通道 ORA_DISK_1: 已從備份段 1 恢復塊
段控制程式碼 = F:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\XHTEST\BACKUPSET\2009_10_2
7\O1_MF_NNNDF_TAG20091027T220531_5GFZKFVC_.BKP 標記 = TAG20091027T220531
通道 ORA_DISK_1: 塊恢復完成, 用時: 00:00:02
故障轉移到上一個備份

通道 ORA_DISK_1: 正在恢復塊
通道 ORA_DISK_1: 正在指定要從備份集恢復的塊
正在恢復資料檔案 00007 的塊
通道 ORA_DISK_1: 正在讀取備份段 F:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\XHT
EST\BACKUPSET\2009_10_27\O1_MF_NNNDF_TAG20091027T172314_5GFH04WS_.BKP
通道 ORA_DISK_1: 已從備份段 1 恢復塊
段控制程式碼 = F:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\XHTEST\BACKUPSET\2009_10_2
7\O1_MF_NNNDF_TAG20091027T172314_5GFH04WS_.BKP 標記 = TAG20091027T172314
通道 ORA_DISK_1: 塊恢復完成, 用時: 00:00:01

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

完成 blockrecover 於 27-10月-09

RMAN>
SQL> conn xh/a831115
已連線。


SQL> select count(*) from ss;

  COUNT(*)
----------              恢復完成後可以查詢
       110

 

 

dbms_repair 解決:可以檢測壞塊 ,修復壞塊(跳過壞塊,丟資料)

再次製造壞塊
SQL> conn xh/a831115
已連線。
SQL> select count(*) from ss;
select count(*) from ss
                     *
第 1 行出現錯誤:
ORA-01578: ORACLE 資料塊損壞 (檔案號 7, 塊號 84)
ORA-01110: 資料檔案 7: 'E:\DATAFILE\SS.DBF'

SQL> conn / as sysdba
已連線。
SQL> desc sys.dbms_repair
PROCEDURE ADMIN_TABLES
引數名稱                       型別                    輸入/輸出預設值?
------------------------------ ----------------------- ------ --------
 TABLE_NAME                     VARCHAR2                IN     DEFAULT
 TABLE_TYPE                     BINARY_INTEGER          IN
 ACTION                         BINARY_INTEGER          IN
 TABLESPACE                     VARCHAR2                IN     DEFAULT
PROCEDURE CHECK_OBJECT
引數名稱                       型別                    輸入/輸出預設值?
------------------------------ ----------------------- ------ --------
 SCHEMA_NAME                    VARCHAR2                IN
 OBJECT_NAME                    VARCHAR2                IN
 PARTITION_NAME                 VARCHAR2                IN     DEFAULT
 OBJECT_TYPE                    BINARY_INTEGER          IN     DEFAULT
 REPAIR_TABLE_NAME              VARCHAR2                IN     DEFAULT
 FLAGS                          BINARY_INTEGER          IN     DEFAULT
 RELATIVE_FNO                   BINARY_INTEGER          IN     DEFAULT
 BLOCK_START                    BINARY_INTEGER          IN     DEFAULT
 BLOCK_END                      BINARY_INTEGER          IN     DEFAULT
 CORRUPT_COUNT                  BINARY_INTEGER          OUT
PROCEDURE DUMP_ORPHAN_KEYS
引數名稱                       型別                    輸入/輸出預設值?
------------------------------ ----------------------- ------ --------
 SCHEMA_NAME                    VARCHAR2                IN
 OBJECT_NAME                    VARCHAR2                IN
 PARTITION_NAME                 VARCHAR2                IN     DEFAULT
 OBJECT_TYPE                    BINARY_INTEGER          IN     DEFAULT
 REPAIR_TABLE_NAME              VARCHAR2                IN     DEFAULT
 ORPHAN_TABLE_NAME              VARCHAR2                IN     DEFAULT
 FLAGS                          BINARY_INTEGER          IN     DEFAULT
 KEY_COUNT                      BINARY_INTEGER          OUT
PROCEDURE FIX_CORRUPT_BLOCKS
引數名稱                       型別                    輸入/輸出預設值?
------------------------------ ----------------------- ------ --------
 SCHEMA_NAME                    VARCHAR2                IN
 OBJECT_NAME                    VARCHAR2                IN
 PARTITION_NAME                 VARCHAR2                IN     DEFAULT
 OBJECT_TYPE                    BINARY_INTEGER          IN     DEFAULT
 REPAIR_TABLE_NAME              VARCHAR2                IN     DEFAULT
 FLAGS                          BINARY_INTEGER          IN     DEFAULT
 FIX_COUNT                      BINARY_INTEGER          OUT
FUNCTION ONLINE_INDEX_CLEAN RETURNS BOOLEAN
引數名稱                       型別                    輸入/輸出預設值?
------------------------------ ----------------------- ------ --------
 OBJECT_ID                      BINARY_INTEGER          IN     DEFAULT
 WAIT_FOR_LOCK                  BINARY_INTEGER          IN     DEFAULT
PROCEDURE REBUILD_FREELISTS
引數名稱                       型別                    輸入/輸出預設值?
------------------------------ ----------------------- ------ --------
 SCHEMA_NAME                    VARCHAR2                IN
 OBJECT_NAME                    VARCHAR2                IN
 PARTITION_NAME                 VARCHAR2                IN     DEFAULT
 OBJECT_TYPE                    BINARY_INTEGER          IN     DEFAULT
PROCEDURE REBUILD_SHC_INDEX
引數名稱                       型別                    輸入/輸出預設值?
------------------------------ ----------------------- ------ --------
 SEGMENT_OWNER                  VARCHAR2                IN
 CLUSTER_NAME                   VARCHAR2                IN
PROCEDURE SEGMENT_FIX_STATUS
引數名稱                       型別                    輸入/輸出預設值?
------------------------------ ----------------------- ------ --------
 SEGMENT_OWNER                  VARCHAR2                IN
 SEGMENT_NAME                   VARCHAR2                IN
 SEGMENT_TYPE                   BINARY_INTEGER          IN     DEFAULT
 FILE_NUMBER                    BINARY_INTEGER          IN     DEFAULT
 BLOCK_NUMBER                   BINARY_INTEGER          IN     DEFAULT
 STATUS_VALUE                   BINARY_INTEGER          IN     DEFAULT
 PARTITION_NAME                 VARCHAR2                IN     DEFAULT
PROCEDURE SKIP_CORRUPT_BLOCKS
引數名稱                       型別                    輸入/輸出預設值?
------------------------------ ----------------------- ------ --------
 SCHEMA_NAME                    VARCHAR2                IN
 OBJECT_NAME                    VARCHAR2                IN
 OBJECT_TYPE                    BINARY_INTEGER          IN     DEFAULT
 FLAGS                          BINARY_INTEGER          IN     DEFAULT

SQL>


先用dbms_repair.admin建立 孤表和修復表

ADMIN_TABLES :Provides administrative functions (create, drop, purge) for repair or orphan key tables.
Note: These tables are always created in the SYS schema.
 
CHECK_OBJECT :Detects and reports corruptions in a table or index
DUMP_ORPHAN_KEYS :Reports on index entries that point to rows in corrupt data blocks
FIX_CORRUPT_BLOCKS :Marks blocks as software corrupt that have been previously identified as corrupt by the CHECK_OBJECT procedure
REBUILD_FREELISTS :Rebuilds the free lists of the object
SEGMENT_FIX_STATUS :Provides the capability to fix the corrupted state of a bitmap entry when segment space management is AUTO
SKIP_CORRUPT_BLOCKS: When used, ignores blocks marked corrupt during table and index scans. If not used, you get error ORA-1578 when encountering blocks

marked corrupt.
s.

  1  begin
  2  dbms_repair.admin_tables(table_name=>'REPAIR_tb',table_type=>dbms_repair.re
pair_table,action=>dbms_repair.create_action,tablespace=>'USERS');
  3* end;
SQL> /

PL/SQL 過程已成功完成。
repair table必須要有REPAIR_字首(否則報錯ORA-24129: 表名 repair_tb 沒有以字首 REPAIR_ 開始)

table_type=>dbms_repair.orphan_table:記錄壞塊檢查結果
table_type=>dbms_repair.repair_table:與index有關係,記錄壞塊在index中的KEY VALUE

SQL> desc REPAIR_tb
 名稱                                      是否為空? 型別
 ----------------------------------------- -------- ----------------------------

 OBJECT_ID                                 NOT NULL NUMBER
 TABLESPACE_ID                             NOT NULL NUMBER
 RELATIVE_FILE_ID                          NOT NULL NUMBER
 BLOCK_ID                                  NOT NULL NUMBER
 CORRUPT_TYPE                              NOT NULL NUMBER
 SCHEMA_NAME                               NOT NULL VARCHAR2(30)
 OBJECT_NAME                               NOT NULL VARCHAR2(30)
 BASEOBJECT_NAME                                    VARCHAR2(30)
 PARTITION_NAME                                     VARCHAR2(30)
 CORRUPT_DESCRIPTION                                VARCHAR2(2000)
 REPAIR_DESCRIPTION                                 VARCHAR2(200)
 MARKED_CORRUPT                            NOT NULL VARCHAR2(10)
 CHECK_TIMESTAMP                           NOT NULL DATE
 FIX_TIMESTAMP                                      DATE
 REFORMAT_TIMESTAMP                                 DATE

建立好的結構


檢查壞塊
SQL> SET SERVEROUTPUT ON

  1  DECLARE num_corrupt INT;
  2  BEGIN
  3  num_corrupt := 0;
  4  DBMS_REPAIR.CHECK_OBJECT (
  5       SCHEMA_NAME => 'XH',
  6       OBJECT_NAME => 'SS',
  7       REPAIR_TABLE_NAME => 'REPAIR_TB',
  8       CORRUPT_COUNT =>  num_corrupt);
  9  DBMS_OUTPUT.PUT_LINE('number corrupt: ' || TO_CHAR (num_corrupt));
 10* END;
SQL> /
number corrupt: 2
有2個壞塊

SQL> select object_name,block_id,MARKED_CORRUPT from repair_tb;

OBJECT_NAME                      BLOCK_ID MARKED_COR
------------------------------ ---------- ----------
SS                                     84 TRUE
SS                                     85 TRUE

84,85為壞塊


  1  DECLARE num_fix INT;
  2  BEGIN
  3  num_fix := 0;
  4  DBMS_REPAIR.FIX_CORRUPT_BLOCKS (
  5       SCHEMA_NAME => 'XH',
  6       OBJECT_NAME=> 'SS',
  7       OBJECT_TYPE => dbms_repair.table_object,
  8       REPAIR_TABLE_NAME => 'REPAIR_TB',
  9       FIX_COUNT=> num_fix);
 10  DBMS_OUTPUT.PUT_LINE('num fix: ' || TO_CHAR(num_fix));
 11* END;
SQL> /
num fix: 0

PL/SQL 過程已成功完成。

在check階段已經標記為損壞,所以修正階段 返回為0


跳過壞塊
  1  BEGIN
  2  DBMS_REPAIR.SKIP_CORRUPT_BLOCKS (
  3       SCHEMA_NAME => 'XH',
  4       OBJECT_NAME => 'SS',
  5       OBJECT_TYPE => dbms_repair.table_object,
  6       FLAGS => dbms_repair.skip_flag);
  7* END;
SQL> /

PL/SQL 過程已成功完成。

SQL> conn xh/a831115
已連線。
SQL> select count(*) from ss;

  COUNT(*)
----------
       108

可以看到正好丟了 2行的資料(建立表時每行對應一個塊)

另外如果有INDEX的話要執行
用來儲存壞塊對應index的 key value(否則不一直FTS 報錯,INDEX SCAN 不報錯)
SET SERVEROUTPUT ON
DECLARE num_orphans INT;
BEGIN
num_orphans := 0;
DBMS_REPAIR.DUMP_ORPHAN_KEYS (
     SCHEMA_NAME => 'XH',
     OBJECT_NAME => 'IND_SS',
     OBJECT_TYPE => dbms_repair.index_object,
     REPAIR_TABLE_NAME => 'REPAIR_TB',
     ORPHAN_TABLE_NAME=> 'ORPHAN_KEY_TABLE',
     KEY_COUNT => num_orphans);
DBMS_OUTPUT.PUT_LINE('orphan key count: ' || TO_CHAR(num_orphans));
END;
/

 

 


建立玩上面的表 執行後

 

 


SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。

~~~~~~~~~~~~~~~在製造壞塊
SQL> startup
ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE 例程已經啟動。

Total System Global Area  289406976 bytes
Fixed Size                  1248576 bytes
Variable Size             104858304 bytes
Database Buffers          176160768 bytes
Redo Buffers                7139328 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> conn xh/a831115
已連線。
SQL> select count(*) from ss;

  COUNT(*)
----------
       106~~~~~~~~~~~~~~~~~~~~~將自己跳過壞塊(奇怪)


SQL> select object_name,block_id from repair_tb;

OBJECT_NAME                      BLOCK_ID
------------------------------ ----------
SS                                     84
SS                                     85
中還是記錄2個壞塊

SQL> host dbv file=e:\datafile\ss.dbf feedback=100

DBVERIFY: Release 10.2.0.1.0 - Production on 星期二 10月 27 23:19:31 2009

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

DBVERIFY - 開始驗證: FILE = e:\datafile\ss.dbf
頁 46 標記為損壞
Corrupt block relative dba: 0x01c0002e (file 7, block 46)
Bad check value found during dbv:
Data in bad block:
 type: 6 format: 2 rdba: 0x01c0002e
 last change scn: 0x0000.0050f73b seq: 0x2 flg: 0x04
 spare1: 0x0 spare2: 0x0 spare3: 0x0
 consistency value in tail: 0xf73b0602
 check value in block header: 0x970d
 computed block checksum: 0xc6af

頁 49 標記為損壞
Corrupt block relative dba: 0x01c00031 (file 7, block 49)
Bad check value found during dbv:
Data in bad block:
 type: 6 format: 2 rdba: 0x01c00031
 last change scn: 0x0000.0050f749 seq: 0x2 flg: 0x04
 spare1: 0x0 spare2: 0x0 spare3: 0x0
 consistency value in tail: 0xf7490602
 check value in block header: 0xdb0c
 computed block checksum: 0xe2ff

頁 84 標記為損壞
Corrupt block relative dba: 0x01c00054 (file 7, block 84)
Bad check value found during dbv:
Data in bad block:
 type: 6 format: 2 rdba: 0x01c00054
 last change scn: 0x0000.0050f794 seq: 0x2 flg: 0x04
 spare1: 0x0 spare2: 0x0 spare3: 0x0
 consistency value in tail: 0xf7940602
 check value in block header: 0xdd2c
 computed block checksum: 0x777d

頁 85 流入 - 很可能是介質損壞
Corrupt block relative dba: 0x01c00055 (file 7, block 85)
Fractured block found during dbv:
Data in bad block:
 type: 6 format: 2 rdba: 0x01c00055
 last change scn: 0xad00.0050f796 seq: 0xad flg: 0xa4
 spare1: 0x0 spare2: 0x0 spare3: 0x0
 consistency value in tail: 0xf7960602
 check value in block header: 0xdb18
 computed block checksum: 0xb2f4

..

DBVERIFY - 驗證完成

檢查的頁總數: 128
處理的頁總數 (資料): 106
失敗的頁總數 (資料): 0
處理的頁總數 (索引): 0
失敗的頁總數 (索引): 0
處理的頁總數 (其它): 18
處理的總頁數 (段)  : 0
失敗的總頁數 (段)  : 0
空的頁總數: 0
標記為損壞的總頁數: 4
流入的頁總數: 1
最高塊 SCN            : 5306362 (0.5306362)


檢查出4個,oracle自動執行掉過壞塊操作了??


  1  BEGIN
  2  DBMS_REPAIR.ADMIN_TABLES (
  3       TABLE_NAME => 'REPAIR_TB',
  4       TABLE_TYPE => dbms_repair.repair_table,
  5       ACTION     => dbms_repair.purge_action
  6  );
  7* END;
SQL> /

PL/SQL 過程已成功完成。


SQL> select object_name,block_id from repair_tb;

OBJECT_NAME                      BLOCK_ID
------------------------------ ----------
SS                                     84
SS                                     85

  1    BEGIN
  2    DBMS_REPAIR.ADMIN_TABLES (
  3        TABLE_NAME => 'REPAIR_TB',
  4       TABLE_TYPE => dbms_repair.repair_table,
  5        ACTION     => dbms_repair.drop_action);
  6*  END;
  7  /

PL/SQL 過程已成功完成。

SQL> select object_name,block_id from repair_tb;
select object_name,block_id from repair_tb
                                 *
第 1 行出現錯誤:
ORA-00942: 表或檢視不存在

 

SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~破壞
SQL> startup
ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE 例程已經啟動。

Total System Global Area  289406976 bytes
Fixed Size                  1248576 bytes
Variable Size             104858304 bytes
Database Buffers          176160768 bytes
Redo Buffers                7139328 bytes
SQL> conn xh/a831115
已連線。
SQL> select count(*) from ss;

  COUNT(*)
----------
       105

暈了 oracle還是自己解決了

原因:
SQL> select skip_corrupt from all_tables where table_name='SS';

SKIP_COR
--------
ENABLED

SKIP_CORRUPT VARCHAR2(8)   Whether the Oracle Database ignores blocks marked corrupt during table and index scans (ENABLED) or raises an error (DISABLED). To

enable this feature, run the DBMS_REPAIR.SKIP_CORRUPT_BLOCKS procedure

 

 

 

用event解決:
SQL> create tablespace sss  datafile 'e:\datafile\sss.dbf' size 1m;

表空間已建立。

SQL> create table sss (a char(2000), b char(2000), c char(2000) ) tablespace sss
;

表已建立。


SQL> ed
已寫入 file afiedt.buf

  1   declare
  2     begin
  3     for i in 1..1000 loop
  4     insert into sss values('a','b','c');
  5     commit;
  6    end loop;
  7*    end;
SQL> /
 declare
*
第 1 行出現錯誤:
ORA-01653: 表 XH.SSS 無法通過 8 (在表空間 SSS 中) 擴充套件
ORA-06512: 在 line 4


SQL>  select count(*) from sss;

  COUNT(*)
----------
       110
SQL> select skip_corrupt from all_tables where table_name='SSS';

SKIP_COR
--------
DISABLED


SQL> conn xh/a831115
已連線。
SQL> select count(*) from sss;
select count(*) from sss
                     *
第 1 行出現錯誤:
ORA-01578: ORACLE 資料塊損壞 (檔案號 8, 塊號 43)
ORA-01110: 資料檔案 8: 'E:\DATAFILE\SSS.DBF'

SQL> host exp xh/a831115 file=e:\sss.dmp tables=SSS

Export: Release 10.2.0.1.0 - Production on 星期二 10月 27 23:39:46 2009

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


連線到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已匯出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集

即將匯出指定的表通過常規路徑...
. . 正在匯出表                             SSS
EXP-00056: 遇到 ORACLE 錯誤 1578
ORA-01578: ORACLE 資料塊損壞 (檔案號 8, 塊號 43)
ORA-01110: 資料檔案 8: 'E:\DATAFILE\SSS.DBF'
匯出成功終止, 但出現警告。

 

SQL> ALTER SYSTEM SET EVENTS '10231 trace name context forever,level 10';

系統已更改。

SQL> host exp xh/a831115 file=e:\sss.dmp tables=SSS

Export: Release 10.2.0.1.0 - Production on 星期二 10月 27 23:40:44 2009

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


連線到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已匯出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集

即將匯出指定的表通過常規路徑...
. . 正在匯出表                             SSS匯出了         109 行
成功終止匯出, 沒有出現警告。

可以看到 匯出時有1row是 丟失的

SQL> host imp xh/a831115 file=e:\sss.dmp tables=SSS

Import: Release 10.2.0.1.0 - Production on 星期二 10月 27 23:41:20 2009

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


連線到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

經由常規路徑由 EXPORT:V10.02.01 建立的匯出檔案
已經完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的匯入
. 正在將 XH 的物件匯入到 XH
. 正在將 XH 的物件匯入到 XH
. . 正在匯入表                           "SSS"匯入了         109 行
成功終止匯入, 沒有出現警告。

 

SQL> select count(*) from sss;

  COUNT(*)
----------
       109
丟失1 rows

 


SQL> conn / as sysdba
已連線。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~塊損壞
SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup
ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE 例程已經啟動。

Total System Global Area  289406976 bytes
Fixed Size                  1248576 bytes
Variable Size             117441216 bytes
Database Buffers          163577856 bytes
Redo Buffers                7139328 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> conn xh/a831115
已連線。
SQL> select count(*) from sss;
select count(*) from sss
                     *
第 1 行出現錯誤:
ORA-01578: ORACLE 資料塊損壞 (檔案號 8, 塊號 34)
ORA-01110: 資料檔案 8: 'E:\DATAFILE\SSS.DBF'


SQL>   alter session set events '10231 trace name context forever, level 10';~~~~~直接使用事件

會話已更改。

SQL> select count(*) from sss;

  COUNT(*)
----------
       108

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

相關文章