Flashback - Novos Recursos

Renato Osterne (e-mail) é formado em Técnico em Processamento de dados pelo COtemig a nível médio, formado em Administração de Sistamas de Informação pela UNA-CCG e especializado em banco de dados Oracle com certificações OCP 9i e 10g. Trabalha com informática há 8 anos e sendo 3 deles como DBA. Hoje atua na Synos technologies, parceiro Oracle, em um projeto do jornal O Estado de Minas.

O Oracle 10g apresentou novos recursos de Flashback, como o Flashback Database, o Flashback drop e o Flashback Query. Nesse artigo será abortado mais sobre esses novos recursos.

Flashback Database

Esse recurso de Flashback Database permite recuperar o banco, fazendo que o mesmo possa ser voltado num ponto específico do tempo. Esse recurso pode ser útil para situações como corrupção de dados lógicos ou perda de dados feita por algum usuário de uma maneira não intencional.

Antes de aprofundarmos mais no assunto, gostaria de deixar claro que esse recurso não é um recurso de recuperação de banco de dados no caso de perda física ou corrupção física, mas sendo um meio mais rápido para uma recuperação de dados se comparado a outros, como backups lógicos e Logminer.

Estrutura

A estrutura do Flashback Database envolve alguns novos componentes: logs de Flashback Database e RVWR (Processo de segundo plano).

* Logs de Flashback Database: é um arquivo de log com a imagem anterior dos blocos do banco de dados Oracle. Esses logs devem ser criados na área de recuperação de flashback, ou seja, essa área deve ser configurada para esse armazenamento. Esses logs não servem para recuperação de banco, pois os mesmos não são arquivados como acontece com a área de redo.

* RVWR: Quando o Flashback Database está ativado, o processo de segundo plano RVWR é iniciado, sendo responsável por gravar nos logs os dados do Flashback Database.

Utilizando

Para utilizar o Flashback Database o banco deve esta no modo ARCHIVELOG e uma área de recuperação deve ser configurada, caso tenha um banco RAC (Real Aplication Cluster) esse deve ser aberto no modo exclusivo.

Abaixo darei um exemplo de como utilizar esse recurso no SQL*PLUS, mas o podendo ser utilizado em outras ferramentas como o RMAN e OEM.

01. Desative o Banco;

02. Monte o banco, se for do tipo RAC, monte no modo exclusivo;

03. Dê o seguinte comando: alter system db_flashback_retetion_target = 5000;

Esse comando definirá até onde poderá recuperar o banco. É quantificado em minutos.

04. Ative o Flashback Database: alter database flashback on;

05. Abra o banco (alter database open;) e anote o SCN (System Change Number) na view V$database no Current_SCN e faça algumas alterações no banco;

06. Dê um Shutdown e monte o banco novamente;

07. Agora utilize o comando flashback database to scn (SCN anotado antes das alterações sem o parêntese);

08. Abra o banco no modo read only (alter database open read only;) e veja se as alterações que você tinha feito sumiram;

09. Depois que você confirmar se é nesse ponto que você gostaria de voltar mesmo, abra o banco com resetlogs (alter database open resetlogs);

OBS: Você pode fazer uma recuperação tanto pra frente quanto pra trás no tempo e quantas vezes desejar até abrir o banco com RESETLOGS.

Visões

O Oracle 10g oferece as seguintes visões para o Flashback Database:

* V$database: Coluna Flashback_on, que mostra se o recurso está ativado.

* V$flashback_database_log: Permite monitorar o RETENTION_TARGET, que pode ajudar a estimar a quantidade de espaço exigida na área de recuperação.

Colunas importantes: FLASHBACK_SCN (menor SCN permitido), RETENTION_TARGET, FLASHBACK_SIZE (tamanho da área de recuperação ocupada) e ESTIMATED_FLASHBACK_SIZE (Tamanho estimado de dados).

* V$flashback_database_stat: Manutenção dos dados de logs. Estima a quantidade total de espaço para recuperações futuras.

Desvantagens

Esse recurso não pode ser utilizado:

