sexta-feira, 28 de março de 2008

Restrições de Integridade no Oracle: Alterar do estado de DISABLE VALIDATE para ENABLE VALIDATE. Bug confirmado.

Olá,
Com relação ao artigo publicado em 19 de Fevereiro de 2008 intitulado "É possível que uma restrição esteja no estado ENABLE VALIDATE e ainda assim mesmo permitir dados existentes que violem a restrição?", e pelo fato de no mês passado eu ter postado um comentário na página da Oracle relatando sobre o problema, hoje recebi uma resposta por e-mail da Divisão de Tecnologia da Oracle. Enfim, parece que realmente foi confirmado um bug como demonstrado no e-mail abaixo:

Hello Eduardo,

Last month you provided regarding constraints. It took me a while to track this down, but today I learned that in fact you have discovered a code bug. Thanks for reporting this. A bug report has been filed and this will be fixed as soon as possible.


As I am in the documentation group, I will not be able to track the progress for you. However, the README associated with each release of the database lists known bugs, so if necessary you could track the bug that way. Let me know if you want the bug number -- I can get that for you.

Regards,
Diana

Subject: User comment for Oracle Database SQL Language Reference (b28286):
Move from DISABLE VALIDATE to ENABLE VALIDATE
Date: Fri, 22 Feb 2008 14:15:23 -0800
From: [confidencial]
To:
[confidencial]
CC: [confidencial]

Submitter: legatti
Book title: Oracle Database SQL Language Reference
Part number: b28286
Release: 11g Release 1 (11.1)
Topic title: constraint
URL: http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/clauses002.htm
Status: Forwarded
Submitted on: 18-FEB-08


Hi,

I would like to comment this statement below:

"ENABLE Clause: Specify ENABLE if you want the constraint to be applied to the data in the table."

My point of view has based according to this issue below:

SQL> create table parent (id number constraint pk_parent primary key);

Table created.

SQL> create table child (id number constraint fk_child_parent references parent);

Table created.

SQL> insert into parent values (1);

1 row created.

SQL> insert into child values (1);

1 row created.

SQL> alter table child modify constraint fk_child_parent disable validate;

Table altered.

SQL> delete from parent;

1 row deleted.

SQL> alter table child modify constraint fk_child_parent enable validate;

Table altered.

SQL> select * from parent;

no rows selected

SQL> select * from child;


        ID
----------
         1

SQL> select constraint_name,status,validated from user_constraints where table_name='CHILD';

CONSTRAINT_NAME                STATUS   VALIDATED
------------------------------ -------- -------------
FK_CHILD_PARENT                ENABLED  VALIDATED


In short, according to documentation, ENABLE VALIDATE specifies that all old and new data also complies with the constraint. An enabled validated constraint guarantees that all data is and will continue to be valid. Therefore, if any row in the table violates the integrity constraint, the constraint remains disabled and Oracle must returns an error, otherwise if all rows comply with the constraint, Oracle must enable the constraint.


So, how is it possible that a foreign key constraint that has the status ENABLE and state VALIDATE, but in fact, the current data inside the table violates the integrity constraint? Therefore, the ENABLED VALIDATE state must ensure that all incoming and existing data conforms to the constraint. In my point of view whenever a foreign key constraint is moved from the DISABLE VALIDATE state to the ENABLE VALIDATE state, all data must be checked. It does make sense?

Regards.

Eduardo Legatti
System Analyst/DBA
Brazil/Belo Horizonte
Oracle 9i Certified Professional

--
=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/=/
Diana Lorentz, Documentation Project Manager
Information Development, Server Technologies Division, Oracle
Working off site

quarta-feira, 19 de março de 2008

Descomplicando RAID 01 (0+1) e RAID 10 (1+0)

Olá,
 
