Pular para o conteúdo

Recuperar datafile apagado, sem backup

Se um datafile de um Banco de Dados Oracle foi apagado e não há backup, é possível recupera-lo, e nem é tão difícil…

Isto só é possível se a instância não foi desligada após a remoção do arquivo, e se o Sistema Operacional utilizado for Unix ou Linux.

Quando a instância é iniciada, o DBWR (e outros processos como o PMON e SMON) 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, listener.log), o espaço livre não é liberado até o processo que estava gravando nele seja reiniciado.
O mesmo ocorre com o LGRW e os REDOs.

Por isso este procedimento só irá funcionar se a instância não foi desligada ainda, pois se ela for, o lock é liberado e o arquivo é apagado realmente.

Para simular esta situação, apague um datafile (não preciso dizer que não me responsabilizo se você fizer isso em produção, certo?):
rm /u02/oradata/users01.dbf

Neste momento, qualquer operação que tente utilizar o datafile resultará em um erro. Tente aumentar o datafile ou extrair dados, e verá que não conseguirá. Não vou demonstrar essa parte aqui, pois já tentei demais essa semana. 🙂

Descubra o PID do DBWR:
$ ps -ef | grep dbw
oracle 21943 1 0 10:27:08 ? 0:00 ora_dbw0_PRD

Encontre os arquivos abertos pelo DBWR (PID 21943):
lsof -p 21943 | grep users01.dbf

Este comando irá retornar várias colunas. Precisamos do valor da coluna FD.
Neste caso, foi 270uW. Só precisamos dos três primeiros números, ou seja, 270.

Vá até o diretório onde estão os file descriptors do DBWR:
cd /proc/21943/fd/

Coloque a tablespace em READ ONLY:
SQL> ALTER TABLESPACE users READ ONLY;

Agora vem a mágica. Faça uma nova cópia do arquivo usando o file descriptor:
cat 270 > /u02/oradata/users01.dbf

Coloque a tablespace em offline, e de volta em online.
SQL> ALTER TABLESPACE users OFFLINE;
SQL> ALTER TABLESPACE users ONLINE;

Pronto, seus dados estão acessíveis, e o datafile pode ser utilizado normalmente.
Agora seria uma boa hora para um backup full em RMAN, e sugerir a demissão de alguém.

Este procedimento foi extraído da nota 444749.1 do Metalink.

Quão útil foi este post ?

Clique em uma estrela para classificar o post

nota média 0 / 5. Contagem de votos: 0

Sem votos ! Seja o primeiro a classificar !

Marcações:

12 comentários em “Recuperar datafile apagado, sem backup”

  1. Avatar de Eduardo Legatti

    Olá Portilho,

    Não conhecia essa técnica. Parabéns … O problema é que muitas vezes, no desespero, o técnico sem saber o que realmente está ocorrendo, acaba por efetuar um shutdown no servidor e aí já era …

  2. Avatar de Drbs

    Sensacional, a frase final então bem forte..kkkkkk..”Sugerir a demissão de alguém.”
    Parabéns Portilho, como sempre um excelente material.

    Abraço.

    David

  3. Avatar de Rodrigo Mufalani

    Muita boa dica Ricardo!!!

    Já aconteceu uma vez comigo algo parecido, só que voltamos o datafile através de archives coisa que no 10g já é possivel usando rman. Se tivesse acesso a esse post na época teria nos poupado um trabalinho.

    Vlw mesmo pelo post! Excelente!!!

    Att,
    Rodrigo Mufalani

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress