GPO ( Grupo de Profissionais Oracle )
A maior comunidade Oracle do Brasil !

Flashback Drop – recyclebin

Boa noite senhores! Como vão passando?

Essa semana finalmente estou brincando um pouco com banco de dados na PT. Nesses anos de experiência, a grande maioria das bases quais administrei eram da versão 9i. Creio que daqui por diante as oportunidades de voltar a mexer com essa versão serão mais raras. Então vamos em frente!

Apesar de ser certificado em Oracle database 10g, quebrei um pouco a cabeça até lembrar da nova feature inserida a partir do Oracle 10g, o Flashback Drop.

Podemos comparar a grosso modo esse recurso a Lixeira do Windows. Depois que você realiza um DROP TABLE diferentemente das versões anteriores os objetos são “colocados na lixeira”. A tabela é renomeada podendo ser restaurada a qualquer momento.

A recyclebin é uma tabela do dicionário de dados do Oracle que contém informações sobre esses objetos dropados. Esses objetos jogados na recyclebin que não necessariamente são apenas tabelas, mas também indices, constraints, nested tables e etc. Os objetos dropados permanecem na recyclebin até que:

  • Seja dropado permanentemente através do comando PURGE;
  • Seja restaurada através do comando UNDROP;
  • Até que não tenha espaço suficiente para os objetos regulares na tablespace;

A visualização desses objetos pode ser feito tanto pela recyclebin ou user_recyclebin para os objetos de seu usuário e dba_recyclebin para que tem privilégios de DBA.

Vamos ao que interessa. Iremos criar uma tabela e inserir um registro nela:

SQL> alter session set nls_date_format='HH24:MI:SS' ;

 Session altered.

SQL> create table teste (coluna varchar2(10), data_ins date);

Table created.

SQL> insert into teste values ('Linha1', sysdate);

1 row created.

SQL> select * from teste;

 COLUNA    DATA_INS
---------- --------
Linha1   23:52:03

Agora vamos fazer o estrago (recados aos desenvolvedores: crianças não façam isso na base de produção sem a benção do DBA!)

SQL> drop table teste;

 Table dropped.

SQL> select object_name, original_name, type, can_undrop as "UND", can_purge as "PUR", droptime
2 from recyclebin
SQL> /

OBJECT_NAME ORIGINAL_NAME TYPE UND PUR DROPTIME
------------------------------ ------------- ----- --- -------------------
BIN$HGnc55/7rRPgQPeM/qQoRw==$0 TESTE TABLE YES YES 2009-08-27 23:55:17

Vejam, apesar de dropar a tabela ela foi renomeada, vemos também que o nome é preservado na coluna ORIGINAL_NAME. E não é só isso:

SQL> alter session set nls_date_format='HH24:MI:SS' ;

 Session altered.

SQL> select * from "BIN$HGnc55/7rRPgQPeM/qQoRw==$0" ;

COLUNA DATA_INS
---------- --------
Linha1 23:52:03

Que bonito! Que beleza! Que alegria! Os dados estão lá intactos!

Agora o mais bacana. O UNDROP da tabela

SQL> flashback table teste to before drop;

 Flashback complete.

SQL> select * from teste;

COLUNA DATA_INS
---------- --------
Linha1 23:52:03

Caso você tenha certeza que sua tabela não vai ser mais usada, basta realizar o PURGE:

SQL> purge table "BIN$HGnc55/7rRPgQPeM/qQoRw==$0" ;

Table purged.

SQL> select * from recyclebin ;

no rows selected

Pronto! Simples assim! Mas você pode pensar: “Não, o que está feito está feito, não tem volta, se dropei uma tabela ela deve ir direto para o limbo!” Tudo bem, apesar de ser um recurso default no Oracle 10g, ele pode ser simplesmente desabilitado tanto a nível de instância no parametro de inicialização quanto a nível de sessão.

ALTER SYSTEM SET recyclebin = ON;

ALTER SESSION SET recyclebin = ON;

Bem, é isso ae pessoal, espero que esse post seja útil para vocês.

Passar bem e até a próxima!

Share

You may also like...

1 Response

  1. Marciel disse:

    Grande post, realmente este recurso é maravilhoso.
    Valeu Hyppolito

Deixe um comentário

O seu endereço de e-mail não será publicado.