溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

檢測數據塊損壞(Block Corruption)

發布時間:2020-08-12 21:40:12 來源:ITPUB博客 閱讀:6338 作者:不一樣的天空w 欄目:關系型數據庫
數據塊的損壞分兩種情況,第一種是物理性的,第二種是邏輯性的。物理性一般指數據塊頭部不可以訪問、數據塊校驗值不合法。邏輯性一般是在物理性結構完整的情況下,數據的內容在含義上不正確,比如保存了不允許的字段值。

下面分別用兩種情況說明數據塊的物理錯誤和數據的邏輯錯誤

一、數據塊物理錯誤:  physical bad block,物理性一般指數據塊頭部不可以訪問、數據塊校驗值不合法               
--創建表空間test                                                     

SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/DBdb/system01.dbf
/u01/app/oracle/oradata/DBdb/sysaux01.dbf
/u01/app/oracle/oradata/DBdb/undotbs01.dbf
/u01/app/oracle/oradata/DBdb/users01.dbf
/u01/app/oracle/oradata/DBdb/example01.dbf

SQL> create tablespace test datafile '/u01/app/oracle/oradata/DBdb/test.dbf' size 10m;

Tablespace created.

--創建表test,使用表空間test
SQL> create table scott.test tablespace test as select * from dba_objects where rownum <=100;

Table created.  
  
SQL> col name for a70
SQL> set lines 200 pages 999
SQL> select f.file#,
  2         t.name tablespace,
  3         f.name,
  4         trunc(f.bytes / 1048576, 2) size_mb,
  5         to_char(f.creation_time, 'yyyy-mm-dd') creation_time,
  6         status
  7    from v$datafile f, v$tablespace t
  8   where f.ts# = t.ts#
  9   order by f.creation_time;
FILE# TABLESPACE NAME                                          SIZE_MB CREATION_T STATUS
----- ---------- ------------------------------------------ ---------- ---------- -------
    1 SYSTEM     /u01/app/oracle/oradata/DBdb/system01.dbf        2800 2013-08-24 SYSTEM
    2 SYSAUX     /u01/app/oracle/oradata/DBdb/sysaux01.dbf         710 2013-08-24 ONLINE
    4 USERS      /u01/app/oracle/oradata/DBdb/users01.dbf      3058.75 2013-08-24 ONLINE
    3 UNDOTBS1   /u01/app/oracle/oradata/DBdb/undotbs01.dbf       2965 2013-08-24 ONLINE
    5 EXAMPLE    /u01/app/oracle/oradata/DBdb/example01.dbf     338.75 2017-04-27 ONLINE
    6 TEST       /u01/app/oracle/oradata/DBdb/test.dbf              10 2018-01-26 ONLINE

6 rows selected.

                                                                        
--test表從數據塊128號開始的8個塊(128-135),數據文件是6號。    
SQL> set lines 200
SQL> col name for a50
SQL> select a.file_id,a.block_id,a.blocks,b.name from dba_extents a,v$datafile b  where a.file_id=b.file# and a.owner='SCOTT' and a.segment_name='TEST';

   FILE_ID   BLOCK_ID     BLOCKS NAME
---------- ---------- ---------- --------------------------------------------------
         6        128          8 /u01/app/oracle/oradata/DBdb/test.dbf
                            
--test所有的行保存在131和132數據塊中                             
SQL> select distinct dbms_rowid.rowid_block_number(rowid) from scott.test;   

DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------
132
131                                                                                                                                  
--改變132數據塊的內容                                                
[oracle@wang ~]$ dd of=/u01/app/oracle/oradata/DBdb/test.dbf bs=8192 conv=notrunc seek=132 <<eof
> abcdefghijklmnopqrstuvwxyz
> EOF    
0+1 records in
0+1 records out
27 bytes (27 B) copied, 8.484e-05 s, 318 kB/s
[oracle@wang~]$     
                                                         
                                                                           </eof

二、數據邏輯錯誤:logical bad block,邏輯性一般是在物理性結構完整的情況下,數據的內容在含義上不正確  
                                              

