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

sexta-feira, 21 de agosto de 2009

Automatic Memory Managment

Cada vez mais a Oracle vem implementando features para automatizar e optimizar processos e recursos. No 9i surgiu a PGA_AGGREGATE_TARGET, no 10g foi implementando a SGA_TARGET surgindo o ASMM, na versão 11g surge então o parametro memory que administra SGA + PGA dinamicamente com um unico parametro.

Dois novos parametros:

MEMORY_TARGET - A quantidade de memória alocada para SGA+PGA.
MEMORY_MAX_TARGET - Máximo de memória permitida para memory_target, opcional;

Se utilizado o parametro MEMORY_TARGET, a feature AMM (Automatic Memory Management), onde só é necessário configurar o parametro memory_target.

Ainda é possível utilizar o SGA_TARGET e PGA_AGGREGAT_SIZE juntamente com o MML, assim se alocados eles funcionam como garantia de um valor minimo para as áreas.

Para desabilitar a feature basta configura a memory_target = 0.

Há um chart abaixo com parametros e pools de memórias alocados de forma hierarquica.




Configurações possiveis para administração de memória.





Referencia:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/memory003.htm
http://www.oracle-base.com/articles/11g/AutomaticMemoryManagement_11gR1.php
http://dhnomura.blogspot.com/2009/06/sga-and-asmm.html

sexta-feira, 7 de agosto de 2009

Oracle OFA

OFA - Optimal Flexible Architecture

Vantagem de se utilizar o OFA:

- Organizar dados e softwares em discos.
- Facilita tarefas administrativas.
- Facilita a troca entre diversos Oracle Databases.
- Administrar o crescimento da base de dados.
- Ajuda a diminuir a fragmentação do disco.

A função do OFA é padronizar pontos de montagens, diretórios e subdiretórios.

Mount points
Nomeia pontos de montagens com a sintaxe /pm onde o p é uma string e m é um numero, exemplo /u01.

Diretório home
Nomeia todos os home directories usando /pm/h/u, onde o h é uma string, um nome, u é o owner do diretório, exemplo /u01/app/oracle.

Oracle Directories
Determina a versão da software, onde, product é um literal, e v é a versão do software, exemplo, /u01/app/oracle/product/11.1.0/db_1

Subdiretórios
Usado para facilitar a administração do banco de dados, sintax /h/admin/d/a onde o h é o Oracle directory (ORACLE_HOME), admin um literal, d é o nome do banco de dados, e a o subdiretórios para os arquivos de administração, como o seguintes:

adhoc - Ad hoc SQL Scripts.
arch - Archived redo logs.
adump - Audit files.
Create - Programas usados para criar a base de dados.
Exp - Export files.
Pfile - Arquivo de parametros.

Arquivos do banco de dados

Controlfile: /pm/q/d/controln.ctl
Redo log files: /pm/q/d/redon.log
Data files: /pm/q/d/tn.dbf

Onde p é o ponto de montagem, q é uma string (oradata), d o nome do banco de dados, t o nome da tablespace e n um numero de dois digitos.

OFA aparenta ser simples, mas facilita muito a vida de dbas os quais administram muitas base de dados, e tais base de dados são administradas por muitos dbas, economiza-se muito tempo se utilizado tais padrões.