Saturday, August 29, 2009

Read only tables - Oracle 11g

Olá,
Outra funcionalidade interessante no Oracle 11g é o modo read only em tabelas.
Vejamos um exemplo :
dbajccorrea@ORCL11G> alter session set nls_language=english;
Session altered.
dbajccorrea@ORCL11G> set lines 2000 pages 50 timing on serveroutput on
Table dropped.
Elapsed: 00:00:00.96
dbajccorrea@ORCL11G> create table test_read
2 (x number,y varchar2(20)) ;
Table created.
Elapsed: 00:00:00.07
dbajccorrea@ORCL11G>
dbajccorrea@ORCL11G> insert into test_read values(1,'OCA');
1 row created.
Elapsed: 00:00:00.01
dbajccorrea@ORCL11G> insert into test_read values(2,'OCP');
1 row created.
Elapsed: 00:00:00.01
dbajccorrea@ORCL11G> commit ;
Commit complete.
Elapsed: 00:00:00.01
dbajccorrea@ORCL11G> alter table test_read read only ;
Table altered.
Elapsed: 00:00:00.07
dbajccorrea@ORCL11G> insert into test_read values(3,'OCM') ;
insert into test_read values(3,'OCM')
*
ERROR at line 1:
ORA-12081: update operation not allowed on table "DBAJCCORREA"."TEST_READ"
Elapsed: 00:00:00.03
A mensagem parece estranha,mas informa que a operação não é permiitida mesmo sabendo que como owner da tabela tenho todos os privilégios sobre a tabela.Realmente deixa a tabela em modo read only.
dbajccorrea@ORCL11G> select owner,table_name,read_only from dba_tables
2 where table_name ='TEST_READ' ;
OWNER TABLE_NAME REA
------------------------------ ------------------------------ ---
DBAJCCORREA TEST_READ YES
Elapsed: 00:00:00.08
dbajccorrea@ORCL11G> alter table test_read read write ;
Table altered.
Elapsed: 00:00:00.02
dbajccorrea@ORCL11G> alter table test_read read write;
Table altered.
Elapsed: 00:00:00.01
dbajccorrea@ORCL11G> select owner,table_name,read_only from dba_tables
2 where table_name ='TEST_READ' ;
OWNER TABLE_NAME REA
------------------------------ ------------------------------ ---
DBAJCCORREA TEST_READ NO
Elapsed: 00:00:00.01
dbajccorrea@ORCL11G> insert into test_read values(3,'OCM') ;
1 row created.
Elapsed: 00:00:00.01
dbajccorrea@ORCL11G> commit ;
Commit complete.
Elapsed: 00:00:00.00
dbajccorrea@ORCL11G>
Abs,
JC

Flashback Data Archive (Oracle Total Recall) III