Quando falamos em bancos de dados, a primeira coisa que vêem em nossas mentes é a preocupação com a performance, mas segurança para mim, realmente é fundamental. Neste artigo irei comentar um pouco sobre o uso da tecnologia RAID, mais especificamente sobre o RAID 0, RAID 1 e a junção dos dois que é um híbrido entre RAID 0 e RAID 1. Outra coisa que irei comentar é sobre a diferença entre RAID 10 (1+0) e RAID 01 (0+1) que são implementações completamente diferentes e que às vezes muitos profissionais de TI não percebem. Em resumo, mostrarei porque uma configuração em RAID 10 (1+0) tem uma certa superioridade em relação a uma configuração em RAID 01 (0+1).

O que é RAID?
  • RAID por hardware é sempre uma controladora de disco, isto é, um dispositivo que pode através de um cabo conectar os discos. Geralmente ele vem na forma de uma placa adaptadora que pode ser "plugada". O conceito básico do RAID (Redundant Array of Independent Disks) que, traduzido para o português, seria algo como Matriz Redundante de Discos Independentes é combinar vários discos em uma disposição que se obtenha não só alta performance, mas também segurança no que se refere a tolerância à falhas de disco. Na verdade ele visa primariamente a proteção contra falha de disco às custas do uso de mais espaço em disco. Entretanto, as implementações do RAID têm diferenças importantes em suas características de E/S, as quais têm impacto sobre o desempenho e limitam ou ampliam sua adequação às diferentes situações. Cada nível do RAID difere na forma como a redundância é implementada no nível de hardware. Existem vários tipos de RAID e foram definidos inicialmente cinco tipos de arquiteturas de disposição de discos, RAID 1 até RAID 5, cada qual com tolerância a falhas, porém com diferentes propostas de características e performance. Além destas cinco arquiteturas, tornou-se comum referir-se a uma disposição não redundante como RAID 0.
  • RAID por software é uma configuração de módulos do kernel, juntamente com utilitários de administração que implementam RAID puramente por software, e não requer um hardware especializado. RAID por software, por ter sua natureza no software, tende a ser muito mais flexível que uma solução por hardware. O lado negativo é que ele em geral requer mais ciclos e capacidade de CPU para funcionar bem, quando comparado a um sistema de hardware.
Em resumo, comparando as duas soluções e no meu ponto de vista, o RAID via hardware é transparente para o sistema operacional, e isto tende a simplificar o gerenciamento, já que via software mesmo que tenha mais opções e escolhas de configurações, pode fazer com que o gerenciamento se torne mais complexo.



RAID 0 (STRIPING – SEGMENTAÇÃO DE DADOS)


O RAID 0 não é realmente um array redundante. Como dito anteriormente, eu tiraria o R (Redundante) e deixaria apenas o AID (Array de discos Independentes) pelo fato de mesmo não proporcionar nenhuma tolerância contra falhas de disco. O uso de RAID 0 é mais indicado quando custo e performance são críticos e a integridade de dados pode ficar em segundo plano, ou seja, abrir mão da segurança em detrimento da performance. Chamamos de "striping" a combinação de vários discos em apenas uma única unidade lógica de armazenamento que particiona o espaço de armazenamento de cada disco em faixas. O striping busca melhorar o desempenho de disco distribuindo a atividade de E/S através de várias unidades de disco e reduzindo ou eliminando um gargalo de E/S. Como exemplo, é possível usar de dois a quatro discos rígidos em RAID 0, onde os mesmos serão acessados como se fosse um único disco, aumentando o desempenho do acesso aos dados. Os dados gravados são divididos em partes e são gravados por todos os discos. Na hora de ler, os discos são acessados ao mesmo tempo. De acordo com algumas pesquisas, teremos um aumento de desempenho de cerca de 97% usando dois discos, 179% usando 3 discos e algo próximo a 249% usando 4 discos. As capacidades dos discos são somadas e usando 4 discos de 80 GB, por exemplo, passaríamos a ter um único grande disco de 320 GB.

Obs: O tamanho do disco virtual criado a partir do RAID 0 é igual ao dobro do tamanho do menor disco. Isso possibilita utilizarmos discos de diferentes capacidades, porém perderemos espaço no disco de maior tamanho e o desempenho também ficará limitado ao desempenho do disco mais lento.

