Recuperar datafile apagado, sem backup

Hoje aprenderemos a fazer mágica.

Como assim recuperar um arquivo deletado sem backup?

Primeiro preciso lhes dizer que esta tecnica só funciona em linux ou UNIX.

Quando a instância é iniciada, o DBWR adquire um lock do Sistema Operacional em todos os datafiles.Desta forma, se um datafile for apagado com o comando rm, apenas o seu ponteiro é removido, o arquivo continuará gravado no filesystem, embora não pareça.

É por esse mesmo motivo que em Unix, ao se remover um grande arquivo de log (por exemplo, diag.log), o espaço livre não é liberado até o processo que estava gravando nele seja reiniciado. Isto também acontece com o LGRW e os REDOs.

Nota: Ao reiniciar o oracle, ai sim este arquivo será perdido.

WARNING: Não Faça este teste em produção.

Vou fazer um passo a passo em minha instancia de testes para lhes mostrar como efetuar este processo.

Vamos ao Teste:

SQL> startup;
ORACLE instance started.

Total System Global Area 451964928 bytes
Fixed Size 1344812 bytes
Variable Size 272632532 bytes
Database Buffers 171966464 bytes
Redo Buffers 6021120 bytes
Database mounted.
Database opened.

SQL> select name from v$datafile;

NAME
--------------------------------------------------
/u01/app/oracle/oradata/lana/system01.dbf
/u01/app/oracle/oradata/lana/sysaux01.dbf
/u01/app/oracle/oradata/lana/undotbs01.dbf
/u01/app/oracle/oradata/lana/users01.dbf
/u01/app/oracle/oradata/lana/TEIKO.dbf
/u01/app/oracle/oradata/lana/lana_LOB.DBF

6 rows selected.

SQL> !rm /u01/app/oracle/oradata/lana/lana_LOB.DBF

SQL> select name from v$datafile;

NAME
--------------------------------------------------
/u01/app/oracle/oradata/lana/system01.dbf
/u01/app/oracle/oradata/lana/sysaux01.dbf
/u01/app/oracle/oradata/lana/undotbs01.dbf
/u01/app/oracle/oradata/lana/users01.dbf
/u01/app/oracle/oradata/lana/TEIKO.dbf
/u01/app/oracle/oradata/lana/lana_LOB.DBF

6 rows selected.

SQL> exit

Agora precisamos pegar o pid do dbwriter

-bash-3.1$ ps -ef | grep dbw
oracle 4023 1 0 14:37 ? 00:00:00 ora_dbw0_lana

Com o pid do dwhr temos de executar o comando lsof para ver quais arquivos este pid esta utilizando Devemos pegar a quarta coluna deste comando para guardarmos

-bash-3.1$ lsof -p 4023 | grep lana_LOB.DBF
oracle 4023 oracle 264uW REG 8,1 52436992 785490 /u01/app/oracle/oradata/lana/lana_LOB.DBF (deleted)
<em>Apenas por curiosidade vou entrar na pasta em que ficam os ponteiros no Linux e listar</em>
-bash-3.1$ cd /proc/4023/ld
-bash-3.1$ ls -lrt 264*
lrwx------ 1 oracle dba 64 Mar 23 14:44 264 -> /u01/app/oracle/oradata/lana/lana_LOB.DBF (deleted)

Agora é que vem a mágica Temos de efetuar alguns comandos no banco sequencialmente.

SQL> alter tablespace LANA_LOB READ ONLY;
alter tablespace LANA_LOB READ ONLY
*
ERROR at line 1:
ORA-01116: error in opening database file 6
ORA-01110: data file 6: '/u01/app/oracle/oradata/lana/lana_LOB.DBF'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3

SQL> !

É normal dar estes erros Basta efetuarmos um cat do arquivo 264 que é o arquivo listado pelo lsof para dentro do arquivo deletado

bash-3.1$ pwd
/proc/4023/fd
bash-3.1$ cat 264 > /u01/app/oracle/oradata/lana/lana_LOB.DBF

bash-3.1$ exit
exit
SQL> alter tablespace LANA_LOB OFFLINE;

Tablespace altered.

SQL> alter tablespace LANA_LOB online;

Tablespace altered.

SQL> !ls -lrt /u01/app/oracle/oradata/lana/lana_LOB.DBF

-rw-r--r-- 1 oracle dba 52436992 Mar 23 14:48 /u01/app/oracle/oradata/lana/lana_LOB.DBF

Tae o seu arquivo Deletado.

%name Recuperar datafile apagado, sem backup

Autor: Leandro Lana

Trabalho com banco de dados Oracle desde 2006, já trabalhei com as plataformas 9i, 10G, 11G, 12C, 18C, 19C e 21(ainda em testes).

Trabalhando atualmente como consultor Oracle na MigraTI Soluções em TI como administrador de banco de dados Oracle, SQL-Server, MySQL e Postgresql.

Contato: leandro.lana@migrati.com.br

Fone: (47) 9191-6052 / (47) 3328 0996

Certificações:

OCA 10G.

OCP 10G.

OCE Linux.

OCE RAC/Cluster.

MCP SQL-Server 2008.

MCITP SQL-Server 2008.

DB2 Fundamentals.