Recuperando tablespace sem backup e sem mágica!
Well, faz um tempo que não passo por aqui mas, o motivo é justo, final da graduação, muita correira com o trabalho de conclusão de curso e alguns novos desafios.
E… por falar em desafio, eu encarei um recentemente, não é uma coisa tão complexa, porém exigiu muita pesquisa e testes, a proposta era a seguinte “recuperar uma tablespace sem backup”. Auto-explicativo, não?
Vamos ao que interessa, primeiramente vou criar o cenário, ativando o archive log, em seguida será criada uma tablespace qualquer, forçaremos uma alternância de logs para que o redo log receba o objeto.
Passo 1 – Inicie o banco de dados normalmente e verifique se está no modo de arquivamento automático
archive log list;
Se o banco não estiver no modo de arquivamento faça isto
alter database archivelog alter system set log_archive_start=true scope=spfile; alter database open;
É necessário reiniciar o banco pq o escopo da alteração foi o spfile
shutdown immediate; startup
Passo 2 – Como SYS crie uma simples tablespace TB_CURSO
create tablespace tb_curso datafile 'c:\oracle\oradata\DBWORK2\tb_curso.dbf' size 2m autoextend on;
Com o usuário scott crie uma tabela qualquer, apenas para que a tablepace tenha um conteúdo.
conn scott/tiger@dbwork2 -- criando tabela OPS create table ops (id number) tablespace tb_curso; -- populando a tabela insert into ops values(1); insert into ops values(1); insert into ops values(1); insert into ops values(1); insert into ops values(1); insert into ops values(1); insert into ops values(1); insert into ops values(1); insert into ops values(1); insert into ops values(1); commit; select count(*) from ops;
Reconecte como SYS e force a alternância de logs
conn sys/oracle@dbwork2 as sysdba -- alternância de log alter system switch logfile; alter system switch logfile; alter system switch logfile;
Passo 4 – Apagando a tablespace, neste momento será proposital mas talvez um dia você passe por uma situação desesperadora e acidental, ou não. Enfim, apague o arquivo físico da tablespace, antes feche o banco de dados.
– fechando o banco
shutdown immediate;
– Apague o datafile ‘c:\oracle\oradata\DBWORK2\tb_curso.dbf’
Passo 5 – Recuperando a tablespace.
– Inicie o banco de dados como SYS
startup
Neste momento você irá receber uma mensagem de erro, que indicará o problema no datafile, não se desespere!
Aqui está o segredo, basta você criar um novo datafile como se você o apagado, desta maneira.
alter database create datafile 'C:\ORACLE\ORADATA\DBWORK2\tb_curso.DBF' as 'C:\ORACLE\ORADATA\DBWORK2\tb_curso01.DBF';
Bem, ainda não está tudo resolvido, você deverá aplicar o recover dos dados da tablespace que estão no redo log.
recover tablespace tb_curso;
Após aparecer a mensagem “Recuperação de mídia concluída”, abra o banco de dados e verifique a tabela OPS do usuário scott.
-- abra o banco novamente alter database open; -- consultando os registros select * from scott.ops;
That’s all!