Atenção: a desvantagem do RAID 0 é que ele não é tolerante a falhas, ou seja, caso um disco (onde os arquivos do Oracle estão segmentados) falhe, todo o array de armazenamento falhará e conseqüentemente a instância Oracle abortará.
 
Exemplificando, em uma configuração RAID 0 com dois discos, um arquivo de 1 MB estaria repartido (512 KB em um setor de um disco e 512 KB em outro setor de outro disco) e a leitura dos dois setores seria feita ao mesmo tempo (um setor em cada disco), dobrando, teoricamente, a velocidade de leitura e escrita, já que o acesso aos discos tanto para escrita quanto leitura dos dados será feito em paralelo.



RAID 1 (MIRRORING - ESPELHAMENTO)

O RAID 1 consiste nos mirrors (espelhamento) de disco que mantém cópias completas e idênticas dos dados de cada mirror de disco. Todas as alterações feitas nos dados de um disco são simultaneamente feitas no mirror de disco correspondente. As leituras de disco, por outro lado, podem ser executadas em um dos mirrors de disco (a controladora de disco seleciona o mirror de disco menos ocupado) ou simultaneamente nos dois discos pelo fato da operação de E/S estar distribuída nos dois discos. Em resumo, a operação com dados neste nível possuem tendência de serem gravados mais lentamente (mas realmente acredito que a performance se mantém a mesma), porém com leitura rápida já que o sistema terá dois ponteiros para achar os arquivos. É importante salientar que o sistema mostrará apenas 1 disco, pois o segundo será um clone do primeiro. Imagine que tenhamos dois discos com 80 GB cada. Para o sistema, existirá apenas uma unidade com 80 GB, pois os dados estarão sendo duplicados (espelhados) no segundo disco, e por esse motivo passamos a ter tolerância a falhas, pois se um disco falhar o conjunto continua em operação e, se os discos suportarem a tecnologia de hot-swap (troca à quente), o disco defeituoso poderá ser substituído e o sistema fará o sincronismo sem a necessidade de parada do equipamento. No meu ponto de vista, o RAID 1 geralmente (mas nem sempre) é um tipo de array de discos adequado para os arquivos do Oracle. Se eu tivesse que escolher apenas um tipo de array de discos para o Oracle, o RAID 1 seria a melhor opção.


Obs: O RAID 1 não pode ser considerado como um substituto para backup porque neste nível os dados são replicados em discos, e no caso de deletarmos o conteúdo do primeiro disco, automaticamente os dados do disco-espelho também serão deletados.



Multiplexing e Mirroring são a mesma coisa?

Não. À primeira vista, o mirroring (espelhamento) e o multiplexing (multiplexação) parecem ser duas maneiras de fazer exatamente a mesma coisa. Por que se importar com o mirroring de hardware quando o arquivo está multiplexado, ou por outro lado, por que multiplexar quando o arquivo está no disco espelho? Na verdade, o multiplexing e os mirroring têm diferenças sutis no tipo de proteção que eles fornecem. O multiplexing é implementado no nível de software. Cada arquivo é gravado pelas operações de gravação lógica. Se uma operação de gravação lógica em uma cópia de um arquivo multiplexado em outro disco gravar dados corrompidos, os outros arquivos ainda estarão intactos, porque serão feitas gravações diferentes neles. Esse tipo de proteção não é conseguido pelo mirroring porque uma gravação corrupta nos arquivos vai corromper todas as cópias de espelho simultaneamente. Entretanto, o mirroring oferece uma vantagem diferente. Se o control file (arquivo de controle) for multiplexado em outro disco, mas não estiver espelho, a perda de uma única cópia muliplexada do arquivo de controle fará com que uma instância Oracle em execução dê pane porque o Oracle são conseguirá acessar o arquivo perdido. Neste caso, a instância deverá ser reinicializada depois que a localização do arquivo multiplexado estiver novamente disponível para o Oracle, ou após a cópia do arquivo de controle que está faltando tiver sido removida do parâmetro CONTROL_FILES no arquivo de inicialização da instância. Portanto, a perda de um arquivo de controle que é multiplexado mas não tem um espelho, causará paralisação devido à pane da instância. Entretanto, se o arquivo de controle tiver espelho, a instância Oracle não terá pane e continuará sendo executada mesmo depois que um disco espelho se perder, porque o espelho no nível de hardware é transparente para o servidor Oracle.
 

