WEBCODELOG

free codes, enjoy

Tag: ‘tablespace’

Recuperando tablespace sem backup e sem mágica!

without comments

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!

Written by Luciano

outubro 31st, 2008 at 3:05 pm

Posted in Banco de Dados

Tagged with , ,