Picture of Roberto Sobrinho
Roberto Sobrinho

17/05/2024

Como Resolver a Perda Definitiva da Tablespace de UNDO no Oracle Database

Olá “abigos” e “abigas“, hoje vou comentar a respeito dos procedimentos para recuperar um banco de dados Oracle que perdeu a sua área de UNDO de forma abrupta. A tablespace de UNDO é super importante no banco de dados Oracle, nela ficam armazenadas informações que permitem executar rollback das transações e garantir que tudo funcione perfeitamente. Perder essa tablespace pode causar muitos problemas, inclusive a perda de transações alem da indisponibilidade do ambiente. Mas não se preocupe! Vou te mostrar como resolver isso passo a passo, começando com uma simulação do erro.

🚀🚀🚀 Vamos lá! Bó Bó 🚀🚀🚀

O Que é a Tablespace de UNDO?

A tablespace de UNDO guarda informações necessárias para realizar rollback das transações, ler dados de forma consistente e recuperar o banco de dados após uma falha não esperada.

Simulando a Geração de Dados na Tablespace de UNDO e a Perda da Mesma

Vamos primeiro gerar dados na tablespace de UNDO por meio de uma transação. Atenção: Não faça isso em um ambiente de produção. É só para fins educativos.

Passo 1: Criar uma Tabela de Exemplo

Crie uma tabela de exemplo para usar na transação:

CREATE TABLE teste_undo (
    id NUMBER,
    descricao VARCHAR2(100)
);

Passo 2: Iniciar uma Transação e Inserir Dados

Inicie uma transação e insira alguns dados:

BEGIN
    FOR i IN 1..100000 LOOP
        INSERT INTO teste_undo VALUES (i, 'Cavalo de Fogo '|| i);
    END LOOP;
    -->> Não vamos emitir commit ou rollback para a transação ficar ativa na UNDO
END;

Passo 3: Identificar o Datafile da Tablespace de UNDO

Identifique o datafile associado à tablespace de UNDO:

SELECT FILE_NAME FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'UNDOTBS1';

Passo 4: Remover o Datafile da UNDO

No utilitario asmcmd, remova o datafile da tablespace de UNDO.

cat ~/.bash_profile > /u01/app/oracle/oradata/XE/undotbs1.dbf

Passo 5: Tentar Realizar Operações no Banco de Dados

Agora, tente realizar algumas operações no banco de dados. Você verá erros e pode verificar o alert log para detalhes.

Tentativa de Operação DML

Vamos tentar inserir mais dados na tabela:

INSERT INTO teste_undo VALUES (171, 'Guina não tinha dó!');
COMMIT;
DELETE teste_undo;

Erro esperado:

Resolvendo a Perda da Tablespace de UNDO

Se houver transações pendentes na tablespace de UNDO, é importante saber que essas transações podem ser perdidas. Seguir os passos abaixo ajudará a minimizar os impactos e restaurar o funcionamento normal do banco de dados.

1. Parar o Banco de Dados

SHUTDOWN ABORT;

2. Iniciar o Banco de Dados em MOUNT

STARTUP;

3. Remover o Datafile 3 da Tablespace de UNDO

ALTER DATABASE DATAFILE 3 OFFLINE DROP;

4. Criar uma Nova Tablespace de UNDO

ALTER DATABASE OPEN;

CREATE UNDO TABLESPACE undotbs_BUM DATAFILE 'undotbs02_BUM.dbf' SIZE 1G REUSE AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED;

5. Configurar o Banco de Dados para Usar a Nova Tablespace de UNDO

Diga ao banco de dados para usar a nova tablespace de UNDO:

ALTER SYSTEM SET UNDO_TABLESPACE = undotbs_BUM scope=both sid='*';

6. Abrir o Banco de Dados

STARTUP FORCE;

07. Apagar a Tablespace de UNDO Antiga

Se a antiga tablespace de UNDO estiver corrompida ou inacessível, tente apagá-la:

DROP TABLESPACE undotbs1 INCLUDING CONTENTS AND DATAFILES;

Não é possivel apaga-la porque existem segmentos não finalizados.

08. Removendo Segmentos não Finalizados:

Identificando os Segmentos:

SELECT SEGMENT_NAME,STATUS,TABLESPACE_NAME FROM DBA_ROLLBACK_SEGS;

Os segmentos da UNDOTBS1 devem ser excluídos.