--創建range分區表                                                    
SQL> create table scott.emp1 (empno number(4),ename varchar2(10),deptno number(2)) partition by range (deptno)                                     
(partition p1 values less than (10) tablespace users,partition p2 values less than (20) tablespace users, partition p3 values less than (30)) tablespace users;

Table created. 

SQL> conn scott/tiger;
Connected.
SQL>         

SQL> select EMPNO,ENAME,DEPTNO from EMP;

     EMPNO ENAME          DEPTNO
---------- ---------- ----------
      7499 ALLEN              30
      7521 WARD               30
      7566 JONES              20
      7654 MARTIN             30
      7698 BLAKE              30
      7782 CLARK              10
      7788 SCOTT              20
      7839 KING               10
      7844 TURNER             30
      7876 ADAMS              20
      7900 JAMES              30

     EMPNO ENAME          DEPTNO
---------- ---------- ----------
      7902 FORD               20
      7934 MILLER             10

13 rows selected.
                
SQL> insert into scott.emp1 select  EMPNO,ENAME,DEPTNO from SCOTT.EMP where deptno<30;

7 rows created.

SQL> commit;

Commit
                                                       
--EMP1表從數據塊40576號開始的1024個塊(40576+1024=41600)以及從數據塊41600號開始的1024個塊(41600+1024=42624),數據文件是4號。
 
SQL>  select a.file_id,a.block_id,a.blocks,b.name from dba_extents a,v$datafile b  where a.file_id=b.file# and a.owner='SCOTT' and a.segment_name='EMP1';

   FILE_ID   BLOCK_ID     BLOCKS NAME
---------- ---------- ---------- --------------------------------------------------
         4      40576       1024 /u01/app/oracle/oradata/DBdb/users01.dbf
         4      41600       1024 /u01/app/oracle/oradata/DBdb/users01.dbf


--deptno是30的記錄不能插入emp1表                                
SQL> insert into scott.emp1 values(1000,'SCOTT',30);  
insert into scott.emp1 values(1000,'SCOTT',30)
                  *
ERROR at line 1:
ORA-14400: inserted partition key does not map to any partition

                              
--使用交換分區的方式讓emp1表接受deptno為30的行                     
SQL> create table scott.emp2 (empno number(4),ename varchar2(10),deptno number(2)) tablespace users;  

Table created.

SQL> insert into scott.emp2 values(1000,'SCOTT',30);

1 row created.

SQL> alter table scott.emp1 exchange partition p3 with table scott.emp2 without validation;

Table altered.

SQL>                                                                                                                                                      --deptno為30的記錄已插入emp1表                                   
SQL> select * from scott.emp1 partition (p3);   

     EMPNO ENAME          DEPTNO
---------- ---------- ----------
      1000 SCOTT              30

SQL> select * from scott.emp1;

     EMPNO ENAME          DEPTNO
---------- ---------- ----------
      7782 CLARK              10
      7839 KING               10
      7934 MILLER             10
      1000 SCOTT              30
 
SQL> select * from scott.emp2;

     EMPNO ENAME          DEPTNO
---------- ---------- ----------
      7566 JONES              20
      7788 SCOTT              20
      7876 ADAMS              20
      7902 FORD               20
                                                                                                                           
三、oracle提供了很多工具用來檢查數據塊是否損壞,有的可以從物理層面上檢查,有的可以從邏輯層面上檢測 

1.1 DBVERIFY工具,
數據塊的物理錯誤可以通過DBV命令檢查出來
DBVerify - Identify Datafile Block Corruptions

    DBVERIFY identifies Physical and Logical Intra Block Corruptions by default. Dbverify cannot be run for the whole database in a single command. It does not need a database connection either:

[oracle@wang ~]$ dbv file=/u01/app/oracle/oradata/DBdb/test.dbf blocksize=8192

DBVERIFY: Release 11.2.0.4.0 - Production on Wed Nov 8 22:57:05 2017

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

