Pular para o conteúdo

Como Recuperar Datafile Oracle Apagado sem Backup em Unix/Linux

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?):

ShellScript
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:

ShellScript
$ ps -ef | grep dbw

oracle 21943 1 0 10:27:08 ? 0:00 ora_dbw0_PRD

Encontre os arquivos abertos pelo DBWR (PID 21943):

ShellScript
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:

ShellScript
cd /proc/21943/fd/

Coloque a tablespace em READ ONLY:

SQL
SQL> ALTER TABLESPACE users READ ONLY;

Agora vem a mágica. Faça uma nova cópia do arquivo usando o file descriptor:

ShellScript
cat 270 > /u02/oradata/users01.dbf

Coloque a tablespace em offline, e de volta em online.

SQL
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.

Ricardo Portilho Proni

Ricardo Portilho Proni

Com 20 anos de experiência profissional, Oracle ACE Member – eleito pela Oracle Corporation um dos maiores especialistas do mundo em Oracle Database- Trabalhou em grande parte dos maiores bancos de dados Oracle do Brasil. Certificado em Oracle, SQL Server, DB2, MySQL, Sybase e Websphere. Conselheiro do GPO e do GUOB, palestrante do ENPO, GUOB Tech Day e Oracle Open World, escritor da Revista SQL Magazine e Instrutor na Nerv.

Comentário(s) da Comunidade

  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