* Caso o arquivo de controle (controlfile) foi restaurado ou recriado

* O Objeto que você precisa consultar teve sua tablespace excluída.

* O arquivo de controle (controlfile) que contém o objeto a ser consultado foi reduzido

* Ocorreu uma recuperação com o comando RESETLOGS

Flashback Drop

Esse recurso permite desfazer um comando Drop table sem precisar ativar o recurso Flashback Database.

RECYCLEBIN

Para suportar esse recurso o Oracle introduziu o conceito de lixeira que funciona semelhante ao do Windows, sendo nomeado de RECYCLEBIN.

Utilizando

Quando o usuário dá o comando drop table NOMEDATABELA, as tabelas vão para a lixeira do Oracle. Caso queira excluir a tabela sem que a mesma vá para a lixeira, basta dar um drop table NOMEDATABLEA purge;.

Na RECYCLEBIN, lixeira, o objeto tem seu nome alterado para evitar conflito nas atribuições de nomes dos objetos excluídos.

OBS: Note que os objetos não são excluídos e sim movidos para a área da lixeira quando "Dropado" sem o comando PURGE.

Caso queira excluir um objeto da lixeira e não lembra qual é seu nome identificado após a exclusão, utilize a visão do dicionário de dados RECYCLEBIN, nela conterá informações do nome original do objeto, nome após exclusão, tipo de operação, tipo de objeto, dentre outras informações.

Após identificar o nome, dê o comando purge table NOMEIDENTIFICADO;.

Para recuperar uma tabela excluída sem o comando PURGE, dê:

flashback table NOMEDATABELA to before drop;

Pode-se também recuperar uma tabela num ponto específico do tempo. Para isso há duas maneiras, TIMESTAMP ou SCN, conforme exemplos abaixo:

flashback table NOMEDATABELA to timestamp to_timestamp('11-Jan-2005 09:00:00', 'dd-MON-yyyy hh24:mi:ss');

flashback table NOMEDATABELA to before scn 1901443;

FLASHBACK VERSIONS QUERY

Esse recurso dá a opção de visualizar num ponto específico do tempo versões de dados, ou seja, caso queira ver dados de um usuário cadastrado a um determinado tempo em sua base e ver, por exemplo, as mudanças desses dados como e-mail, endereço ou telefone.

No exemplo abaixo, mostraremos como utilizar esse recurso e examinar uma lista de telefones dos usuários e as alterações nos últimos trinta minutos.

* select id, nome, sobrenome, telefone from usuários VERSIONS BETWEEN TIMESTAMP
SYSTIMESTAMP - INTERVAL '30' MINUTE;

Só serão mostradas as alterações submetidas a COMMIT ou ROLLBACK. Um outro ponto importante é que esse recurso depende do tamanho do seu UNDO, ou melhor, do seu UNDO_RETENTION. É importante saber que ao informar um TIMESTAMP ou um SCN maior do possível, o Oracle te retornará um erro.

OBS: Esse Recurso não pode ser utilizado em Views e o usuário necessita de privilégios de Flashback e Select.

FLASHBACK TRANSACTION QUERY

Para finalizar o último novo recurso Flashback presente na versão 10g, que possibilita a reconstrução de instruções SQL previamente executadas no banco.

Para se fazer uso desse recurso será utilizado a visão V$flashback_transaction_query, mas como o recurso anterior, também depende do parâmetro UNDO_RETENTION.

Exemplo:

select undo_sql from v$flashback_transaction_query where table_owner = 'JOAO' and table_name = 'USUARIOS' and start_scn 1901443 and 1980475;

Nesse exemplo estamos examinando instruções SQL realizadas entre o System Change Number 1901443 e 1980475.

O único problema nessa feature é que a visão do dicionário não é indexada.

Uma observação final. Nunca esqueça de colocar um valor alto no parâmetro UNDO_RENTENTION, caso contrário, dependendo da situação, não conseguirá voltar ao ponto desejado.

No mais, é isso.

Espero ter ajudado e até a próxima.