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
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.
E ai Lana.
ResponderExcluirMuito bom o post.Interessante essa técnica!!!