如何修复未格式化的坏块

李华 2019-04-03
100
0 0
摘要:oracle11.2.0.1,oslinux6.6,存在一个坏块,后面发现对象是一个索引,对索引rebuild重建后,这个坏块还是存在,请...

问题描述

oracle11.2.0.1,os linux 6.6,存在一个坏块,后面发现对象是一个索引,对索引rebuild重建后,这个坏块还是存在,请教一下如何处理 

现在的这个block 没有对象了,在dba_extents上面找不到记录了

专家解答

--未格式化的
See trace file /oracle/diag/rdbms/orcl/orcl1/trace/orcl1_ora_12278.trc for details
Reread of blocknum=1322478, file=+DATA/orcl/datafile/users02.dbf. found same corrupt data
Reread of blocknum=1322478, file=+DATA/orcl/datafile/users02.dbf. found same corrupt data
Reread of blocknum=1322478, file=+DATA/orcl/datafile/users02.dbf. found same corrupt data
Reread of blocknum=1322478, file=+DATA/orcl/datafile/users02.dbf. found same corrupt data
Reread of blocknum=1322478, file=+DATA/orcl/datafile/users02.dbf. found same corrupt data
 
SQL> select file_id,tablespace_name from dba_data_files where file_name='+DATA/orcl/datafile/users02.dbf';
   FILE_ID
----------
        83
set lines 300 pages 300
col tablespace_name for a20
col segment_type for a15
col owner for a30
col segment_name for a30
col partition_name for a30
SELECT tablespace_name,  
         segment_type,  
         owner,  
         segment_name,  
         partition_name  
    FROM dba_extents  
  WHERE file_id = 83 AND 1322478 BETWEEN block_id AND block_id + blocks - 1; 
no rows selected  
--不属于任何对象,未格式化
SQL> conn system/oracle
Connected.
create table s (
       n number,
       c varchar2(4000)
     ) nologging tablespace USERS pctfree 99; --加快插入速度
Table created.
SQL> select blocks from v$datafile where file#=83;
   BLOCKS
----------
   2621440
SQL> select (2621440-1322478)*8192/1024/1024 from dual;
(2621440-1322478)*8192/1024/1024
--------------------------------
                      10148.1406
--指定extent 为'+DATA/orcl/datafile/users02.dbf'
SQL> alter table system.s allocate extent(datafile '+DATA/orcl/datafile/users02.dbf' size 10158m);
Table altered.
--已经把坏块包含到对象中
SQL> set lines 300 pages 300
col tablespace_name for a20
col segment_type for a15
col owner for a30
col segment_name for a30
col partition_name for a30
SELECT tablespace_name,  
         segment_type,  
         owner,  
         segment_name,  
         partitSQL> ion_name  
    FROM dba_extents  
  WHERE file_id = 83 AND 1322478 BETWEEN block_id AND block_id + blocks - 1; SQL> SQL> SQL> SQL> SQL>   2    3    4    5    6    7  
TABLESPACE_NAME      SEGMENT_TYPE    OWNER                          SEGMENT_NAME                   PARTITION_NAME
-------------------- --------------- ------------------------------ ------------------------------ ------------------------------
USERS                TABLE           SYSTEM                         S
--sys建corrupt_trigger
CREATE OR REPLACE TRIGGER corrupt_trigger 
  AFTER INSERT ON system.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)=1322478)
 and (dbms_rowid.rowid_relative_fno(:new_p.rowid)=83) THEN 
     RAISE corrupt; 
  END IF; 
EXCEPTION 
  WHEN corrupt THEN 
     RAISE_APPLICATION_ERROR(-20000, 'Corrupt block has been formatted'); 
END; 
/
--插入数据
Begin
  FOR i IN 1..1000000000 loop
    for j IN 1..1000 loop
      Insert into system.s VALUES(i,'x');
    end loop;
    commit;
  END LOOP;
END; 
/
--直到出现这个报错
ERROR at line 1:
ORA-20000: Corrupt block has been formatted
ORA-06512: at "SYS.CORRUPT_TRIGGER", line 10
ORA-04088: error during execution of trigger 'SYS.CORRUPT_TRIGGER'
ORA-06512: at line 4
--验证,已经没有坏块
RMAN> validate check logical datafile 83 block 1322478;
Starting validate at 05-JUN-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=00083 name=+DATA/orcl/datafile/users02.dbf
channel ORA_DISK_1: validation complete, elapsed time: 00:00:03
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
83   OK     0              0            1               13222753051654
  File Name: +DATA/orcl/datafile/users02.dbf
  Block Type Blocks Failing Blocks Processed
  ---------- -------------- ----------------
  Data       0              1               
  Index      0              0               
  Other      0              0               
Finished validate at 05-JUN-18
RMAN> validate datafile 83 block 1322478;
Starting validate at 05-JUN-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=00083 name=+DATA/orcl/datafile/users02.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
---- ------ -------------- ------------ --------------- ----------
83   OK     0              0            1               13222753051654
  File Name: +DATA/orcl/datafile/users02.dbf
  Block Type Blocks Failing Blocks Processed
  ---------- -------------- ----------------
  Data       0              1               
  Index      0              0               
  Other      0              0               
Finished validate at 05-JUN-18
--删除
drop table system.s purge;
「喜欢文章,快来给作者赞赏墨值吧」

评论

0
0
Oracle
订阅
欢迎订阅Oracle频道,订阅之后可以获取最新资讯和更新通知。
墨值排行
今日本周综合
近期活动
全部
相关课程
全部