DBVERIFY - Verification starting : FILE = /u01/app/oracle/oradata/DBdb/test.dbf
Page 132 is marked                                            ---檢查test表空間的數據文件可以發現132塊已經損壞。
Corrupt block relative dba: 0x01800084 (file 6, block 132)    --file 6, block 132,與我們自己手工破壞的塊號匹配(scott.test表)
Bad header found during dbv:
Data in bad block:
 type: 97 format: 2 rdba: 0x68676665
 last change scn: 0x6e6d.6c6b6a69 seq: 0x6f flg: 0x70
 spare1: 0x63 spare2: 0x64 spare3: 0x7473
 consistency value in tail: 0x658b0602
 check value in block header: 0x7271
 block checksum disabled

DBVERIFY - Verification complete

Total Pages Examined         : 1280
Total Pages Processed (Data) : 1
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 130
Total Pages Processed (Seg)  : 0
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 1148
Total Pages Marked Corrupt   : 1
Total Pages Influx           : 0
Total Pages Encrypted        : 0
Highest block SCN            : 4023695 (0.4023695)
[oracle@wang ~]$                                
                                                                                                                                                          --檢查users表空間的數據文件沒有發現邏輯錯誤
[oracle@wang ~]$ dbv file=/u01/app/oracle/oradata/DBdb/users01.dbf blocksize=8192    


DBVERIFY: Release 11.2.0.4.0 - Production on Wed Nov 8 23:01:07 2017

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

DBVERIFY - Verification starting : FILE = /u01/app/oracle/oradata/DBdb/users01.dbf


DBVERIFY - Verification complete

Total Pages Examined         : 391520
Total Pages Processed (Data) : 290743
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 12935
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 67340
Total Pages Processed (Seg)  : 0
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 20502
Total Pages Marked Corrupt   : 0
Total Pages Influx           : 0
Total Pages Encrypted        : 0
Highest block SCN            : 4024489 (0.4024489)
[oracle@wang~]$                                                                                                                                                                                              
1.2 RMAN的backup命令                                                 
RMAN - Identify Datafile Block Corruptions

To identify both Physical and Logical Block Corruptions use the "CHECK LOGICAL" option. The next command checks the complete database for both corruptions without actually doing a backup:
添加check logical選項可以檢查邏輯壞塊;

$ rman target /
RMAN>  backup check logical validate

The next command checks the complete database for both corruptions in a backup:

$ rman target /
RMAN> backup check logical database

檢查壞塊,示例:
backup check logical validate datafile 6;
validate check logical datafile 6;

validate database;                                --驗證整個數據庫
validate backupset 22;                            --驗證某個備份文件
validate tablespace users;                        --驗證某個表空間
validate datafile 1;                              --驗證某個數據文件
validate datafile 1 block 10;                     --驗證某個數據文件中的某個塊   
validate check logical datafile 1 BLOCK 5 TO 20;  --檢查數據文件 1 中的數據塊 5 到 20
                                                        
backup validate database;                         --驗證所有文件,包括數據文件、控制文件、參數文件
backup validate datafile 6;                       --驗證6號數據文件      
backup validate datafile 4;                       --驗證4號數據文件

注意:這個命令只是檢查數據庫的壞塊,而不會真正進行備份。從 11g 開始可以省略 backup 子句,而直接使用命令"validate check logical database"。
如果由于缺失文件導致命令失敗,可以增加 'SKIP INACCESSIBLE' 子句來避免這個問題,為了加快檢查速度,可以設置 PARALLELISM 指定多個通道:

壞塊信息會被記錄在視圖 V$DATABASE_BLOCK_CORRUPTION 中。使用如上validate 子句檢查數據文件等后 RMAN 會生成一個 trace 文件,詳細描述壞塊信息

或者備份數據文件,也可以檢查出壞塊。
v$database_block_corruption查看backup操作發現的損壞                             
V$DATABASE_BLOCK_CORRUPTION displays information about database blocks that were corrupted after the last backup.  此視圖只顯示上次備份后損壞的數據庫塊的信息。