Para isso, criar um pfile temporário para identificar os segmentos que devem ser excluídos.

create pfile='/tmp/ppfile.ora' from spfile;

Indicar no pfile temporário os segmentos que serão excluídos:

vi /tmp/ppfile.ora

##Adicionar conteudo no arquivo:

XE._offline_rollback_segments=('_SYSSMU10_2569484742$','_SYSSMU9_1317495879$', '_SYSSMU8_4175076471$', '_SYSSMU7_3583332791$', '_SYSSMU6_725569783$', '_SYSSMU5_3703078872$', '_SYSSMU4_655887589$', '_SYSSMU3_3346129149$','_SYSSMU2_1827203912$','_SYSSMU1_3789641169$') 

cat /tmp/ppfile.ora

Iniciar a instancia com o pfile temporário:

SHUTDOWN ABORT;
STARTUP PFILE='/tmp/ppfile.ora';

Para isso, criar um pfile temporário para identificar os segmentos que devem ser excluídos.

SELECT SEGMENT_NAME,STATUS,TABLESPACE_NAME 
 FROM DBA_ROLLBACK_SEGS WHERE TABLESPACE_NAME = 'UNDOTBS1';
 
drop rollback segment "_SYSSMU10_2569484742$"; 
drop rollback segment "_SYSSMU9_1317495879$" ; 
drop rollback segment "_SYSSMU8_4175076471$" ; 
drop rollback segment "_SYSSMU7_3583332791$" ; 
drop rollback segment "_SYSSMU6_725569783$"  ; 
drop rollback segment "_SYSSMU5_3703078872$" ; 
drop rollback segment "_SYSSMU4_655887589$"  ; 
drop rollback segment "_SYSSMU3_3346129149$" ; 
drop rollback segment "_SYSSMU2_1827203912$" ; 
drop rollback segment "_SYSSMU1_3789641169$" ; 

Então pode seguir com a exclusão da tablespace de UNDO:

DROP TABLESPACE undotbs1 INCLUDING CONTENTS AND DATAFILES;

Feito! E voilà, a tablespace foi removida com sucesso!

Agora então, basta reniciar a intancia para usar o spfile default.

STARTUP FORCE;

08. Verificar se a Nova Tablespace de UNDO

Finalmente, veja se a nova tablespace de UNDO está funcionando perfeitamente:

SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES WHERE CONTENTS = 'UNDO';

Conclusão

Lidar com a perda da tablespace de UNDO no Oracle Database pode ser desafiador, especialmente se houver transações pendentes. No entanto, ao seguir os passos detalhados neste guia, é possível recuperar o banco de dados e minimizar os impactos causados pela falha.

É essencial lembrar que a tablespace de UNDO desempenha um papel crítico na garantia da integridade dos dados e na capacidade de desfazer transações. Portanto, a perda dessa tablespace pode levar à corrupção de dados e à perda de transações não confirmadas.

Além disso, a realização de backups regulares do banco de dados é fundamental para proteger contra situações como essa. Um backup recente pode ser usado para restaurar o banco de dados para um estado consistente, mesmo em casos de perda de tablespaces críticas.

Portanto, sempre mantenha uma estratégia de backup robusta e pratique ações proativas para evitar a perda de dados e garantir a disponibilidade contínua do seu banco de dados Oracle.

🚀🚀🚀 Cacete de Agulha! 💉💉💉

Compartilhe

Facebook
Twitter
LinkedIn
WhatsApp
Email
Print

Pesquisar

Roberto Sobrinho

Sou Roberto Fernandes Sobrinho, também conhecido como Sobrinho DBA , pós graduado em “Architecture and Database Administration”, entusiasta, dedicado e com 20 anos de experiência com Oracle Database e suas diversas distribuições e variações.

Oracle ACE Associate

2025

Specialist

Exadata Database Machine X9M

Professional

Oracle Database Administration

Professional

Oracle Database 19c: RAC, ASM, & Grid Infra Administrator

Professional

Oracle Autonomous Database Cloud

Professional

Oracle Cloud Database Migration and Integration

Professional

Oracle Database PL/SQL Developer

Associate

Oracle Cloud Infrastructure Architect

Associate

Oracle Cloud Infrastructure Foundations

Categorias

Categorias

Tags

Como Resolver a Perda Definitiva da Tablespace de UNDO no Oracle Database