quarta-feira, 26 de agosto de 2009

Flashback Data Archive

Nova feature presente na versão 11g do software da Oracle, tem como objetivo reter dados por longos períodos sem que haja mudanças na aplicação, com fácil acesso e com o minimo de recursos necessário (não há perda de performance, e minimo armazenamento).
No versão 10g é possivel buscar dados realizando consultas AS OF, porém nem sempre é retornado um valor, lembrando que os dados relativos a selects AS OF são buscados na undo obedecendo a uma política de retenção.
Na versão 11g esse limite acaba com o Flashback Data Archive, que faz parte o Oracle Total Recall, onde uma tabela interna é criada para armazenar dados históricos de outra tabela com FDA habilitada.

O que há de novo?

Processo de segundo plano: FBDA (Flashback Data Archive), A cada cinco minutos realiza a cópia dos dados em undo para tabela históricas.

Privilégios:
FLASHBACK ARCHIVE ADMINISTER.
FLASHBACK ARCHIVE.

Views Relacionadas:
DBA_FLASHBACK_ARCHIVE: Informações sobre flashback archive.
DBA_FLASHBACK_ARCHIVE_TS: Informações de todas as tablespaces contendo flashback archive.
DBA_FLASHBACK_ARCHIVE_TABLES: Informações de quais tabelas tem dados históricos.

Requer:
Automatic Undo Managment.
ASSM Automatic Segment Space Management para a tablespace onde irá residir o FDA.

Exemplo:

Criando a tablespace que irá armazenar a FDA:
CREATE TABLESPACE FBHISTORY
DATAFILE '/u01/app/oracle/oradata/orcl/fbhistory01.dbf' SIZE 100M
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
Criando o FDA:
CREATE FLASHBACK ARCHIVE DEFAULT hr_hist
TABLESPACE FBHISTORY
QUOTA 1G
RETENTION 1 MONTH;
Concedendo as permissões:
GRANT FLASHBACK ARCHIVE ON hr_hist TO hr;
Alterando a retenção, apenas alterada para teste, não deve ser imposta em ambientes de produção:
alter system set undo_retention=1;
Habilitando a feature para tabela:
con hr

ALTER TABLE EMPLOYEES FLASHBACK ARCHIVE;
Atualizando a tabela e obtendo dados do passado com select AS OF:
SQL> alter session set nls_date_format='DD/MM/YYYY hh24:mi:ss';

Session altered.

SQL> select sysdate from dual;

SYSDATE
-------------------
26/08/2009 21:39:15
Valor original:
SQL> select EMPLOYEE_ID as ID, LAST_NAME||' '||FIRST_NAME as Name, JOB_ID, SALARY from employees where EMPLOYEE_ID = 100;

ID NAME JOB_ID SALARY
---------- ---------------------------------------------- ---------- ----------
100 King Steven AD_PRES 24000

Atualizando a tabela:

SQL> update employees set salary=salary*3 where EMPLOYEE_ID=100;

1 row updated.

SQL> commit;

Commit complete.

SQL> select EMPLOYEE_ID as ID, LAST_NAME||' '||FIRST_NAME as Name, JOB_ID, SALARY from employees where EMPLOYEE_ID = 100;

ID NAME JOB_ID SALARY
---------- ---------------------------------------------- ---------- ----------
100 King Steven AD_PRES 72000

Buscando informações do passado com AS OF:
SQL> SELECT EMPLOYEE_ID as ID, LAST_NAME||' '||FIRST_NAME as Name, JOB_ID, SALARY
FROM hr.employees AS OF TIMESTAMP TO_TIMESTAMP('26/08/2009 21:39:15', 'DD/MM/YYYY hh24:mi:ss')
WHERE employee_id = 100;
2 3
ID NAME JOB_ID SALARY
---------- ---------------------------------------------- ---------- ----------
100 King Steven AD_PRES 24000

SQL> SELECT LAST_NAME, SALARY FROM HR.EMPLOYEES
VERSIONS BETWEEN TIMESTAMP
TO_TIMESTAMP ('26/08/2009 21:39:15', 'DD/MM/YYYY hh24:mi:ss')
AND
TO_TIMESTAMP ('26/08/2009 21:44:15', 'DD/MM/YYYY hh24:mi:ss')
WHERE EMPLOYEE_ID = 100; 2 3 4 5 6

LAST_NAME SALARY
------------------------- ----------
King 72000
King 24000
Através do flashback table voltamos os dados ao original:
SQL> ALTER TABLE HR.EMPLOYEES ENABLE ROW MOVEMENT;

Table altered.

SQL> FLASHBACK TABLE HR.EMPLOYEES
TO TIMESTAMP
TO_TIMESTAMP ('26/08/2009 21:39:15', 'DD/MM/YYYY hh24:mi:ss'); 2 3

Flashback complete.

SQL> select EMPLOYEE_ID as ID, LAST_NAME||' '||FIRST_NAME as Name, JOB_ID, SALARY from HR.employees where EMPLOYEE_ID = 100;

ID NAME JOB_ID SALARY
---------- ---------------------------------------------- ---------- ----------
100 King Steven AD_PRES 24000
Referencias:
http://www.orafaq.com/wiki/Oracle_Total_Recall
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_5009.htm
http://www.oracle-base.com/articles/11g/FlashbackAndLogminerEnhancements_11gR1.php
http://www.oracle-base.com/articles/11g/FlashbackAndLogminerEnhancements_11gR1.php
http://www.psoug.org/reference/flash_archive.html
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_9013.htm#SQLRF01603

Nenhum comentário: