MigraTI - Soluções em banco de dados

Guob 2017

quarta-feira, 23 de março de 2011

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)
Apenas por curiosidade vou entrar na pasta em que ficam os ponteiros no Linux e listar
-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.
Enter user-name: / as sysdba

Connected to:
Oracle Database 11g Release 11.2.0.2.0 - Production

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

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

Basta efetuarmos um cat do arquivo 264 que é o arquivo listado pelo lsof para dentro do arquivo deletado


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.



Precisando de Consultoria, monitoramento ou analise em Banco de dados? Clique aqui.

Um comentário:

  1. E ai Lana.
    Muito bom o post.Interessante essa técnica!!!

    ResponderExcluir