Showing posts with label tablespace. Show all posts
Showing posts with label tablespace. Show all posts

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

Thursday, March 19, 2009

Considerações sobre Undo Tablespace

Abaixo uma reposta que enviei no fórum de discussão sobre duvidas com undo tablespace.

Colega,Undo Tablespaces não armazenam objetos(ex. table,index),mas sim armazenam "imagens" de uma transação(do dado propriamente dito) antes deste dado ser modificado,isto para promover um situação chamada de leitura consistente.além de outras funcionalidades que ela tem como Rollback,Oracle Flashback Query e principalmente Recover Database.

Primeiro você deveria se perguntar porque você precisa mexer com uma tablespace que está lá "quietinha".

Você pode ter mais de uma Undo Tablespace no seu banco,mas só uma pode ser "setada" como ativa,e é esta que o seu " Oracle" vai usar para gerenciar Rollback,recover,flashback ,você estiver usando essa feature.Você pode criar uma nova Undo Tbs e dar um DROP na antiga.Você pode dar um RESIZE no datafile e redimensionar sua undo tbs.Você pode alterar os parametros com UNDO_RETENTION = XXX com ALTER SYSTEM SET,pode dar um ALTER TABLESPACE , e alterar uma tablespace com RETENTION GUARANTEE ou NOGUARANTEE(isso tem que ser analisado com cuidado),primcipalmente se o seu banco é de "PROD".Enfim tem uma serie de coisas que você pode fazer com Undo Tablespace,dependendo é claro da sua NECESSIDADE.

Pelo que você mencionou você está usando UNDO_RETENTION com um valor especificado em 900(segundos).

Dê uma olhada na DBA_TABLESPACES para ver se você está usando RETENTION GUARANTEE ou não.Isso pode afetar muito,principalmente se sua TABLESPACE não foi criada com AUTOEXTEND.

Algumas coisas interessantes que você deve saber é que:

-Se sua tablespace está com AUTOEXTEND ela crescerá conforme a necessidade do seu banco Oracle.Senão você terá que dimensionar manualmente o datafile.


- Se estiver com RETENTION GUARANTEE,o Oracle vai "preservar"garantindo a 'imagem" do seu dado antigo pelo periodo especificado no UNDO_RETENTION.Senão estiver com a opção GUARANTEE ,caso o Oracle necessite de espaço para uma imagem de uma nova transação,e sua tablespace não estiver com AUTOEXTEND ele irá sobrescrever as imagens das suas transações anteriores "expiradas" e "else if" ainda não tiver espaço suficiente o Oracle vai começar a sobrescrever as imagens anteriores "não-expiradas"(então começa um problemão).