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