參考:http://www.linuxidc.com/Linux/2014-08/105897.htm

1.2.1使用rman備份檢查壞塊:

[oracle@wang ~]$ rman target /

Recovery Manager: Release 11.2.0.4.0 - Production on Wed Nov 8 23:07:46 2017

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

connected to target database: DBDB (DBID=3282897732)

RMAN> backup datafile 6;

Starting backup at 08-NOV-17
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=31 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00006 name=/u01/app/oracle/oradata/DBdb/test.dbf
channel ORA_DISK_1: starting piece 1 at 08-NOV-17
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of backup command on ORA_DISK_1 channel at 11/08/2017 23:07:52
ORA-19566: exceeded limit of 0 corrupt blocks for file /u01/app/oracle/oradata/DBdb/test.dbf

RMAN>               

驗證說明;備份test表空間數據文件時報錯,備份要求數據塊0錯誤??梢允褂靡晥Dv$database_block_corruption查看backup操作發現的損壞的塊。

V$DATABASE_BLOCK_CORRUPTION displays information about database blocks that were corrupted after the last backup.

查詢如下;
SQL> select * from v$database_block_corruption;

     FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
         6        132          1                  0 CORRUPT
 物理壞塊被發現

RMAN> backup datafile 4;

Starting backup at 26-JAN-18
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00004 name=/u01/app/oracle/oradata/DBdb/users01.dbf
channel ORA_DISK_1: starting piece 1 at 26-JAN-18
channel ORA_DISK_1: finished piece 1 at 26-JAN-18
piece handle=/u01/app/oracle/fast_recovery_area/DBDB/newback/DBDB/backupset/2018_01_26/o1_mf_nnndf_TAG20180126T065941_f6nrbxnx_.bkp tag=TAG20180126T065941 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
Finished backup at 26-JAN-18

RMAN>

--再次檢查視圖:
SQL> select * from v$database_block_corruption;

     FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
         6        132          1                  0 CORRUPT

邏輯壞塊未被檢測出來;

1.2.2 使用 validate check logical子句檢查邏輯及物理壞塊
RMAN> validate check logical datafile 6;

Starting validate at 26-JAN-18
using channel ORA_DISK_1
channel ORA_DISK_1: starting validation of datafile
channel ORA_DISK_1: specifying datafile(s) for validation
input datafile file number=00006 name=/u01/app/oracle/oradata/DBdb/test.dbf
channel ORA_DISK_1: validation complete, elapsed time: 00:00:01
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
6    FAILED 0              1148         1280            4177988   
  File Name: /u01/app/oracle/oradata/DBdb/test.dbf
  Block Type Blocks Failing Blocks Processed
  ---------- -------------- ----------------
  Data       0              1               
  Index      0              0               
  Other      1              131             

validate found one or more corrupt blocks
See trace file /u01/app/oracle/diag/rdbms/dbdb/DBdb/trace/DBdb_ora_32387.trc for details
Finished validate at 26-JAN-18

RMAN> validate check logical datafile 4;

Starting validate at 26-JAN-18
using channel ORA_DISK_1
channel ORA_DISK_1: starting validation of datafile
channel ORA_DISK_1: specifying datafile(s) for validation
input datafile file number=00004 name=/u01/app/oracle/oradata/DBdb/users01.dbf
channel ORA_DISK_1: validation complete, elapsed time: 00:00:45
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
4    OK     0              21386        391549          4178643   
  File Name: /u01/app/oracle/oradata/DBdb/users01.dbf
  Block Type Blocks Failing Blocks Processed
  ---------- -------------- ----------------
  Data       0              241463          
  Index      0              55618           
  Other      0              73053           

Finished validate at 26-JAN-18

RMAN> 
未檢查出邏輯壞塊。。。。。。。。。。。。。
                            
 1.3 exp/expdp命令 
exp/expdp命令導出數據庫時會完全掃描每個數據塊,所以也會檢查出數據塊的物理錯誤。