Mesclando mirroring e striping
 
Este tipo de RAID é um híbrido do RAID 0 e RAID 1 que usa tanto o mirroring quanto o striping. Ele combina os benefícios de alta disponibilidade oferecidos pelo RAID 1 com os benefícios de desempenho relacionados ao striping do RAID 0. Existem duas combinações que podem ser escolhidas ao utilizar a técnica de striping e mirroring juntas a qual eu chamo de nível duplo de RAID. Observe que é preciso no mínimo quatro discos para montar este tipo de configuração.


RAID 01 (ou RAID 0+1) – Striping e Mirroring


Em uma implementação RAID 0+1, os dados são espelhados através de grupos de discos segmentados, isto é, os dados são primeiro segmentados e para cada segmento criados é feito um espelho, como demonstrado na figura abaixo:
 
Na figura acima vemos que o discos 1 e 2 formam um RAID 0 sendo após espelhados pelo discos 3 e 4 também em RAID 0, formando assim RAID 1 sobre RAID 0. Apesar de ser uma configuração que proporciona alta performance, se perdermos um disco em um dos lados, praticamente teremos uma configuração em RAID 0, porque em uma configuração RAID 0 se um disco falha todo o conjunto falhará. Neste caso, se o disco 1 falhar, então o disco 2 que está intacto ficará inutilizado, restando assim os discos 3 e 4 em RAID 0.


RAID 10 (ou RAID 1+0) – Mirroring e Striping


Em uma implementação RAID 1+0, os dados são segmentados através de grupos de discos espelhados, isto é, os dados são primeiro espelhados e para depois serem segmentados como demonstrado na figura abaixo:


Na figura acima vemos que o discos 1 e 2 formam um RAID 1 e os discos 3 e 4 também sendo após segmentados em RAID 0, formando assim RAID 0 sobre RAID 1. Além de ser uma configuração que proporciona o mesmo nível de performance proporcionado pelo RAID 01, o RAID 10 proporciona mais tolerância à falhas que o RAID 01 porque poderíamos ter uma falha simultânea dos discos 1 e 3 e ainda assim o conjunto estaria intacto, pois teríamos os espelhos em perfeito funcionamento. No meu ponto de vista, este conjunto é o mais indicado nos casos onde necessitamos aliar performance e redundância, como é o caso, por exemplo, de bancos de dados Oracle de alta performance.


Conclusão

Nos dois casos (0+1 ou 1+0), a perda de um único disco não resultará na falha do sistema RAID. A diferença aparece no caso da perda de um segundo disco que dependendo do disco, o sistema RAID 0+1 ficaria em desvantagem sobre o sistema RAID 1+0. Uma outra diferença é na velocidade de recuperação, porque caso ocorra uma falha de disco, no sistema RAID 1+0 será necessário apenas re-espelhar um disco, ao contrário do sistema RAID 0+1 que será necessário espelhar todo um conjunto segmentado. Portanto não se esqueça que RAID 01 é diferente de RAID 10.

RAID 01 (0+1)
RAID 10 (1+0)
 Em resumo, para bancos de dados de produção de alta disponibilidade, escolha os arrays de disco hot swappable que permitem substituir um disco falho sem precisar desligar todo o array. Se eu não estiver enganado, esse recurso é quase que um padrão atualmente. Melhor ainda que os discos hot swappable é o recurso standby disk, no qual um disco substituto já está contido no array, pronto para assumir caso um disco falhe.

 
Gerenciamento Automático de Armazenamento no Oracle (ASM)
 
