======================================================================================== == Restaurando um arquivo de dados do PDB == 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 📍 ssão extra: acompanhar o ALERT LOG (recomendado) 📍 Pré-checks 📍 Criar massa de dados na USERS (antes do BACKUP) 📍 Backup Full do PDB (pré-condição) 📍 Removendo o arquivo de dados 📍 Mapeando o problema 📍 Tentando acessar a tablespace USERS 📍 Tentando restaurar o datafile 📍 Colocando a tablespace USERS offline 📍 Restaurando o datafile 📍 Colocando a tablespace ONLINE 📍 Validando o acesso aos dados 📍 Conclusão 📍 Limpa tudo ================================================================= == 🎯 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 ================================================================= ▶️ Fluxo completo e prático com validação pré-restore via dicionário e V$ views ▶️ Cenários: DATAFILE da USERS (file# 12) e DATAFILE do SYSTEM (file# 9) ▶️ Demonstração do erro ORA-01116/01110 ao tentar usar a USERS após a perda 💡 Mantenha uma segunda sessão acompanhando o alert log com ADRCI ================================================================= == 🎯 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 ================================================================= $ export ORACLE_SID=cdb1 $ 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> set lines 200 SQL> col file# form 999 SQL> col name form a95 SQL> select file#, name from v$datafile where con_id=(select con_id from v$pdbs where name='PDB1') order by file#; -- (Opcional) Via dicionário no PDB SQL> alter session set container=PDB1; SQL> col file_name form a95 SQL> select file_id, tablespace_name, file_name from dba_data_files order by file_id; ================================================================= == 🎯 Criar massa de dados na USERS (antes do BACKUP) ================================================================= SQL> alter session set container=PDB1; SQL> create user LAB identified by "Lab#2025" default tablespace USERS quota unlimited on USERS; SQL> grant create session, create table to LAB; SQL> create table LAB.T_DEMO (id number primary key, payload varchar2(100)) tablespace USERS; SQL> insert into LAB.T_DEMO select level, rpad('X',50,'X') from dual connect by level<=1000; SQL> commit; SQL> select count(*) "Rows_T_DEMO" from LAB.T_DEMO; SQL> exit; ================================================================= == 🎯 BACKUP FULL do PDB (pré-condição) ================================================================= $ rman target / RMAN> BACKUP PLUGGABLE DATABASE PDB1 TAG 'PRE_RESTORE_FULL'; RMAN> LIST BACKUP OF PLUGGABLE DATABASE PDB1; RMAN> exit; ================================================================= == 🎯 Removendo o arquivo de dados ================================================================= $ ls -lhtr /u02/oradata/CDB1/3BC946E28B079604E0638E44A8C0264A/datafile/o1_mf_users*.dbf $ rm -f /u02/oradata/CDB1/3BC946E28B079604E0638E44A8C0264A/datafile/o1_mf_users*.dbf $ ls -lhtr /u02/oradata/CDB1/3BC946E28B079604E0638E44A8C0264A/datafile/o1_mf_users*.dbf ================================================================= == 🎯 Mapeando o problema ================================================================= $ sqlplus / as sysdba SQL> set lines 400 SQL> col error form a25 SQL> select file#, error, change#, time from v$recover_file where con_id=(select con_id from v$pdbs where name='PDB1'); SQL> col status form a10 SQL> col name form a95 SQL> select h.file#, h.status, h.error, h.recover, d.name from v$datafile_header h join v$datafile d on d.file#=h.file# and d.con_id=h.con_id where h.con_id=(select con_id from v$pdbs where name='PDB1') order by h.file#; ================================================================= == 🎯 Tentando acessar a tablespace USERS ================================================================= SQL> alter session set container = pdb1; SQL> create table X (y number) tablespace USERS; -- Esperado (resumo do erro): -- ORA-01116: error in opening database file 12 -- ORA-01110: data file 12: -- '/u02/oradata/CDB1/3BC946E28B079604E0638E44A8C0264A/datafile/o1_mf_users_n99l7q7r_.dbf' -- ORA-27041: unable to open file (Linux-x86_64 Error: 2: No such file or directory) SQL> exit ================================================================= == 🎯 Tentando restaurar o datafile ================================================================= $ rman target / -- 4) Restaurar e recuperar o DATAFILE 12 RMAN> RESTORE DATAFILE 12; ORA-19573: cannot obtain exclusive enqueue for datafile 12 ORA-19890: data file already in use RMAN> exit ⚠️ Sempre que for restaurar um datafile de uma tablespace, ele deve estar OFFLINE ================================================================= == 🎯 Colocando a tablespace USERS offline ================================================================= $ sqlplus / as sysdba SQL> alter session set container=PDB1; SQL> alter tablespace USERS offline immediate ; SQL> exit ================================================================= == 🎯 Restaurando o datafile ================================================================= $ rman target / -- 4) Restaurar e recuperar o DATAFILE 12 RMAN> RESTORE DATAFILE 12; RMAN> RECOVER DATAFILE 12; RMAN> exit ================================================================= == 🎯 Colocando a tablespace ONLINE ================================================================= $ sqlplus / as sysdba SQL> alter session set container=PDB1; -- 5) ONLINE da USERS e validação da tabela criada antes do backup SQL> alter tablespace USERS online; ================================================================= == 🎯 Validando o acesso aos dados ================================================================= SQL> select count(*) "Rows_T_DEMO" from LAB.T_DEMO; SQL> alter session set container=cdb$root; SQL> col status form a10 SQL> col name form a95 SQL> col error form a20 SQL> select h.file#, h.status, h.error, h.recover, d.name from v$datafile_header h join v$datafile d on d.file#=h.file# and d.con_id=h.con_id where h.con_id=(select con_id from v$pdbs where name='PDB1') order by h.file#; ================================================================= == 🏁 Conclusão ================================================================= ▶️ Antes do restore, identifique o arquivo problemático com V$RECOVER_FILE e V$DATAFILE_HEADER ▶️ Sempre tenha um backup recente!!! 💡 Acompanhar o alert log (ADRCI -tail -f) acelera o diagnóstico durante todo o fluxo ================================================================= == 🧹 Limpa tudo (opcional) ================================================================= SQL> alter session set container=PDB1; SQL> drop user LAB cascade; SQL> exit $ rman target / RMAN> DELETE NOPROMPT BACKUP TAG 'PRE_RESTORE_FULL'; RMAN> DELETE NOPROMPT OBSOLETE;