[oracle@wang ~]$ exp scott/tiger owner=scott


Export: Release 11.2.0.4.0 - Production on Thu Nov 9 00:16:08 2017

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


Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export done in ZHS16GBK character set and AL16UTF16 NCHAR character set

About to export specified users ...
. exporting pre-schema procedural objects and actions
. exporting foreign function library names for user SCOTT
. exporting PUBLIC type synonyms
. exporting private type synonyms
. exporting object type definitions for user SCOTT
About to export SCOTT's objects ...
. exporting database links
. exporting sequence numbers
. exporting cluster definitions
. about to export SCOTT's tables via Conventional Path ...
. . exporting table                          BONUS          0 rows exported
. . exporting table                           DEPT          4 rows exported
. . exporting table                            EMP         13 rows exported
. . exporting table                           EMP1
. . exporting partition                             P1          0 rows exported
. . exporting partition                             P2          3 rows exported
. . exporting partition                             P3          1 rows exported     --邏輯錯誤沒檢查出來。
. . exporting table                           EMP2          4 rows exported
. . exporting table                         GRADES          0 rows exported
. . exporting table                           JOBS         13 rows exported
. . exporting table                        STUDENT          0 rows exported
. . exporting table                           TEST
EXP-00056: ORACLE error 1578 encountered
ORA-01578: ORACLE data block corrupted (file # 6, block # 132)                  --檢測出6號數據文件的132號塊損壞
ORA-01110: data file 6: '/u01/app/oracle/oradata/DBdb/test.dbf'
. exporting synonyms
. exporting views
. exporting stored procedures
. exporting operators
. exporting referential integrity constraints
. exporting triggers
. exporting indextypes
. exporting bitmap, functional and extensible indexes
. exporting posttables actions
. exporting materialized views
. exporting snapshot logs
. exporting job queues
. exporting refresh groups and children
. exporting dimensions
. exporting post-schema procedural objects and actions
. exporting statistics
Export terminated successfully with warnings.
                                                   
1.4 ANALYZE語句 
analyze... validate staructure語句可以分析表和索引的邏輯完整性,所以夠檢測出上面例子中分區表的邏輯錯誤。

檢測數據塊損壞(Block Corruption)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">

--analyze語句要求有一張保存分析結果的表,執行utlvalid.sql腳本建立invalid_rows表保存分析結果。

QL> @?/rdbms/admin/utlvalid.sql


Table created.

SQL> desc invalid_rows
 Name                                              Null?    Type
 ---------------------------------------------------------------
 OWNER_NAME                                                 VARCHAR2(30)
 TABLE_NAME                                                 VARCHAR2(30)
 PARTITION_NAME                                             VARCHAR2(30)
 SUBPARTITION_NAME                                          VARCHAR2(30)
 HEAD_ROWID                                                 ROWID
 ANALYZE_TIMESTAMP                                          DATE

SQL>  

--查詢表invalid_rows
SQL> select table_name,partition_name,head_rowid from invalid_rows;  

no rows selected.


--驗證表scott.emp1                              
SYS@orcl> analyze table scott.emp1 validate structure;
                        

Table analyzed.                                                     
                                 
---查看analyze分析結果,可以發現一條rowid為AAASy7AAEAAAAIPAAA的記錄,這條件記錄就是emp1表p3分區中deptno為30的記錄。
SQL> select table_name,partition_name,head_rowid from invalid_rows;  


TABLE_NAME                     PARTITION_NAME                 HEAD_ROWID
------------------------------ ------------------------------ ------------------
EMP1                           P3                             AAAV/vAAEAAAAQlAAA
                        
--根據rowid查詢表對應的邏輯壞塊:                                     
SQL> select * from scott.emp1 where rowid='AAAV/vAAEAAAAQlAAA';

     EMPNO ENAME          DEPTNO
---------- ---------- ----------
      1000 SCOTT              30

--分析表scott.test
SQL> analyze table scott.test validate structure;

Table analyzed.

SQL> select table_name,partition_name,head_rowid from invalid_rows;

TABLE_NAME                     PARTITION_NAME                 HEAD_ROWID
------------------------------ ------------------------------ ------------------
EMP1                           P3                             AAAWERAAEAAAAIMAAA

未發現物理壞塊。。。。。。。。。。。。。。。。。。。。

1.5 DBMS_REPAIR包
DBMS_REPAIR包可以檢查表和索引對象的數據塊損壞情況


--首先需要先建立一張表保存檢查結果,這里是repair_table表(repair是默認生成的表)  

SQL> BEGIN
      DBMS_REPAIR.ADMIN_TABLES(TABLE_NAME => 'REPAIR_TABLE',
                           TABLE_TYPE => dbms_repair.repair_table,
                           ACTION     => dbms_repair.create_action,
                           TABLESPACE => 'USERS');
      END;
      /
                                          
PL/SQL procedure successfully completed.

SQL> desc repair_table
 Name                                      Null?    Type
 ----------------------------------------- -------- -----
 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> select * from repair_table;

no rows selected

--執行check_object存儲過程進行檢測SCOTT.TEST表                            
SQL> SET SERVEROUTPUT ON
SQL> DECLARE num_corrupt INT;
      BEGIN
      num_corrupt :=0;
      DBMS_REPAIR.CHECK_OBJECT(
        SCHEMA_NAME =>'SCOTT',
        OBJECT_NAME =>'TEST',
        REPAIR_TABLE_NAME =>'REPAIR_TABLE',
        CORRUPT_COUNT =>num_corrupt);
        DBMS_OUTPUT.PUT_LINE('number corrupt:' || TO_CHAR(num_corrupt));
        END;
        /  
             
number corrupt:1           --有1個塊損壞

PL/SQL procedure successfully completed.

SQL>                                                                                                                                                      --查詢repair_table檢查是哪個塊出錯。 
SQL> col REPAIR_DESCRIPTION for a50

SQL> col SCHEMA_NAME for a10
SQL> col OBJECT_NAME for a10
SQL>select OBJECT_ID,
       TABLESPACE_ID,
       RELATIVE_FILE_ID,
       BLOCK_ID,
       CORRUPT_TYPE,
       SCHEMA_NAME,
       OBJECT_NAME,
       REPAIR_DESCRIPTION
  from repair_table;

 OBJECT_ID TABLESPACE_ID RELATIVE_FILE_ID   BLOCK_ID CORRUPT_TYPE SCHEMA_NAM OBJECT_NAM REPAIR_DESCRIPTION
---------- ------------- ---------------- ---------- ------------ ---------- ---------- ------------------------------
     90090     7          6                 132      6148         SCOTT      TEST       mark block software
                                                                   
SYS> truncate tablerepair_table; 

                         
Table truncated. 
                                                 
SQL>  select * from repair_table;

no rows selected
                                                               
---接著檢查scott.emp1的邏輯壞塊,檢測發現檢查不來                                    
SQL>  SET SERVEROUTPUT ON
SQL>  DECLARE
        num_corrupt INT;
      BEGIN
        num_corrupt := 0;
        DBMS_REPAIR.CHECK_OBJECT(SCHEMA_NAME       => 'SCOTT',
                                 OBJECT_NAME       => 'EMP1',
                                 REPAIR_TABLE_NAME => 'REPAIR_TABLE',
                                 CORRUPT_COUNT     => num_corrupt);
        DBMS_OUTPUT.PUT_LINE('number corrupt:' || TO_CHAR(num_corrupt));
      END;
      /
 
number corrupt:0

PL/SQL procedure successfully completed.

SQL>                     
 
--檢查表repair_table
SQL> select * from repair_table;


no rows selected
          
注意:DBMS_REPAIR包只能檢查表或者索引上的數據塊錯誤(物理壞塊),如果是段的頭部發生錯誤是無法檢測出來

例如,如下:                                                                          
--查出test表段頭部在130號數據塊。                                     
SQL> select tablespace_id,header_file,header_block from sys_dba_segs where owner='SCOTT' and segment_name='TEST';  

TABLESPACE_ID HEADER_FILE HEADER_BLOCK
------------- ----------- ------------
            7           6          130 
                              

--破壞130號數據塊。                                                  
[oracle@wang ~]$ dd of=/u01/app/oracle/oradata/DBdb/test.dbf bs=8192 conv=notrunc seek=130 <<EOF<eof  
> abcdefghijklmnopqrstuvwxyz  
> EOF
0+1 records in
0+1 records out
29 bytes (29 B) copied, 0.00015142 s, 192 kB/s
[oracle@wang ~]$  
                                                                       

SQL>  SET SERVEROUTPUT ON                                      
SQL>  DECLARE num_corrupt INT;
      BEGIN
      num_corrupt :=0;
      DBMS_REPAIR.CHECK_OBJECT(
        SCHEMA_NAME =>'SCOTT',
        OBJECT_NAME =>'TEST',
        REPAIR_TABLE_NAME =>'REPAIR_TABLE',
        CORRUPT_COUNT =>num_corrupt);
        DBMS_OUTPUT.PUT_LINE('number corrupt:' || TO_CHAR(num_corrupt));
        END;
        /                                 

number corrupt:1          --還是只有1個塊損壞。

PL/SQL procedure successfully completed.
                   
--查詢repair_table檢查只有132號塊有錯。                             
SQL>select OBJECT_ID,
       TABLESPACE_ID,
       RELATIVE_FILE_ID,
       BLOCK_ID,
       CORRUPT_TYPE,
       SCHEMA_NAME,
       OBJECT_NAME,
       REPAIR_DESCRIPTION
  from repair_table;

 OBJECT_ID TABLESPACE_ID RELATIVE_FILE_ID   BLOCK_ID CORRUPT_TYPE SCHEMA_NAM OBJECT_NAM REPAIR_DESCRIPTION
---------- ------------- ---------------- ---------- ------------ ---------- ----------
     90090             7                6        132         6148 SCOTT      TEST       mark block software corrupt
                                                             
--而使用DBV命令檢查test表空間數據文件可以看到結果中有2個數據塊錯誤。
[oracle@wang ~]$ dbv file=/u01/app/oracle/oradata/DBdb/test.dbf blocksize=8192    

DBVERIFY: Release 11.2.0.4.0 - Production on Thu Nov 9 01:11:39 2017

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

DBVERIFY - Verification starting : FILE = /u01/app/oracle/oradata/DBdb/test.dbf
Page 130 is marked corrupt
Corrupt block relative dba: 0x01800082 (file 6, block 130)            --file 6, block 130壞塊
Bad header found during dbv:
Data in bad block:
 type: 97 format: 2 rdba: 0x68676665
 last change scn: 0x6e6d.6c6b6a69 seq: 0x6f flg: 0x70
 spare1: 0x63 spare2: 0x64 spare3: 0x7473
 consistency value in tail: 0x658f2301
 check value in block header: 0x7271
 block checksum disabled

Page 132 is marked corrupt
Corrupt block relative dba: 0x01800084 (file 6, block 132)            --file 6, block 132壞塊
Bad header found during dbv:
Data in bad block:
 type: 97 format: 2 rdba: 0x68676665
 last change scn: 0x6e6d.6c6b6a69 seq: 0x6f flg: 0x70
 spare1: 0x63 spare2: 0x64 spare3: 0x7473
 consistency value in tail: 0x658b0602
 check value in block header: 0x7271
 block checksum disabled

DBVERIFY - Verification complete

Total Pages Examined         : 1280
Total Pages Processed (Data) : 1
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 129
Total Pages Processed (Seg)  : 0
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 1148
Total Pages Marked Corrupt   : 2
Total Pages Influx           : 0
Total Pages Encrypted        : 0
Highest block SCN            : 4023692 (0.4023692)
[oracle@wang ~]$

MOS:處理 Oracle 塊損壞 (文檔 ID 1526911.1)


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女