Pular para o conteúdo
  • Este tópico contém 6 respostas, 4 vozes e foi atualizado pela última vez 14 anos, 4 meses atrás por jspaulonci.
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #101568
    DBA_LUCAS
    Participante

      Ai 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 ???

      #101571
      rman
      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.

        #101579
        felipeg
        Participante

          Lucas,

          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.

          #101580
          felipeg
          Participante

            Outra 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 – 1

            Atenciosamente,
            Felipe.

            #101583
            DBA_LUCAS
            Participante

              Muito 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'
                          THEN 
              

              DBMS_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 CORRUPT 
              

              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’);

                          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)

              #101585
              felipeg
              Participante

                Lucas,

                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.

                #101587
                jspaulonci
                Participante

                  Parabens 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

                Visualizando 7 posts - 1 até 7 (de 7 do total)
                • Você deve fazer login para responder a este tópico.