A constante evolução da tecnologia Oracle busca melhorar a resposta e simplificar a gestão da plataforma tecnológica. Como resultado, surgiu o revolucionário Automatic Storage Manager, ou ASM, componente da nova versão do banco de dados Oracle 10g. O ASM possibilita que o usuário não se preocupe com RAID. Com ele, é possível aproveitar não apenas os recursos do hardware de armazenamento, mas também todas as decisões de stripping e espelhamento adequados à configuração de dados e sua dinâmica de utilização, mas é importante salientar que o ASM não substitui o RAID, mas aproveita os recursos do hardware e aplica de maneira automática e transparente para o administrador a configuração de stripping e mirroring mais adequada, de acordo com o número de dispositivos disponíveis e com as características de uso e volume do banco de dados em questão. Esse esclarecimento é importante para evitar confusões, já que o ASM usa as capacidades de RAID do hardware.

Para maiores detalhes sobre RAID com Oracle, visite a página da Oracle:
http://www.oracle.com/technology/deploy/availability/htdocs/hafaq.html
http://www.oracle.com/technology/deploy/availability/techlisting.html


segunda-feira, 10 de março de 2008

Introdução ao conceito de Tablespaces no Oracle

Olá,

Começarei este artigo fazendo a seguinte pergunta: Qual é a relação entre tablespaces e arquivos de dados? Bom, para responder esta pergunta, primeiro precisamos entender como os dados são armazenados no banco de dados Oracle. Para começar, o Oracle armazena dados logicamente em tablespaces e fisicamente em arquivos de dados (datafiles). Apesar dos arquivos de dados e os tablespaces estarem muito "inter-relacionados", os mesmos possuem diferenças importantes:

  • Um banco de dados Oracle consiste em uma ou mais unidades de armazenamento lógicas denominadas tablespaces, que armazenam coletivamente todos os dados do banco de dados.
  • Cada tablespace em um banco de dados Oracle consiste em um ou mais arquivos denominados arquivos de dados (datafiles), que são estruturas físicas compatíveis com o sistema operacional no qual o Oracle é executado.
  • Os dados de um banco de dados são armazenados coletivamente nos arquivos de dados que constituem cada tablespace do banco de dados.

Como um banco de dados é um conjunto de arquivos de dados, é muito importante que entendamos como um banco de dados Oracle agrupa esses arquivos. Como dito anteriormente, o Oracle faz isso sob a proteção de um objeto de banco de dados chamado tablespace. Antes de poder inserir dados em um banco de dados Oracle, primeiro é necessário criar um tablespace e depois uma tabela dentro desse tablespace que conterá os dados. Podemos observar que na criação de um banco de dados utilizando o DBCA, o Oracle como padrão sempre cria um tablespace de dados chamado USERS. Ao criar uma tabela é necessário incluir todas as informações sobre o tipo de dados que deseja manter. O código abaixo, gerado para criar a tabela CLIENTE, ilustra como o Oracle armazena informações sobre o tipo de dado que irá registrar:

SQL> create table cliente
 2  (cod_cliente   number constraint pk_cliente primary key,
 3   nome          varchar2(60)  not null,
 4   endereco      varchar2(100) not null,
 5   telefone      number,
 6   data_cadastro date)
 7  tablespace users;

Tabela criada.

SQL> desc cliente
Nome                          Nulo?    Tipo
----------------------------- -------- --------------------
COD_CLIENTE                   NOT NULL NUMBER
NOME                          NOT NULL VARCHAR2(60)
ENDERECO                      NOT NULL VARCHAR2(100)
TELEFONE                               NUMBER
DATA_CADASTRO                          DATE

SQL> select table_name,tablespace_name
  2    from user_tables
  3   where table_name='CLIENTE';

TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
CLIENTE                        USERS

