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.
Salve Portilho..
Caraca.. que desafio heim.. mais um otimo post heim.. Excelente…
Abraços.!!!
Òtimo post…sem comentários a mais Portilho.
Abs,
Muito boa a dica!!!
Vou dar uma de Tomé … só acredito vendo!!!
Vou testar e depois postar aqui o resultado, mas a dica é boa…
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 …
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
Novamente algo que realmente vem a contribuir com a comunidade.
Parabéns 😀
Opa…
Teste realizado e Datafile Recuperado com sucesso..
Abraços..!
Olá Portilho,
Ótimo post hein Parabéns.
Abraços
Bruno Murassaki
Portilho,
Essa dica é de JEDY! Parábens!
Abraços,
Rodrigo Almeida
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
Boa tarde Ricardo,
Conforme eu prometi, segue o link para o teste feito que é uma alternativa ao post. Porém sem precisar ter acesso ao S.O. Somente com ferramentas Oracle (RMAN)
http://mufalani.blogspot.com/2009/07/recuperando-uma-tablespace-criada-e.html
Atenciosamente,
Rodrigo Mufalani