- Este tópico contém 6 respostas, 4 vozes e foi atualizado pela última vez 14 anos, 4 meses atrás por
jspaulonci.
-
AutorPosts
-
10 de novembro de 2011 às 8:18 pm #101568
DBA_LUCAS
ParticipanteAi galera , deu uma zebra grande agora ! Depois de muita luta para chegar a configuração ideal para o server oracle uma de minhas tablespaces deram o seguinte erro:
ORA-01578 bloco de dados oracle danificado (arquivo num 81, bloco num 91349)
ORA-01110: 81 do arquivo de dados: ‘/u02/app/oracle/oradata/oracle/sap77.dbf’alguem pode me ajudar ???
10 de novembro de 2011 às 8:36 pm #101571rman
Participante@DBA_LUCAS
Para verificar se não existe outros blocos corrompidos utilize o DBV e para corrigi-los utilize o DBMS_REPAIR.
Segue artigo para maiores detalhes:
http://www.oracle-base.com/articles/8i/ … uption.php
Poste o resultado depois, ainda não tive oportunidade de encontrar um bloco corrompido.
10 de novembro de 2011 às 9:31 pm #101579felipeg
ParticipanteLucas,
Você já tem backup feito pelo RMAN?
Se tiver é bem mais simples, fácil e com nenhuma perda (se tiver archive).http://download.oracle.com/docs/cd/B283 … mblock.htm
@Rman, lembrando que com o DBMS_REPAIR é grande a chance de você ficar sem os dados da tabela, portanto é meio perigoso se for produção.
Atenciosamente,
Felipe.10 de novembro de 2011 às 9:38 pm #101580felipeg
ParticipanteOutra coisa,
Estamos pressupondo que é uma tabela, pode ser um index, ai é ainda mais fácil.
Tente descobrir qual o objeto está naquele bloco
SELECT SEGMENT_NAME, SEGMENT_TYPE, RELATIVE_FNO
FROM DBA_EXTENTS
WHERE FILE_ID =
AND BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS – 1Atenciosamente,
Felipe.10 de novembro de 2011 às 10:28 pm #101583DBA_LUCAS
ParticipanteMuito obrigado pela ajuda Felipe , Utilizei uma procedure ao invés do dbms para a recuperação e deu certo , segue abaixo o passo a passo:
*Select para verificar o tipo de objeto que esta corrompido.
select tablespace_name, relative_fno,
segment_type, owner, segment_name
from dba_extents
where file_id =
and between block_id and block_id + blocks -1*Procedure para recuperar o arquivo de dados:
CREATE OR REPLACE PROCEDURE “SYS”.”UTLVERBLK” (PSCHEMA IN
VARCHAR2, /* SCHEMA NAME, OWNER /
POBJECT IN VARCHAR2,
/ OBJECT_NAME /
POBJTYP IN NUMBER) IS
/ 1-TABLE, 2-INDEX, 3-CLUSTER /
/PROCEDURE............UTLVERBKL FUNCAO...............RESOLVER PROBLEMA DE CORRUPTED BLOCK DATA.................14/03/2004 AUTHOR...............RENAN MEDEIROS */ CRITAB VARCHAR2(1) := 'S'; NUMBLK BINARY_INTEGER := 0; BEGIN /* VERIFICA SE PRECISA CRIAR TABELA DE REPARO */ BEGIN SELECT 'N' INTO CRITAB FROM USER_TABLES WHERE TABLE_NAME ='REPAIR_UTLVERBLK_TAB_'||POBJTYP; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; END; DBMS_OUTPUT.ENABLE (120000); IF CRITAB = 'S' THENDBMS_REPAIR.ADMIN_TABLES(‘REPAIR_UTLVERBLK_TAB_’||POBJTYP,1,POBJTYP);
END IF;
DBMS_REPAIR.CHECK_OBJECT ( PSCHEMA,
POBJECT,
NULL,
POBJTYP,‘REPAIR_UTLVERBLK_TAB_’||POBJTYP,
NULL,
NULL,
NULL,
NULL,
NUMBLK);DBMS_OUTPUT.PUT_LINE('UTLVERBLK V.1.0/14/03/2005 - CHECK OBJECT– ‘||TO_CHAR(SYSDATE,’DD/MM/YYYY-HH24:MI:SS’));
DBMS_OUTPUT.PUT_LINE(‘== SCHEMA => ‘||PSCHEMA);
DBMS_OUTPUT.PUT_LINE(‘== OBJECT => ‘||POBJECT);
DBMS_OUTPUT.PUT_LINE(‘== OBJTYPE => ‘||POBJTYP||’ – 1=>
TABLE, 2=> INDEX, 3=> CLUSTER’);
DBMS_OUTPUT.PUT_LINE(‘== BLOCKS => ‘||NUMBLK);
DBMS_OUTPUT.PUT_LINE(‘== REPAIRTAB =>
REPAIR_UTLVERBLK_TAB_’||POBJTYP);DBMS_REPAIR.FIX_CORRUPT_BLOCKS( PSCHEMA, POBJECT, NULL, POBJTYP,‘REPAIR_UTLVERBLK_TAB_’||POBJTYP,
NULL,
NUMBLK);
DBMS_OUTPUT.PUT_LINE(‘UTLVERBLK V.1.0-14/03/2005 – FIX
CORRUPTED BLOCKS – ‘||TO_CHAR(SYSDATE,’DD/MM/YYYY-HH24:MI:SS’));
DBMS_OUTPUT.PUT_LINE(‘== SCHEMA => ‘||PSCHEMA);
DBMS_OUTPUT.PUT_LINE(‘== OBJECT => ‘||POBJECT);
DBMS_OUTPUT.PUT_LINE(‘== OBJTYPE => ‘||POBJTYP||’ – 1=>
TABLE, 2=> INDEX, 3=> CLUSTER’);
DBMS_OUTPUT.PUT_LINE(‘== BLOCKS => ‘||NUMBLK);DBMS_REPAIR.SKIP_CORRUPT_BLOCKS(PSCHEMA, POBJECT, POBJTYP, 1); DBMS_OUTPUT.PUT_LINE('UTLVERBLK V.1.0-14/03/2005 - SKIP CORRUPTBLOCKS – ‘||TO_CHAR(SYSDATE,’DD/MM/YYYY-HH24:MI:SS’));
DBMS_OUTPUT.PUT_LINE(‘== SCHEMA => ‘||PSCHEMA);
DBMS_OUTPUT.PUT_LINE(‘== OBJECT => ‘||POBJECT);
DBMS_OUTPUT.PUT_LINE(‘== OBJTYPE => ‘||POBJTYP||’ – 1=>
TABLE, 2=> INDEX, 3=> CLUSTER’);END UTLVERBLK;/
*Executar procedure
SET SERVEROUTPUT ON;
EXEC UTLVERBLK(‘OWNER’,’OBJECT_NAME’,OBJECT_TYPE);
sendo que OBJECT_TYPE=1 (TABLE), OBJECT_TYPE=2 (INDEX) e OBJECT_TYPE=3 (CLUSTER)
10 de novembro de 2011 às 11:24 pm #101585felipeg
ParticipanteLucas,
Basicamente essa atividade faz o processo com o DBMS_REPAIR como o @rman falou.
Lembrando novamente que o DBMS_REPAIR tem suas vantagens pois pode recuperar o bloco sem derrubar nada porém é grande a chance de perda de dados quando se trata de tabelas.
Sugiro, caso você não tenha, backups com rman, e base em archivedlog.
Depois disso é só sempre validar os backups e se precisar BMR neles!Parabéns pela solução.
Atenciosamente,
Felipe.11 de novembro de 2011 às 1:10 pm #101587jspaulonci
ParticipanteParabens galera, é isso aí, acredito que uma boa soluação seja realmente o BMR (block media recover), se a base é produção não perca tempo de coloca-la em archive e RMAN fazendo o backup
-
AutorPosts
- Você deve fazer login para responder a este tópico.