Recuperando Tablespace Undo Tablespace sem Backup

Por Josue Araujo Pirolo
Postado em Julho 2016

Revisado por Marcelo Pivovar - Solution Architect

Para este artigo, utilizo o Oracle Database Express Edition, Versão 11g Release 11.2.0.2, mas é aplicável para versões 10gR2 e 11g tanto em suas versões Express Edition quanto SS, EE.

Para este cenário teremos um problema, e será aplicada uma solução rápida e prática. O DATAFILE 3 (UNDOTBS01) estará corrompido e será necessário abrir a instância, mas não temos backup para restaurar o DATAFILE.

Para melhor entendimento iremos rever o que é a tablespace UNDOTBS1 e para que serve.
Oracle Database possue um método que mantém informações sobre rollback e alterações de dados na database. Essas informações são basicamente registros de ações realizadas por transações, antes de serem gravadas (COMMIT). Esses registros são referidos como UNDO.

Registros de Undo são usados para:

  • Desfazer transações quando um comando ROLLBACK é requerido
  • Recuperar a Database
  • Prover Consistência de Leitura
  • Utilizado para análise de dados em um ponto específico no passado, utilizando Oracle Flashback Query

Quando um comando ROLLBACK é chamado, os registros de UNDO são utilizados para desfazer alterações feitas por transações sem commit. Assim, a Tablespace UNDOTBS1 é utilizada para armazenar os registros de UNDO.

Segue os passos para a recuperação da UNDOTBS1.

  1. Identique o erro que está impedindo a instância de ser aberta.
  2. Consulte o arquivo de log do Oracle Database e veja o Erro.

    $ORACLE_BASE/diag/rdbms/xe/XE/trace/alert_XE.log
    
    

  3. Vemos que o datafile 3 está corrompido ou não existe. Assim, vamos executar shutdown e inciar a database em estado MOUNT.
  4. Inicie a instância em modo MOUNT e remova o datafile undotbs01.dbf do Arquivo de Controle para abrir a database.
  5. Agora que abriu a instância, vamos criar um PFILE através do SPFILE.
  6. Agora vamos tentar remover a tablespace UNDOTBS1 juntamente com seu datafile.
  7. Neste caso a tablespace não poderá ser removida, pois a database está utilizando ela. Para contornar este problema, vamos criar uma nova UNDO TABLESPACE e deixa-lá com padrão na database.

  8. Configurar a tablespace UNDOTBS2 como padrão para a database.
  9. Dê um SHUTDOWN na instância e edite o arquivo de parâmentros.

    Vamos editar o arquivo de parâmetros que criamos (PFILE_2016-07-18.ora) desabilitando gerenciamento automático de UNDO e especificando a tablespace UNDOTBS2 como tablespace principal de UNDO.

    #undo_management=AUTO
    undo_tablespace=UNDOTBS2

  10. Agora, iremos iniciar a instância passando o PFILE como arquivo de parâmetros a ser lido pela instância.
  11. Agora, iremos tentar remover a tablespace UNDOTBS1 novamente.
  12. Este erro informa que existem segmentos de rollback ativos na UNDOTBS1, sendo assim necessário remover estes segmentos antes de prosseguir.

  13. Para remover os segmentos de ROLLBACK, precisamos identificar quais são eles. Neste caso execute a query abaixo:
  14. Agora, precisamos especificar no PFILE, que esses segmentos serão ignorados na inicialização.
  15. Excute SHUTDOWN na instância, abra o PFILE e adicione a seguinte linha:

    _corrupted_rollback_segments=('_SYSSMU21_3466362406$', '_SYSSMU22_3463777017$','_SYSSMU23_1327637529$',
    '_SYSSMU24_3101492136$','_SYSSMU25_788758383$','_SYSSMU26_3251645214$', 
    '_SYSSMU27_2117068631$','_SYSSMU28_1631918910$','_SYSSMU29_4012739354$', _SYSSMU30_3446750398$')

  16. Inicie a instância e remova os segmentos de ROLLBACK que foram marcados para ignorar.
  17. Agora, podemos ver que todos os segmentos de rollback estão online na tablespace UNDOTBS2.
  18. Agora vamos tentar remover a tablespace UNDOTBS1 juntamente com seu datafile.
  19. Recrie a tablespace UNDOTBS1.
  20. Execute SHUTDOWN na instância e comente a linha dos segmentos a serem ignorados e remova o comentário  da linha de UNDO_MANAGEMENT, e por fim altere a tablespace padrão de UNDO para UNDOTBS1.
  21. Inicie a instância com o PFILE novamente, crie um SPFILE do PFILE, execute shutdown novamente e inicie novamente a database apenas com o comando startup.

 


Josue Pirolo é DBA Oracle, formado em Redes de Computadores, é especialista em Administração e Infraestrutura de Banco de Dados Oracle. Experiência e Conhecimentos sólidos em Sistemas Operacionais. Sempre buscando melhorar seus conhecimentos e agregar valor aos ambientes em que atua, sempre buscando propagar conhecimento sobre Oracle Database. Trabalha com Oracle há mais de 6 anos.

Este artigo foi revisto pela equipe de produtos Oracle e está em conformidade com as normas e práticas para o uso de produtos Oracle.