Olá,
Vamos ao terceiro artigo rápido explicando um pouco como funciona no Flashback Data Archive.
Eu removi um arquivo da nossa tablespace de testes "acidentalmente".Como é um banco de testes em Windows,vamos resolver o problema:
idle> alter database open;
alter database open
*
ERRO na linha 1:
ORA-01157: não e possivel identificar/bloquear arquivo de dados 6 - consulte
arquivo de analise DBWR
ORA-01110: 6 do arquivo de dados: 'D:\DATA\FBDA01.DBF'
Solução:
idle> alter database datafile 'D:\DATA\FBDA01.DBF' offline;
Banco de dados alterado.
idle> alter database open ;
Banco de dados alterado.
Em outra janela:
SQL*Plus: Release 11.1.0.6.0 - Production on Sßb Ago 29 00:44:29 2009
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Informe o nome do usußrio: sys / as sysdba
Informe a senha:
Conectado a:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
GLOBAL_NAME
---------------------------------------------------------------------sys@ORCL11G
sys@ORCL11G> drop tablespace fbda01 including contents and datafiles;
Tablespace eliminado.
Continuando o terceiro post...
No post anterior criamos uma tablespace para armazenar o nosso Flashback Data Archive e também o próprio flashback archive com um período de retenção de 5 anos(somente para teste).
Relembrando:
sys@ORCL11G> create tablespace fbda01
2 datafile ‘d:\data\fbda01.dbf' size 1g;
Tablespace criado.
sys@ORCL11G> create flashback archive fb_test
2 tablespace fbda01 retention 5 year;
Archive de flashback criado.
Esqueci de mencionar no post anterior mas você pode especificar uma quota na tablespace para um flashback data archive.
Ex.
sys@ORCL11G> create flashback archive fbtest02
2 tablespace fbda01 quota 250m
3 retention 2 year;
Flashback archive created.
sys@ORCL11G>
Vamos adicionar duas linhas na nossa tabela de testes:
sys@ORCL11G> select * from tb_test_fb;
no rows selected
Elapsed: 00:00:00.00
sys@ORCL11G>
sys@ORCL11G> insert into tb_test_fb values(8,10) ;
1 row created.
Elapsed: 00:00:00.04
sys@ORCL11G>
sys@ORCL11G> insert into tb_test_fb values(1,20);
1 row created.
Elapsed: 00:00:00.00
sys@ORCL11G>
Agora vamos testar um update na tabela e ver se realmente é gravado no flashback archive:
sys@ORCL11G> update tb_test_fb set x=16 where x=1 ;
1 row updated.
Elapsed: 00:00:00.02
sys@ORCL11G>
sys@ORCL11G> commit ;
Commit complete.
Elapsed: 00:00:00.02
sys@ORCL11G>
Consulta a tabela :
sys@ORCL11G> select * from tb_test_fb;
X Y
---------- ----------
8 10
16 20
Elapsed: 00:00:00.02
Será que conseguimos buscar do histórico armazenado no flashback archive?
sys@ORCL11G> select dbms_flashback.get_system_change_number from dual ;
GET_SYSTEM_CHANGE_NUMBER
------------------------
1589292
Elapsed: 00:00:00.03
sys@ORCL11G>
sys@ORCL11G> update tb_test_fb set x=16 where x=1 ;
1 row updated.
Elapsed: 00:00:00.00
sys@ORCL11G> commit ;
Commit complete.
Elapsed: 00:00:00.00
sys@ORCL11G>
sys@ORCL11G>
sys@ORCL11G> select * from tb_test_fb ;
X Y
---------- ----------
8 10
16 20
Elapsed: 00:00:00.01
sys@ORCL11G>
sys@ORCL11G> select * from tb_test_fb
2 as of timestamp (systimestamp - interval '5' minute) ;
X Y
---------- ----------
8 10
1 20
Elapsed: 00:00:00.04
sys@ORCL11G>
sys@ORCL11G> select dbms_flashback.get_system_change_number from dual ;
GET_SYSTEM_CHANGE_NUMBER
------------------------
1589821
Elapsed: 00:00:00.01
sys@ORCL11G> select sysdate from dual;
SYSDATE
-------------------
29/08/2009 01:50:05
Elapsed: 00:00:00.01
Como visto,conseguimos recuperar o valor antes da mudança como se fosse na tablespace de undo.
Foi um post simples,mas acredito que mostrou a funcionalidade desta feature.
Abs,
JC

Monday, August 24, 2009

Flashback Data Archive (Oracle Total Recall) II

