記一次Oracle壞塊修複過程

來源:互聯網
上載者:User

記一次Oracle壞塊修複過程

昨天接備份同事電話反應在進行RMAN冷備的過程中報如下錯,某個資料表空間備份失敗。
RMAN-00571: ===========================================================
 RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
 RMAN-00571: ===========================================================
 RMAN-03009: failure of backup command on ch00 channel at 04/25/2015 22:02:30
 ORA-19566: exceeded limit of 0 corrupt blocks for file +DATA/dbrac/datafile/tbs_11.11.435678937

經過分析發現壞塊導致,且壞塊不屬於任何對象(空塊),以下是本次壞塊修複步驟:
1、尋找壞塊
1)使用RMAN尋找壞塊
 驗證整個資料庫:
Rman> backup validate check logical database ;
註:當資料庫版本低於11g且非歸檔模式,以上命令必須在資料庫處於mounted狀態執行
 驗證單個datafile
 Rman> backup validate check logical datafile 11 ;
而後執行以下SQL查看壞塊:
SQL>Select * from v$database_block_corruption ;

例如:
validate.sh
 #!/bin/bash
 source /home/Oracle/.bash_profile
 $ORACLE_HOME/bin/rman log=/home/oracle/users/validate.log <<EOF
 connect target /
 Backup validate check logical datafile 11 ;
 exit;
 EOF

 2)使用DBV尋找壞塊:
dbv userid=system/system  file='+DATA/dbrac/datafile/tbs_11.11.435678937'    blocksize=32768

 2、確認壞塊是否不屬於任何對象
select segment_name, segment_type, owner
        from dba_extents
      where file_id = <Absolute file number>
        and <corrupted block number> between block_id
            and block_id + blocks  -1;
例如:
alter session force parallel query parallel 10;
 select  segment_name, segment_type, owner
        from dba_extents
      where file_id = 11
        and 184959440 between block_id
            and block_id + blocks  -1;
           
 3、確認塊在 dba_free_space存在
Select * from dba_free_space where file_id= <Absolute file number>
      and <corrupted block number> between block_id and block_id + blocks -1;
例如:
Select * from dba_free_space where file_id= 11    and 184959440 between block_id and block_id + blocks -1;
     
 4、建立表
create table s (
      n number,
        c varchar2(4000)
      ) nologging tablespace <tablespace name having the corrupt block> pctfree 99;
例如:
create table users.s (
      n number,
        c varchar2(4000)
      ) nologging tablespace TBS_11 pctfree 99;


 select segment_name,tablespace_name from dba_segments
      where segment_name='S' ;
     
 Select table_name,tablespace_name from dba_tables where table_name='S' ;
     
 5、建立觸發器
CREATE OR REPLACE TRIGGER corrupt_trigger
  AFTER INSERT ON users.s
  REFERENCING OLD AS p_old NEW AS new_p
  FOR EACH ROW
 DECLARE
  corrupt EXCEPTION;
 BEGIN
  IF (dbms_rowid.rowid_block_number(:new_p.rowid)=&blocknumber)
  and (dbms_rowid.rowid_relative_fno(:new_p.rowid)=&filenumber) THEN
      RAISE corrupt;
  END IF;
 EXCEPTION
  WHEN corrupt THEN
      RAISE_APPLICATION_ERROR( -20000, 'Corrupt block has been formatted');
 END;
 /

 6、分配空間建立在有壞塊的datafile上的表
 註:
i)因為ASSM會自動確定下一個區段的大小,所以在ASSM的資料表空間上,需要建立多個表及
 不斷的分配空間給這些表,直到壞塊被分配至其中一個對象。
ii)設定datafile的AUTOEXTEND為OFF

 1)尋找壞塊的extent size
 Select BYTES from dba_free_space where file_id=<file no> and <corrupt block no> between
 block_id and block_id + blocks  -1;

例如:
alter database datafile '+DATA/dbrac/datafile/tbs_11.11.435678937' autoextend off;

 SQL> Select BYTES from dba_free_space where file_id=11 and 184959440 between
  2  block_id and block_id + blocks  -1;


      BYTES
 ----------
  29360128

 2)不斷allocate直到壞塊是S表的一部分
 如果步驟1輸出結果是64K,執行以下SQL:
alter table users.s
 allocate extent (DATAFILE '+DATA/dbrac/datafile/tbs_11.11.435678937' SIZE 64K);

如果大於64K使用以下
BEGIN
 for i in 1..1000000 loop
 EXECUTE IMMEDIATE 'alter table users.s allocate extent (DATAFILE '||'''+DATA/dbrac/datafile/tbs_11.11.435678937'''||'SIZE 64K) ';
 end loop;
 end ;
 /


使用如下SQL查詢壞塊是否已屬於某個對象:
select segment_name, segment_type, owner
        from dba_extents
      where file_id = <Absolute file number>
        and <corrupt block number> between block_id
            and block_id + blocks  -1 ;


例如:
select segment_name, segment_type, owner
        from dba_extents
      where file_id = 11
        and 184959440 between block_id
            and block_id + blocks  -1 ;
           
 3)插入資料初始化壞塊
Begin
 FOR i IN 1..1000000000 loop
    for j IN 1..100000 loop
      Insert into users.s VALUES(i,'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
    end loop;
    commit;
 END LOOP;
 END;

 7、驗證是否存在壞塊
Rman> Backup validate check logical datafile <fileno> ;
或者validate datafile <fileno> block <blockno reported corrupt>, <blockno reported corrupt>  ;
 Select * from v$database_block_corruption ;
例如:
validate datafile 11  block 184959440, 184961480,184961481 ;
 Select * from v$database_block_corruption ;

 8、當第7步確認壞塊已消除,即可刪除測試表
DROP TABLE users.s purge;

 9、切換多次日誌及checkpoint
 Alter system switch logfile ;
 Alter system checkpoint ;

 10、刪除觸發器
DROP trigger CORRUPT_TRIGGER ;
 DROP trigger corrupt_trigger1 ;
 DROP trigger corrupt_trigger2 ;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.