Na instrução acima, foi criada uma tabela que é o meio mais comum de armazenar dados em um banco de dados. Os dados de um segmento de tabela são armazenados aleatoriamente no tablespace e o DBA tem pouco controle sobre a localização das linhas dos blocos de uma tabela. Por falar nisso, o que é um segmento? Os segmentos são objetos que ocupam espaço em um banco de dados. Existem vários tipos de segmentos como tabelas, índices, de undo, temporários, LOB, entre outros. Já uma extensão (extent), é um espaço usado por um segmento em um tablespace. Para terminar, um bloco Oracle consiste em um ou mais blocos do sistema operacional e seu tamanho é definido na criação do tablespace. Então a estrutura lógica de um banco de dados Oracle se resume em tablespaces que contém segmentos que contém extensões que contém blocos. A figura abaixo ilustra esta estrutura lógica:
 




SQL> select segment_name, segment_type, tablespace_name, bytes,blocks, extents
  2    from user_segments
  3   where segment_name = 'CLIENTE';


SEGMENT_NAME   SEGMENT_TYPE TABLESPACE_NAME  BYTES     BLOCKS   EXTENTS
-------------- ------------ ---------------- -------- ------- ---------
CLIENTE        TABLE        USERS               65536       8         1

Vale a pena salientar que eu incluí o nome do tablespace USERS no comando de criação da tabela apenas para exemplificar, já que uma tabela sempre será criada no tablespace padrão do usuário definido na sua criação (create user).

SQL> select default_tablespace from user_users;

DEFAULT_TABLESPACE
------------------------------
USERS
 
Agora que você entende porque isso se chama tablespace, vamos tentar compreender porque precisamos de tablespaces para agrupar arquivos de dados. A melhor analogia para se explicar banco de dados, tablespace, arquivo de dados, tabelas e dados é a imagem de um fichário. Imagine um banco de dados como um fichário: as gavetas dentro do fichário são os tablespaces; as pastas nessas gavetas são os arquivos de dados; os papéis em cada pasta são as tabelas; a informação escrita no papel de cada pasta são os dados. Em resumo, o tablespace é um modo de agrupar arquivos de dados.

É aconselhável não misturar dados de aplicativos no mesmo tablespace. Então, ao criar tablespaces para seus aplicativos, dê a eles um nome descritivo (por exemplo, dados de um sistema de RH podem ser mantidos no tablespace RECURSOS_HUMANOS). Em resumo, aplicação separada corresponde a tablespace separado.

O que é o tablespace USERS?

Como demonstrado anteriormente, este geralmente é o tablespace padrão para os usuários. Se um usuário criar um objeto, tal como uma tabela ou um índice, sem especificar o tablespace, o Oracle o cria no tablespace padrão do usuário, isso se o tablespace padrão do usuário foi definido para utilizar o tablespace USERS.

O que é o tablespace SYSTEM?

O tablespace SYSTEM (tablespace de sistema) é uma parte obrigatória de todo banco de dados Oracle. É onde o Oracle armazena todas as informações necessárias para o seu próprio gerenciamento. Em resumo, SYSTEM é o tablespace mais crítico do banco de dados porque ele contém o dicionário de dados. Se por algum motivo ele se tornar indisponível, a instância do Oracle abortará. Por esse motivo, o tablespace SYSTEM nunca pode ser colocado offline, ao contrário de um tablespace comum como, por exemplo, o tablespace USERS.

O que é o tablespace TEMP?

O tablespace TEMP (tablespace temporário) é onde o Oracle armazena todas as suas tabelas temporárias. É o quadro branco ou papel de rascunho do banco de dados. Assim como às vezes precisamos de um lugar para anotar alguns números para pode somá-los, o Oracle também precisa de algum espaço em disco temporário. O Oracle geralmente utiliza o tablespace temporário para armazenar objetos transitórios durante as classificações e agrupamentos de dados durante a execução de uma SQL contendo as cláusulas ORDER BY e GROUP BY, entre outras. É importante dizer também que os dados de sessão das tabelas temporárias globais (Global Temporary Tables) também ficam no tablespace TEMP. Assim como o tablespace SYSTEM é o tablespace mais crítico do banco dados, o tablespace TEMP é o menos crítico do banco de dados exatamente porque armazena apenas os segmentos temporários durante as operações de classificação de dados e, como tal, no caso de uma falha, ele pode simplesmente ser dropado e recriado, em vez de ser restaurado e recuperado.