Continuando o post anterior vamos colocar a mão na massa e criar os "objetos" necessários para demonstrar o uso desta feature.
Criação da tablespace  e o flashback data archive de teste:
Conectado a:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
GLOBAL_NAME
--------------------------------------------------------------------------------
sys@ORCL11G
sys@ORCL11G> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for 32-bit Windows: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production
sys@ORCL11G> create tablespace fbda01
2 datafile 'd:\data\fbda01.dbf' size 1g;
Tablespace criado.
sys@ORCL11G> create flashback archive fb_test
2 tablespace fbda01 retention 5 year;
Archive de flashback criado.
Abaixo as visões onde podemos obter informações sobre os objetos:
sys@ORCL11G> SELECT FLASHBACK_ARCHIVE#,TABLESPACE_NAME
2 FROM DBA_FLASHBACK_ARCHIVE_TS;
FLASHBACK_ARCHIVE# TABLESPACE_NAME
------------------ ------------------------------
1 FBDA01
Decorrido: 00:00:00.00
sys@ORCL11G>
sys@ORCL11G> select flashback_archive_name,flashback_archive#,retention_in_days
2 from dba_flashback_archive;
FLASHBACK_ARCHIVE_NAME
----------------------------------------------------------------------------------------------------
FLASHBACK_ARCHIVE# RETENTION_IN_DAYS
------------------ -----------------
FB_TEST
1 1825
Decorrido: 00:00:00.00
sys@ORCL11G>
Atribuição de permissões para Flashback Data Archive
Para criar ou modificar um flashback data archive um usuário necvessita ter o privilégio de sistema FLASHBACK ARCHIVE ADMINISTER.Já para ativar o  rastreamento em uma tabela ou seja monitorar os updates e deletes é necessário o privilégio de objeto FLASHBACK ARCHIVE.
Para terminar o nosso post vamos criar uma tabela e atribuir a mesma a um flashback data archive :sys@ORCL11G>
sys@ORCL11G> create table tb_test_fb
2 (x number,y number)
3 tablespace users
4 flashback archive fb_test;
Tabela criada.
Decorrido: 00:00:01.87
sys@ORCL11G>
sys@ORCL11G> create table tb_testfb2
2 (a number,b number)
3 tablespace users
4 ;
Tabela criada.
Decorrido: 00:00:00.02
sys@ORCL11G> alter table tb_testfb2 flashback archive fb_test;
Tabela alterada.
Decorrido: 00:00:00.46
No proximo post vamos testar como funciona o armazenamento dos dados no Flashback Data Archive.
Abs,
JC

Flashback Data Archive (Oracle Total Recall) I

Flashback Data Archive (Oracle Total Recall) é uma nova feature do Oracle Database originada na versão 11g.
Devido a necessidade  de um controle maior nas alterações feitas nas linhas de uma determinada tabela,normalmente tabelas críticas do banco de dados a Oracle lançou esta feature para dar suporte a regulamentações recentes como SOX/Sarbox(Sarbanes-Oxley Act) e HIPAA(Health Insurance Portability and Accountability Act ) que são leis criadas nos US para regulamentar auditoria/segurança nas empresas e a ultima para a área da saúde são exemplos desta necessidade.
Na parte prática ou tecnica temos uma criação de uma ou mais áreas de repositórios que pode ser uma área padrão,período de retenção para os objetos no repositório e é claro os objetos a serem monitorados para coletar estas mudanças.
Podemos também acessar usando a feature Flashback Query com a cláusula AS OF em uma instruçãoSELECT .
O  Flashback Data Archive funciona de maneira parecida com a tableapace de Undo mas registra apenas instruções Update e Delete.
Nos próximos posts iremos criar um Flashback Data Archive,conceder permissões a usuários e objetos e é claro consultar os dados que foram para o histórico.
Abs,
JC

Tuesday, August 18, 2009

Dica útil - Catalogando arquivos com RMAN

Pessoal,

Este post é rápido.Uma dica muito útil para catalogar multiplos arquivos de uma só vez com o RMAN.

Isto se faz usando o comando CATALOG START WITH dentro do RMAN.

Um exemplo:

CATALOG START WITH ‘/Transfer/hmlg/archives/310709′ NOPROMPT;

A palavra NOPROMPT não exibe a opção de confirmação.

Essa foi a dica!

Abs,

JC