segunda-feira, 26 de março de 2012

Oracle Total Recall

Visão Geral

Conforme já conheciamos de versões anteiores do Oracle, é possivel fazer um consulta a um valor de uma tabela num periodo passado, porém havia certas limitações, a principal delas é a retenção dos dados na tablespace de undo, caso fosse necessário o Oracle reciclaria os dados da undo para dar vazão a demais transações e um consulta as of poderia receber um erro de snapshot too old.

Com a nova feature do Oracle, Flashback data archive ou Oracle Total Recall é possivel então criar uma nova retenção a um nivel de tabela para que seja retido em um novo objeto ( Flashback Archive, funciona como um container ) os dados necessários para realizar um consulta de flashback, sem então receber os já conhecidos erros de snapshot too old.

Esta nova feature requer que seja criado um novo objeto, Flashback archive, que irá receber um retenção, 1 anos, 3 anos, 10 anos, e será armazenado em uma tablespace, as tabelas que compartilham essa retenção podem compartilhar esse mesmo objeto para garantir a retenção do dados, então com o flashback data archive habilitado temos um novo processo conhecido por fdba, o qual irá realizar a copia dos dados da undo para o flashback data archive, ele deve garantir que os dados sejam todos copiados antes do purge da Undo, e tendo como regra que inserções novas não entram neste objetos, somente updades e deletes.

Há certas limitações também dentro deste processo, operação que modificam a tabela não pode ser executadas, como drop table.

Operações Permitidas:

Até a versão 11.1 do Oracle as seguintes operações não eram permitas, a partir do Oracle 11.2 já não existem tais limitações:

• Add, Drop, Rename, Modify Column
• Drop, Truncate Partition
• Rename, Truncate, Drop Table

Requisitos:
- A tablespace onde contem os dados deve administrar os segmentos de maneira automatica, Automatic Segment Space Manage
- A tablespace de Undo deve ser administrada Automaticamente, Automatic Undo Management.

Usuários:

Há dois tipos de usuários, Administradores e Usuários

  • Administrador - Archive Administrator, o que lhe da o poder de criar, alterar e remover flashback data archives.
  • Usuários - Flashback archive, o que lhe da o poder de acesso ao flashback data archive.
    Flashba e select no objeto envolvido na consulta.
Implementação:

A sua implementação é muita fácil, são apenas 3 passos que devem ser seguidos:

  1. Criar as tablespaces para a base do repositorio ( Flashback data archive ).
  2. Criar o repositorio ( Flashback data archive ). - Este pode possuir varias tablespace para repositorio com diferentes quotas, porém somente recebe uma retenção.
  3. Habilitar o Oracle total recall na tabela.
Exemplo:

1. Criando o Flashback data archive e configurando a tabela hr.employees para a retenção de 3 anos.

SQL> Create tablespace fla1 datafile '/u03/oradata/orcl/fla101.dbf' size 100m segment space management auto;

Tablespace created.

SQL> CREATE FLASHBACK ARCHIVE fda1
TABLESPACE fla1
RETENTION 3 YEAR;

Flashback archive created.

SQL> ALTER TABLE HR.EMPLOYEES FLASHBACK ARCHIVE fda1;

Table altered.

SQL>

Neste ponto a tabela hr.employees se irá garantir dados historico até 3 anos, em 3 anos + 1, a tabela historica será automatica limpa pelo processo de background FDAB obedecendo a rentenção de 3 anos.

Consultando valores antigos

SQL> select avg(salary) from hr.employees where JOB_ID='SH_CLERK';

AVG(SALARY)
-----------
3215

SQL> alter session set nls_date_format='DD/MM/YYYY hh24:mi:ss';

Session altered.

SQL> select sysdate from dual;

SYSDATE
-------------------
26/03/2012 20:40:27

SQL> update hr.employees set salary=salary*2 where job_id='SH_CLERK';

20 rows updated.

SQL> commit;

Commit complete.

SQL> select avg(salary) from hr.employees;

AVG(SALARY)
-----------
7062.76636

SQL> select avg(salary) from hr.employees as of timestamp to_timestamp('26/03/2012 20:40:27','DD/MM/YYYY hh24:mi:ss') where job_ID='SH_CLERK';

AVG(SALARY)
-----------
3215

SQL>

Para finalizar vamos testar no oracle 11.2 o truncate table mesmo com o flashback data archive habilitado:

SQL> create table hr.employees2 as select * from hr.employees;

Table created.

SQL> ALTER TABLE HR.EMPLOYEES2 FLASHBACK ARCHIVE fda1;

Table altered.

SQL> select count(*) from hr.employees2;

COUNT(*)
----------
107

SQL> truncate table hr.employees2;

Table truncated.

SQL> select count(*) from hr.employees2;

COUNT(*)
----------
0

SQL> select count(*) from hr.employees2 as of timestamp to_timestamp('26/03/2012 20:00:00','DD/MM/YYYY hh24:mi:ss');

COUNT(*)
----------
107

Portanto na versão 11.2 já não há as limitações de DDL que haviam na 11.1.

Novas Views:

dba_flashback_archive; Flashback data archives
dba_flashback_archive_ts; Flashback data archives Tablespaces
dba_flashback_archive_tables; Flashback data archives Tables

Conclusão

Como vimos esta nova feature é um interessante recurso para o banco de dados reter informações historicas para qual seja a finalidade, e ainda tentar minimizar o trabalho do DBA de incontaveis noites fazendo incontaveis restores de informações que há muitos já não estão mais disponiveis no DB.


Postar um comentário