O que é o tablespace UNDO?

Todos os bancos de dados Oracle precisam de um local para armazenar informações a desfazer. O que isso significa? Esse tablespace que contém seus segmentos de reconstrução em versões anteriores ao Oracle 9i chamado de RBS (tablespace de rollback), possui a capacidade de recuperar transações incompletas ou abortadas. Um segmento de undo é usado para salvar o valor antigo quando um processo altera dados de um banco de dados. Ele armazena a localização dos dados e também os dados da forma como se encontravam antes da modificação. Basicamente, os objetivos dos segmentos de undo são:

  • Rollback de transação: Quando uma transação modifica uma linha de uma tabela, a imagem original das colunas modificadas é salvas no segmento de UNDO, e se for feito o rollback da transação, o servidor Oracle restaurará os valores originais gravando os valores do segmento de UNDO novamente na linha.
  • Recuperação de Transação: Se ocorrer uma falha de instância enquanto houver transações em andamento, o servidor Oracle precisará desfazer as alterações não submetidas à commit quando o banco de dados for aberto novamente. Esse rollback faz parte da recuperação da transação. Portanto, a recuperação só é possível porque as alterações feitas no segmento de UNDO também são protegidas pelos arquivos de redo log online.
  • Consistência de Leitura: Enquanto houver transações em andamento, outros usuários do banco de dados não deverão ver as alterações não submetidas à commit feitas nessas transações. Além disso, uma instrução não deverá ver as alterações submetidas à commit após o início da execução dessa instrução. Os valores antigos (dados de undo) dos segmentos de UNDO também são usados para oferecer aos leitores uma imagem consistente de uma instrução específica.

O que é o tablespace SYSAUX?

Este tablespace auxiliar não existe nas versões anteriores ao Oracle 10g e foi criado especialmente para aliviar o tablespace SYSTEM de segmentos associados a algumas aplicações do próprio banco de dados como o Oracle ultra search, Oracle Text e até mesmo segmentos relacionados ao funcionamento do Oracle Enterprise Manager entre outros. Como resultado da criação desse tablespace, alguns gargalos de I/O freqüentemente associados ao tablespace SYSTEM foram reduzidos ou eliminados. Vale a pena salientar que não é bom que o tablespace SYSAUX seja colocado no modo offline, pelo fato de correr o risco do banco de dados não funcionar corretamente. Portanto, podemos dizer que o mesmo é parte integrante e obrigatório em todos os bancos de dados à partir do Oracle 10g. Existe uma view de dicionário de dados que mostra os ocupantes neste tablespace:
  
SQL> select occupant_name, schema_name, space_usage_kbytes
  2    from v$sysaux_occupants;

OCCUPANT_NAME   SCHEMA_NAME          SPACE_USAGE_KBYTES
--------------- -------------------- ------------------
LOGMNR          SYSTEM                             7488
LOGSTDBY        SYSTEM                                0
STREAMS         SYS                                 192
AO              SYS                                 960
XSOQHIST        SYS                                 960
SM/AWR          SYS                               68352
SM/ADVISOR      SYS                                7360
SM/OPTSTAT      SYS                               21120
SM/OTHER        SYS                                3328
STATSPACK       PERFSTAT                              0
ODM             DMSYS                              5504
SDO             MDSYS                              6080
WM              WMSYS                              6656
ORDIM           ORDSYS                              512
ORDIM/PLUGINS   ORDPLUGINS                            0
ORDIM/SQLMM     SI_INFORMTN_SCHEMA                    0
EM              SYSMAN                            61632
TEXT            CTXSYS                             4736
ULTRASEARCH     WKSYS                              7296
JOB_SCHEDULER   SYS                                 256
 
Uma outra informação bastante útil que esta view oferece é o nome de uma procedure que o DBA pode utilizar para mover dados de um ocupante para um outro tablespace:

