Formatando um bloco corrompido que não está sendo utilizado.



Durante a execução de um backup rman full o ambiente estava apresentando ORA-19566, que sinaliza a existência de bloco corrompido.

Consultando o alertlog é possível identificar o file_id e o numero do bloco do datafile que apresentou corrupção.
Hex dump of (file 83, block 1189949) in trace file /oracle/diag/rdbms/teste/teste/trace/teste_ora_44349.trc
Corrupt block relative dba: 0x14d2283d (file 83, block 1189949)
Fractured block found during backing up datafile
Data in bad block:
type: 6 format: 2 rdba: 0x14d2283d
last change scn: 0x0008.99c1d8d5 seq: 0x1 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x08d60601
check value in block header: 0x688d
computed block checksum: 0xd003
Reread of blocknum=1189949, file=/u02/oracle/oradata/teste/dbf/teste_index30.dbf. found same corrupt data
Executando um dbv no datafile que apresentou corrupção é possível confirmar que o mesmo possuí 2 blocos corrompidos
dbv file=/u02/oracle/oradata/teste/dbf/teste_index30.dbf
DBVERIFY: Release 11.2.0.3.0 - Production on Thu Nov 14 14:35:17 2013
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
DBVERIFY - Verification starting : FILE = /u02/oracle/oradata/teste/dbf/teste_index30.dbf
Page 1189949 is influx - most likely media corrupt
Corrupt block relative dba: 0x14d2283d (file 83, block 1189949)
Fractured block found during dbv:

Data in bad block:
type: 6 format: 2 rdba: 0x14d2283d
last change scn: 0x0008.99c1d8d5 seq: 0x1 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x08d60601
check value in block header: 0x688d
computed block checksum: 0xd003
Page 1189955 is influx - most likely media corrupt
Corrupt block relative dba: 0x14d22843 (file 83, block 1189955)
Fractured block found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x14d22843
last change scn: 0x000e.d020f484 seq: 0x1 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x24870601
check value in block header: 0x23e
computed block checksum: 0xd003
DBVERIFY - Verification complete
Total Pages Examined : 1280000
Total Pages Processed (Data) : 1024
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 1274522
Total Pages Failing (Index): 0
Total Pages Processed (Other): 3606
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 846
Total Pages Marked Corrupt : 2
Total Pages Influx : 2
Total Pages Encrypted : 0
Highest block SCN : 1996079124 (16.1996079124)
Agora, irei verificar se o bloco que apresentou corrupção está sendo utilizado por algum objeto.
select segment_name, segment_type, owner
from dba_extents 
where file_id = 83 
and 1189949 between block_id 
and block_id + blocks -1;
no rows selected
Tendo em vista que o bloco corrompido não está associado a nenhum objeto, estarei formatando o mesmo. O processo de formatação consiste basicamente em utilizar o bloco corrompido. Para isso, criarei uma tabela, alocando espaço apenas datafile com bloco corrompido e irei inserir dados até que o bloco seja utilizado

A tabela será criado abaixo do owner scott para realizar o processo. Essa tabela deverá ter como default tablespace, a tablespace que apresentou corrupção no datafile.
connect scott/tiger 
create table s ( 
n number, 
c varchar2(4000) 
) nologging tablespace TESTE_INDEX;
Após criada a tabela, estarei alterando o pactfree da mesma para 95%, assim reduzirei a quantidade de inserções necessárias para alocar o bloco.
ALTER TABLE S PCTFREE 95; 
Também criarei uma trigger para que informe quando o bloco corrompido for preenchido. Deve ser colocado o file_id e o numero do bloco corrompido na trigger abaixo.
conn sys/senha 
CREATE OR REPLACE TRIGGER corrupt_trigger 
AFTER INSERT ON scott.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; 
/
Após criar a trigger, será alocado espaço para a tabela criada, no datafile afetado. Para isso será necessário identificar primeiro o extend size do datafile e depois alocar espaço na tabela.
Select BYTES from dba_free_space where file_id=<Absolute file number> and <corrupt block number> between block_id and block_id + blocks -1; 

BYTES 
---------- 
9437184
Alocar espaço no datafile afetado com o comando abaixo, onde 9k representa o tamanho do extend (9437184/1024/1024):
BEGIN 
for i in 1..1000000 loop 
EXECUTE IMMEDIATE 'alter table scott.s allocate extent (DATAFILE '||'''/u02/oracle/oradata/teste/dbf/teste_index30.dbf''' ||'SIZE 9K) '; 
end loop; 
end ; 
/
Agora serão inseridos dados na tabela até que o bloco corrompido seja preenchido.
Begin
FOR i IN 1..1000000000 loop
for j IN 1..1000 loop
Insert into scott.s VALUES(i,'x');
end loop;
commit;
END LOOP;
END;


Begin
*
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
Após a execução do processo, rodando um novo dbv é possível constatar que não existe mais corrupção.
dbv file=/u02/oracle/oradata/TASY/dbf/tasy_index30.dbf 
DBVERIFY: Release 11.2.0.3.0 - Production on Thu Nov 14 16:42:23 2013 
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. 
DBVERIFY - Verification starting : FILE = /u02/oracle/oradata/TASY/dbf/tasy_index30.dbf 
DBVERIFY - Verification complete 
Total Pages Examined : 1280000 
Total Pages Processed (Data) : 838227 
Total Pages Failing (Data) : 0 
Total Pages Processed (Index): 436835 
Total Pages Failing (Index): 0 
Total Pages Processed (Other): 4092 
Total Pages Processed (Seg) : 0 
Total Pages Failing (Seg) : 0 
Total Pages Empty : 846 
Total Pages Marked Corrupt : 0 
Total Pages Influx : 0 
Total Pages Encrypted : 0 
Highest block SCN : 2008040755 (16.2008040755)
Fonte: https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=66983570965143&id=336133.1&_afrWindowMode=0&_adf.ctrl-state=vmrpe4j2a_4

Comentários