======================================================================================== == Restaurando um PDB excluído == Marcio Mandarino == 09 de setembro de 2025 == marcio@mrdba.com.br == www.mrdba.com.br == https://www.linkedin.com/in/marciomandarino/ ======================================================================================== ================================================================= == 🎯 Resumo do vídeo: ================================================================= 📍 Sequência 📍 Visão Geral 📍 Sessão extra: acompanhar o ALERT LOG 📍 Pré-checks e criação de dados (antes do BACKUP) 📍 BACKUP FULL do PDB (pré-condição) 📍 Dropar o PDB (simulando exclusão acidental) 📍 Criando um diretório auxiliar 📍 RESTORE/RECOVER do PDB excluído (PDB PITR) 📍 Validações pós-restauração 📍 Conclusão 📍 Limpa tudo (opcional) ================================================================= == 🎯 Sequência ================================================================= ✅ Backup de PDB com RMAN ✅ Restaurando um arquivo de dados do PDB ✅ Restaurando o PDB inteiro 🛠️ Restaurando um PDB excluído ================================================================= == 🎯 Visão Geral ================================================================= ▶️ Restaurar um PDB que foi é um processo que envolve a criação de uma instância auxiliar ▶️ Esse processo vai demorar de acorodo com o tamanho do PDB ================================================================= == 🎯 Sessão extra: acompanhar o ALERT LOG (recomendado) ================================================================= $ adrci adrci> set home diag/rdbms/cdb1/cdb1 adrci> show alert -tail -f -- Deixe esta sessão acompanhando o log enquanto executa os testes ================================================================= == 🎯 Pré-checks e criação de dados (antes do BACKUP) ================================================================= $ sqlplus / as sysdba SQL> show pdbs; SQL> col name form a12 SQL> col open_mode form a12 SQL> select name, open_mode from v$pdbs where name='PDB1'; SQL> alter session set container=PDB1; -- Usuário e tabela para validação após o restore SQL> create user LABPDB identified by "Lab#2025" default tablespace USERS quota unlimited on USERS; SQL> grant create session, create table to LABPDB; SQL> create table LABPDB.T_PDB (id number primary key, payload varchar2(100)) tablespace USERS; SQL> insert into LABPDB.T_PDB select level, rpad('Y',60,'Y') from dual connect by level<=2000; SQL> commit; SQL> select count(*) "Rows_T_PDB" from LABPDB.T_PDB; SQL> exit ================================================================= == 🎯 BACKUP FULL do PDB (pré-condição) ================================================================= $ rman target / RMAN> BACKUP DATABASE PLUS ARCHIVELOG; RMAN> exit 💡 Além do backup do PDB, é preciso que haja um backup do container root ================================================================= == 🎯 Dropar o PDB (simulando exclusão acidental) ================================================================= $ sqlplus / as sysdba SQL> show pdbs; SQL> alter session set NLS_DATE_FORMAT='DD-MM-RRRR HH24:MI:SS'; SQL> select sysdate from dual; SQL> alter pluggable database pdb1 close; SQL> drop pluggable database pdb1 including datafiles; ================================================================= == 🎯 Criando um diretório auxiliar ================================================================= $ mkdir /tmp/pdb1/ ================================================================= == 🎯 RESTORE/RECOVER do PDB excluído (PDB PITR) ================================================================= $ rman target / RMAN> recover pluggable database pdb1 until time "to_date('09-09-2025 16:11:06','DD-MM-RRRR HH24:MI:SS')" auxiliary destination '/tmp/pdb1/'; ================================================================= == 🎯 Validações pós-restauração ================================================================= $ sqlplus / as sysdba -- PDB deve estar aberto SQL> select name, open_mode from v$pdbs where name='PDB1'; -- Conferir que os dados “voltaram” ao estado anterior ao DROP SQL> alter session set container=PDB1; SQL> select count(*) "Rows_T_PDB" from LABPDB.T_PDB; -- (Opcional) Salvar o estado para auto-open após restart SQL> alter pluggable database PDB1 save state; -- (Opcional) Checar pendências de recovery SQL> alter session set container=cdb$root; SQL> select file#, error, change#, time from v$recover_file where con_id=(select con_id from v$pdbs where name='PDB1'); SQL> exit ================================================================= == 🏁 Conclusão ================================================================= ▶️ Mesmo com PDB DROP INCLUDING DATAFILES, é possível recuperá-lo via PDB PITR (UNTIL SCN) ▶️ O RMAN restaura o PDB usando um destino auxiliar e exige OPEN RESETLOGS ao final ▶️ Valide com contagens e consultas para comprovar a integridade dos objetos restaurados ================================================================= == 🧹 Limpa tudo (opcional) ================================================================= $ sqlplus / as sysdba SQL> alter session set container=PDB1; SQL> drop user LABPDB cascade; SQL> exit $ rm -rf /tmp/pdb1/