SQL> select occupant_name, move_procedure
  2  from v$sysaux_occupants where occupant_name = 'LOGMNR';

OCCUPANT_NAME   MOVE_PROCEDURE
--------------- ---------------------------------------
LOGMNR          SYS.DBMS_LOGMNR_D.SET_TABLESPACE
  

Gerenciamento de Espaço em Tablespaces

Os tablespaces alocam espaço em extensões (extents). Eles podem ser criados para usar um dos dois métodos de controle de espaço livre e utilizado:

  • Tablespaces gerenciados localmente: As extensões são gerenciadas no tablespace por bitmaps. Cada bitmap corresponde a um bloco ou a um grupo de blocos. Quando uma extensão é alocada ou liberada para reutilização, o servidor Oracle altera os valores do bitmap para mostrar o novo status dos blocos. A partir do Oracle 9i este gerenciamento local é o padrão.
  • Tablespaces gerenciados por dicionário: As extensões são gerenciadas pelo dicionário de dados. O servidor atualiza as tabelas apropriadas no dicionário de dados sempre que uma extensão é alocada ou desalocada.
Nas versões anteriores ao Oracle 8i, os extents de todos os tablespaces eram gerenciados centralmente por meio das tabelas do dicionário de dados, quando os extents são alocados ou desalocados em qualquer lugar do banco de dados, o Oracle atualiza as tabelas do dicionário de dados para registrar o novo mapa de armazenamento. A partir do Oracle 8i um novo recurso possibilitando o gerenciamento local dos extents dentro de um tablespace praticamente decretou a morte do tablespace gerenciado por dicionário de dados.

Como dito anteriormente, o Oracle mantém um bitmap em cada arquivo de dados de um tablespace gerenciado localmente. Para se criar um tablespace gerenciado localmente, é necessário usar a cláusula EXTENT MANAGEMENT LOCAL como o comando create tablespace. Comparando com os tablespaces gerenciados por dicionário, os tablespaces gerenciados localmente têm um modo completamente diferente de dimensionar os extents. Os parâmetros de armazenamento NEXT, PCTINCREASE, MINEXTENTS, MAXEXTENTS e DEFAULT_STORAGE não são válidos nos casos dos tablespaces gerenciados localmente. Em vez disso, existe a opção de especificar um tamanho uniforme para todos os extents ou especificar apenas o tamanho do extent inicial e deixar que o Oracle determine automaticamente o tamanho de todos os extents subseqüentes. Os extents uniformes ou dimensionados automaticamente podem ser selecionados especificando as opções UNIFORM ou AUTOALLOCATE, respectivamente, ao criar um tablespace gerenciado localmente com o comando CREATE TABLESPACE.

OBS: Os tablespaces gerenciados localmente ajudam a reduzir a overhead de gerenciamento de espaço eliminando a necessidade de várias gravações nas tabelas do dicionário de dados ou nos segmentos de rollback, o que ocorre necessariamente quando o espaço é gerenciado centralmente por meio do dicionário de dados. Segundo a Oracle, os tablespaces gerenciados por dicionário não serão mais suportados nas futuras versões do Oracle:

"Oracle strongly recommends that you create only locally managed tablespaces. Locally managed tablespaces are much more efficiently managed than dictionary-managed tablespaces. The creation of new dictionary-managed tablespaces is scheduled for desupport."

Outra informação importante é que um tablespace gerenciado por dicionário não pode ser criado caso o tablespace SYSTEM seja gerenciado localmente:

SQL> create tablespace tbs_test
  2  logging
  3  datafile /u01/oradata/BD01/test01.dbf' size 5m
  4  extent management dictionary;
create tablespace tbs_test
*
ERRO na linha 1:
ORA-12913: Não é possível criar um tablespace gerenciado por dicionário

SQL> select extent_management
  2    from dba_tablespaces
  3   where tablespace_name = 'SYSTEM';

EXTENT_MANAGEMENT
-----------------
LOCAL