O documento descreve os principais conceitos e estruturas do banco de dados Oracle, incluindo sua arquitetura de camadas física e lógica, tipos de tabelas como tabelas temporárias e particionadas, e restrições como chave primária e estrangeira.
1. Banco de Dados Oracle
Item do Edital: Banco de dados oracle: conceitos e arquitetura, SQL (DML, DDL). Triggers, procedures,
functions e packages. PL/SQL. Segurança e gerenciamento de objetos.
Conceitos e Arquitetura
A arquitetura do oracle subdivide-se em camada física e camada lógica. A camada física consiste de arquivos
armazenados em disco enquanto que a camada lógica mapea os dados da camada física.
1 Camada Lógica
1.1 Banco de dados
O banco de dados é uma coleção de dados em disco gravados em um ou mais arquivos em um servidor de
banco de dados que coleta e mantém as informações relacionadas. O banco de dados possui várias
estruturas físicas e lógicas sendo a tabela a estrutura lógica mais importante do banco de dados. Além disso,
o um banco de dados fornece mecanismos de segurança para evitar acessos não autorizados e assegurar a
confidencialidade dos dados.
1.2 Instâncias
Os principais componentes típicos de um servidor comercial são uma ou mais CPU's, espaço em disco e
memória. No oracle, o banco de dados fica no disco do servidor enquanto que uma instância existe somente
na memória do servidor. Uma instância é composta de um grande bloco de memória alocado em um área
denominada SGA – System Global Area, junto com outros processos rodando em background e que
interagem com a SGA e o banco de dados (arquivos de banco de dados no disco). Mais uma instancia pode
acessar o mesmo banco de dados ou mesmo acessar um banco de dados remoto.
/*não misturar os conceitos de banco de dados e instância */
Estruturas de armazenamento lógico
2. 2.1 Espaços de Tabelas
Os arquivos de banco de dados são agrupados no Oracle em um ou mais espaços de tabelas, onde dentro
de cada um desses espaços (tablespaces) as estruturas lógicas do banco de dados como tabelas e índices se
subdividem em extensões e blocos. A subdivição em tais estruturas facilita o gerenciamento do espaço em
disco pelo Oracle.
Blocos
É a menor unidade de armazenamento no banco de dados Oracle. O tamanho do bloco é um número
específico de bytes geralmente multiplo do tamanho do bloco usado pelo sistema operacional. Atravé dos
parametro de inicalização DB_BLOCK_SIZE , o DBA pode determinar o tamnho do bloco.
Extensões
Um extensão é um agrupamento lógico do banco de dados de vários blocos.
Segmentos
É um grupo de extensões que abrange um objeto de banco de dados como uma unidade, tabela ou índice.
Essa é a menor unidade de armazenamento que o usuário final do banco de dados consegue interagir.
Quatro são os tipos de segmentos, vistos a seguir.
Segmentos de dados
Cada tabela do banco de dados reside em um único segmento de dados, o que pode ser composto de uma
ou mais extensões, mais de um segmento no entanto, podem ser utilizados para armazenar uma tabela no
caso se for uma tabela particionada ou clusterizada (mais a frente veremos isso).
Segmentos de índice
Cada índice é armazenado em seu próprio segmento de índice. Mais de um segmento pode ser usando para
indices particionados ou clusterizados.
Segmento temporário
Quando uma instrução sql é executada ela precisa de espeço em disco para completar alguma operação,
como um ordenação. Caso isso não possa ser relalizado em memória um segmento temporário é alocado
para a instrução poder terminar. Após a execução da operação o segmento deixa de existir.
Segmento de rollback
No oracle 10g o segmento de tabela exite na tabela de espaço SYSTEM. Eles servem para guardar o estado
do banco de dados antes de completar uma transação ou um operação DML. Se houver falha este segmento
é usado para restaurar o estado anterior do banco de dados antes da falha.
3. Estruturas Lógicas do banco de dados Oracle
Tabela
Uma tabela é a unidade básica de armazenamento em um banco de dados e a tabela relacional é o tipo
mais comum de tabela utilzado em banco de dados comerciais. Uma tabea é organizado por heap, ou seja,
as linhas não são armazenadas em um determinada ordem. Cada linha é composta de uma ou mais colunas
e cada coluna tem um tipo de dados e um comprimento. No oracle, além do tipo de dados comumente
utilizados como varchar, string, date, long, etc.. podemos definir um tipo de usuário ou mesmo uma tabela
aninhada. Além disso, a tabela pode ser definida como uma tabela de objeto, no caso da aplicação usar um
banco de dados orientados a objetos.
Tabelas Temporárias
Tabelas temporárias são temporárias no sentido dos dados armazenados na tabela, não na definição da
própria tabela. O comando create global temporary table cria uma tabela temporária. Desde que os
usuário tenham permissão é possivel de se fazer um select na tabela ou mesmo uma instrução DML: insert,
update, delete. Entretanto, cada usuário vê somente seus próprios dados, se ele truncar seus dados,
somente as linhas que ele inseriu serão apagadas.
A temporariedade dos dados em um a tabela temporária pode ser no escopo de uma transação ou de
sessão. No primeiro caso, ao terminar uma transação os dados temporários serão apagados. No segundo
caso, os dados vão sobreviver além de uma transação, mas qdo acabar a sessão do usuário, os dados serão
apagados.
Usa-se a clausula on commit, para controlar a longevidade dos dados – on commit delete rows: apaga
as linhas de uma tabela qdo um commit ou rollback é emitido e on commit preserve rows mantém as
linhas por mais de uma transação, removendo-as qdo a sessão do usuário acabar. Caso haja índices
associados a linhas da tabela temporária, estas serão removidas juntamente com as linhas da tabela
temporária.
Tabelas organizadas por índice
O índice agiliza a procura por uma linha da tabela, tornando as consultas mais eficientes, embora adicione
um overhead no banco de dados, pois este deve manter as linhas de dados e as entradas de índices para a
tabela. Se caso a tabela seja acessada somente para um coluna temos a opção de criar uma IOT – index
organized table, que armazenas as linhas de uma tabela em um árvore B onde cada nó contém a coluna
chaveada juntos com as demais não indexadas. A vantagem dessa tabela é que uma estrutura apenas é
mantida pelo banco de dados em vez de duas. A desvantagem é que uma IOT deve ser uma tabela com
uma chave primária, o que não se aplica a todos os casos. As IOT's não podem ser clusterizadas e não são a
melhor solução para tabelas com muitas colunas e com uma frequencia alta de acessos.
Tabelas de Objeto
O Oracle suporta recursos orientado a objetos no banco de dados, tipos definidos pelo usuário e quais
métodos podem ser executados pelo objetos, facilitando a implementação de banco de dados orientado a
objetos. As tabelas de objeto contem linhas que são objtos por si só ou instancias das definições dos tipos.
As linhas podem ser referenciadas pelo OID do objeto. Exemplo de criação de um tipo de objeto:
create type PERS_TYPE as object
(Last_name varchar2(45)
First_name varchar2(45));
criando a tabela de objetos
create table pers of pers_type;
4. adicionando dados:
insert into pers values(pers_type('Nome', 'Sobrenome'))
Tabelas Externas
Permitem que o usuário acesse uma fonte externa de dados, como um arquivo texto por exemplo, tratando-
o como uma tabela de banco de dados. A criação de uma tabela externa se faz em duas fases. A primeira
usa-se o comando create normalmente, definindo os dados que conterá a tabela. A segunda fase é definido
o mapeamento entre as colunas de banco de dados e a fonte externa de dados. A vantagem disso é que o
usuário pode acessar normalmente os dados de uma fonte externa como se estivesse acessando uma tabela
típica do banco de dados, mas ele não pode alterar, excluir, inserir ou criar índices.
Para o caso de um ambiente de dataware house tais desvantagens talvez não sejam tão ruins já que
permitem a carga do banco através de fontes externas e geralmente os dados não são alterados/deletados.
Tabelas Clusterizadas
Quando duas ou mais tabelas são frequentemente acessadas juntas pode-se criar uma tabela clusterizada
para agilizar as consultas que acessam essas tabelas, ou seja uma tabela contendo todas as colunas
resultando da consulta. Tabelas clusterizadas reduzem o espaço em disco e a quantidade de I/O numa
consulta, pois armazenam uma única vez as colunas que as tabelas tem em comum conhecidas como valor
chave de cluster. O valor chave de cluster também é armazenado em um índice de cluster, que opera como
um índice normal.
Entretanto, se a tabela cristalizada for alvo de frequentes operações de insert/delete as vantagens da
clusterização são perdidas. Se houver maior probabilidade de as tabelas que compõem o cluster serem
acessadas individualmente, tb perde o sentido de se clusterzar essas tabelas.
Cluster de Hash
Cluster de hash é um tipo de tabela clusterizada especial que em vez de usar um indice de cluster, utiliza
uma funçao de hashing para armazenar e recuperar dados em uma tabela. A quantidade estimda de espaço
necessário para a tabela é alocada qdo a tabela é criada, de acordo com o numero de chaves especificados
duranta a criação do cluster:
create cluster order_cluster(order_number number(6))
size 50
hash is order_number hashkeys 1000000;
create table cust_order(
order_number number(6) primary key
order_date date,
customer_number number)
cluster order_cluster(order_number);
Os cluster de hash tem a vantangem de econominar em I/O qdo uma consulta é realizada, pois se os
números de hash keys for suficientemente alto poderemos ter somente uma I/O para buscar uma linha da
tabela.
Cluster de Hash Classificados
São semelhante aos cluster de hash que utilizam uma função de hash para encontrar uma linha. Entretanto,
cluster de hash classificados permitem que linhas na tabela sejam armazenadas por uma ou mais colunas da
tabela em ordem crescente. Assim, dados de uma aplicação que são processados usando o processamento
FIFO (first in first out) se benificiam deste tipo de tabela. A criação do cluster de hash classificado é
semelhante ao anterior, mas usa-se o parametro SORT em um dos atributos da tabela para ordenar a tabela
segundo esse atributo.
5. Tabelas Particionadas
Particionar uma tabela ou índice justfica-se qdo temos uma tabela ou índice grandes, e dividir em espaços
menores torna esses elementos mais gerenciáveis. Uma tabela pode ser particionada em partes menores e
essas partes também podem ser particionadas. Do ponto de vista da aplição isso é transparente, não
requerent nenhuma consulta especial para acessar os dados. O único efeito é que consultas com a cláusula
where são executadas mais rápido.
As tabelas particiionadas podem ser de três tipos: particionadas por intervalo, particionadas por hash, ou
particionadas por lista. Cada linha em um tabela particionada pode exister somente em uma partição. A
particições onde serão armazenadas as linhas são determinadas pela chave de partição que pode ser uma
chve comporta de até 16 colunas na tabela.
Partição por Interalo
Uma partição por intervalo é uma partição cuja chave de partição cai dentro de um certo intervalo. Por
exemplo, as vendas de um site podem ser particionadas pela data das vendas e as partições divididas em
trimestres. Assim, uma venda pode pertencer a primeira partição, denotando o primeiro trimestre
(FY2010Q1), ou seja, dependendo do valor da data (que é a chave de partição) a linha será armazena em
uma das quatro partições (4 trimestres tem um ano ehhehe).
Partição por Lista
Partição por lista é uma partição cuja a chave cai dentro de grupos de valores distintos, por exemplo pode-
se ter uma partição para cada estado atendido por uma loja virtual. Uma compra para o Rio Grande do Sul
estaria na partição 'RS', para São Paulo em 'SP' e assim por diante.
Partição por Hash
É um tipo de particionamento que a linha vai para uma partição de acordo uma função de hashing
especificando a coluna ou colunas utilizadas na função de hashing, mas sem atribuir explicitamente a
partição, somente especificando quantas partições estarão disponíveis. O oracle se encarrega de colocar as
linhas da tabela na partição correta e assegurar uma distribuição uniforme de linhas nas partições
disponíveis.
Partições compostas
As partições podem também serem particionadas. Podes-se particionar um partição em lista em partições
por hash, por exemplo.
Índices Particionados
Os indices em uma tabela podem ser particionados de formar a corresponder o esquema de partição das
tabelas as quais eles indexam. Índices particionados locais apresentam a vantagem de um aumento de
disponibilidade do índice qdo ocorrem operações de partição, por exemplo arquivar e descartar a partição
FY2002Q1 e seu indice local não afetará a disponibilidade de índice para as outras partições da tabela
6. Restrições
Restrição é uma regra que podem ser definidas em uma ou mais colunas dentro de uma tabela para
implementar uma regra de negócio. O oracle possui seis tipos de restrições:
Regra do nulo: a restrição NOT NULL evita que NULL sejam inseridos numa coluna. NULL não é igual nada
nem a outro NULL por que o valor NULL não existe.
valores únicos de coluna: a restrição UNIQUE assegura que uma coluna ou grupo de colunas sejam unica
por toda a tabela. Por exemplo, em uma tabela USUÁRIO, a coluna CPF não pode ser repetido em mais de
uma linha da tabela, o cpf é único por usuário. A restrição UNIQUE pode vir acompanha da restrição NOT
NULL.
valores de chave primária: é o tipo de restrição mais comum de restrição e no máximo uma vez pode ser
aplicada uma única vez em um tabela. A coluna ou colunas que compõe a a chave primária não podem ser
NULL. Um índice único é criado para impor essa restrição; se um índice único utilizável existir para a coluna
a restrição da chave primária utilizará esse índice.
valores de integridade referencial: a restrição FOREIGN KEY é um tipo de restrição mais complexa que
as demais, visto que ela conta uma tabela para restringir os valores que podem ser inseridos na coluna com
a restrição de integridade referencial. Se uma tabela A tem uma FOREIGN KEY de uma uma tabela B, os
valores exitentes em na tabela A devem ter os correspondentes na tabela B.
integridade in-line complexa: tipo de restrição que pode ser imposta a uma coluna através da palavra
reservada CHECK, por exemplo uma coluna não pode ter o valor acima de 99. Múltiplas instruções CHECK
podem ser adicionadas em uma colunas e a restrição em si pode tomar outras colunas da linha que está
sendo inserida ou atualizada como argumentos. A linha somente é inserida no banco de dados se os CHECK
retornarem TRUE.
integridade baseada em trigger: tipo de restrição destinada para implementar regras de negócios mais
complexas que as restrições anteriores não conseguem tratar. É criada através do comando create trigger
seguido em um corpo em PL/SQL que são os comandos a serem executados pelo trigger qdo ocorre uma
determinada operação no banco de dados. Muito útil para operações de auditoria que armazenam as datas e
horário de alterações executadas em tabelas por exemplo.
Toda as restrições dão definidas qdo a tabela é criada ou qdo a tabela é alterada em nível de coluna, exceto
para triggers que são definidos na operação DML que está sendo realizada na tabela.
Índices
Como dito anteriormente, índices são utilizados para melhorar a performance de consultas no banco de
dados. Um índice armazena o valor da coluna ou colunas que estão sendo indexadas juntamente como o
endereço físico da linha que contém o valor indexado. Ao encontrar uma correspondência no índice o ID da
linha aponta para o bloco dentro do arquivo e qual linha dentro do bloco. Eles são criados sobre uma ou
mais colunas e armazenados eu uma estrutura de árvore B.
Existem vários tipos de índices que deve ser usados de acordo com o tipo de tabela e o tipo de acesso. No
oracle tems os seguinte tipos de índices
Índices únicos: frequentemente utilizado para impor a restrição de chave primária. Índices únicos
asseguram que valores duplicados não existirão na coluna ou colunas que estão sendo indexadas.
Índices não-únicos: ajuda a acelerar o acesso a uma tabela sem impor unicidade. Podemos criar um
índice para uma coluna LAST_NAME por exemplo e certamente obteriamos várias linhas pelo uso desse
índice.
7. Índice de chave reversa: é um tipo especial de índice amplamente utilizado em ambiente de
processamento de transações on-line OLTP. Nesse tipo de índice todos os bytes de uma coluna são
invertidos.
Um índice reverso, comparado a um índice convencional, inverte os bytes da chave a ser indexada. Ele é
particularmente interessante no caso de uma coluna de tabela conter valores de texto que comumente
apresentam um longo prefixo.
Por exemplo, em uma tabela destinada a armazenar Ordens de Serviço, a coluna chave pode possuir uma
forma padronizada com 12 caracteres. O primeiro documento do ano 2008 é indicado com “OS-200800001”,
o segundo com “OS-200800002”, e assim por diante. Até a tabela atingir alguns milhões de registros, os
primeiros sete caracteres serão redundantes e não trarão muita contribuição às buscas indexadas. Um índice
reverso armazenaria estes códigos na ordem inversa, isto é, como “100008002-SO”, “200008002-SO”,
“300008002-SO”, e assim por diante. Com isso, ele permite que o último caractere da chave, mais altamente
variável, espalhe os valores entre as estruturas de dados do índice. Tal procedimento aumenta
consideravelmente o desempenho no momento da busca.
Índices baseados em função: é semelhante a um índice B-Tree padrão exceto que para armazena-se no
índice, uma expressão no lugas da coluna ou colunas das tabelas. Um exemplo de utilidade desse tipo é
índice é a criação de um índice para o endereço ou sobrenome de alguém que pode ser gravado com banco
de dados em minúsculo ou maiúsculo, onde o indice terá uma expressão que transforma todos os nomes em
maiúsculo:
create index up_name on employee(upper(last_name))
Índice de mapa de bits: armazena uma string de bits para cada valor possível da coluna que está sendo
indexada. O comprimentos dos bits é igual ao número de linhas na tabela que está sendo indexada. Esse
índice tem como vantagens a economia de espaço e o tempo de resposta por que permite ao Oracle
remover rapidamente potenciais linhas de uma consulta que contém múltiplos where bem antes da propria
tabela precisar ser acessada. Ele é mais eficiente qdo utilizado em colundas com baixa cardinalidade.
Visões
Visões permitem que os usuários vejam uma apresentação personalizada dos dados. Uma visão tb é
conhecida como um consulta armazenada – os detalhes da consulta adjacente são ocultadas do usuário.
Através de visões podemos exibir dados conforme as autorizações/permissões do usuário, por exemplo, um
empregado pode ser dados dos colegas menos seus salários, enquanto que o supervisor pode ver inclusive o
salário. As visões tb podem ser usadas para impor segurança, por negar acesso de escrita de dados para
determinos usuário que não necessitam de tal permissão.
Uma visão regular não armazena dados, somente sua definição no dicionário de dados, e uma consulta
sujbacente (tb armazenada no banco de dados) sempre é executada qdo esta é acessada.
A visão materializada é um tipo de visão que armazena os resultados de sua consulta adjacente junto
com a definição da visão com o intuito de acelerar as consultas. Ela é semelhante a visão regular, pois sua
definição também fica no dicionário de dados, entretanto, ela ocupa espaço no segmento de dados
mantendo os dados resultantes da consulta de base. A visão materializada pode ser usada para replicar uma
cópia de leitura da tabela para um outro banco de dados. Para manter a visão atualizada o oracle usa um
arquivo de log denominada log de visão materializada utilizado para atualizações incrementais da visão
quando a tabela de base é alterada evitando que se faça uma atualização completa da visão por conta de
todas as atuzalições feitas na tabela. Em um ambiente de dataware house, a visão materializada pode
armazenar dados agregados em um group by rollup ou group by cube.
O terceiro tipo visão é a visão de objeto, criado para facilitar a implementação de banco de dados
orientados a objetos. Mas como muitas empresas ainda possuem sistemas legados baseados em banco de
dados relacionais, elas não dispões de recursos ou mesmo tempo para um migração total para um banco de
8. dados orientado a objetos. Para resolver este problema o Oracle permite criar uma visão de objeto de forma
que facilite essa transição de relacional para objeto permitindo que as aplicações vejam os dados como
objetos que possuem atributos e métodos, enquanto que os sistemas legados podem executar trabalhos em
lote na tabela INVENTORY. As visões de objetos permitem simulas tipos abstratos de dados, identificadores
de objetos – OID – e referências que um ambiente puramente OO de banco de dados ofereceria.
Usuários e Esquemas
O acesso ao banco de dados é feito por meio de usuários cadastrados, sendo sua autenticação feita pelo
banco de dados em si, pelo sistema operacional ou pela rede (baseada em PKI – Public Key Infrastructure).
Um usuário também pode possuir um esquema determinando se ele possui algum objeto no banco de dados
como tabelas, índices, visões, etc. Um usuário pode conceder acesso aos seus objetos a outros usuário,
limitado ao seu esquema, ou seja, só concede permissões aos objetos que possui.
Perfis
Como os recursos do banco de dados não são infinitos o DBA deve gerenciar a alocação de tais recursos, por
meio de perfis que armazenam o quanto de recursos poderão ser usados (CPU, sessões concorrentes, etc)
pelos usuários pertencentes ao perfil.
Sequencias
Número de 38 bits de comprimento gerados automaticamente pelo Oracle e são únicos, mas não
necessariamente sequenciais. Se uma sequencia se perder por que qualquer motivo e não for usada, outros
números subsequentes serão gerados.
Sinônimos
É simplesmente um alias para algum objeto do banco de dados (tabela, visões, índices, procedures, etc). O
sinônimo não aloca espaço no banco de dados além de sua definição no dicionário de dados. Um sinônimo
pode ser publico ou privado e, se for privado ele será definido no esquema do usuário, caso contrario ficará
disponível para todos.
PL/SQL
Linguagem procedura do oracle para implementar extensões à DML quando esta não conseguir produzir
resultados de maneira fácil.
Procedures/Funções
São blocos identificador de PL/SQL. Possuem três partes:
1. seção de declaração de variaveis
2. seção de executável
3. seção de tratamento de exceções
A diferença em entre procedures e funções é que uma função retornará um valor único para o programa
chamador enquanto que procedures apenas retornam um código de status. As procedures são compiladas e
armazenada s no dicionário de dados uma vez e, quando mais de um usuário precisar chamar a procedure
haverá uma cópia da mesma no pool compartilhado. Além disso, uma procedure reduz o consume de banda
de rede do que várias instrução select e insert sendo executas em sequencia.
Pacotes
Pacotes PL/SQL agregam várias funções e procedimentos relacionados, compostos de duas partes:
9. 1. especificação de pacote: onde são expostos os métodos e atributos
2. corpo do pacote: implementação dos métodos expostos na especificação de pacote.
Os pacotes permitem que os objetos que referem a eles não precisam ser recompilados no caso de alguma
mudança no pacote, ao contrário do que ocorre com procedures e funções independentes.
Triggers
É um tipo especial de bloco PL/SQL ou Java executado qdo um evento especificado acontece, como
instruções DML em uma tabela ou visão, instruções DDL e mesmo eventos de banco de dados como start e
stop do banco. Os trigger são muito úteis para ambiente distribuídos para simular um relacionamento de
chave estrangeira entre tabelas residindo em banco de dados separados bem como, implementar regras de
integridade complexas impossíveis de implementar com as restrições padrão oferecidas pelo oracle.
Estruturas de Armazenamento Físico do Oracle
O banco de dados Oracle utiliza algumas estruturas de armazenamento físico no disco para conter e
gerencias os dados a partir de transações dos usuários.
Alguns arquivos contém dados reais dos usuários: arquivos de dados, arquivos de log de redo, arquivos de
log de redo em repositório de arquivos. Outros arquivos mantém outras informações como os arquivos de
controle que guardam o estados dos objetos do banco de dados(tabelas, índices, visões, etc), arquivos de
rastreamento e alerta, os quais armazenam informações de registro em log tanto para evento de rotina
como para condições de erro que possam ocorrer no banco de dados. Abaixo temos a relação entre as
estruturas físicas de armazenamento e a estruturas lógicas de armazenamento do Oracle.
Arquivos de dados: cada banco de dados deve conter pelo menos um arquivo de dados. Um arquivo de
dados no oracle corresponde a um arquivo físico do sistema de arquivos do sistema operacional. Cada
arquivo é membro de somente um único espaço de tabelas. Tal arquivo pode ser expandido caso o DBA
ache que isso seja necessário.
10. Arquivos de Log de redo: sempre que dados são alterados nos banco de dados, tabela, indices, visões,
etc, uma entrada no arquivo de log de redo é criada. Cada banco de dados possui pelo menos 2 que são
preenchidos de maneira circular, ou seja, qdo um está totalmente preenchido o outro começa a ser utilizado
como log. O arquivo de log de redo tem sua utilizadade no caso da instancia oracle falhar ou cair por
qualquer motivo, pois ao ser reiniciado esse arquivo é utilizado para reestabelecer o estado do banco de
dados antes da fallha numa operação denominada roll forward. Cabe ressaltar que multiplas cópias de um
arquivo de log pode existir em discos físicos diferentes para assegurar alta disponibilidade e integridade dos
dados, e ainda, esses arquivos podem ser multiplexados como o mesmo objetivo.
Arquivos de Controle: cada banco de dados possui pelo meno um arquivo de controle, pois este
armazena os metadados do banco de dados, ou seja, os dados sobre a estrutura física do próprio banco.
Contém o nome do banco de dados, qdo ele foi criado, os nomes e as localizações de todos os arquivos de
dados e arquivos de log de redo. Qualquer alteração feita no banco de dados é imediatamente refletia nesse
arquivo. Como ele é crucial para a integridade do banco de dados, ele costuma ser multiplexado, ou seja, o
oracle mantém várias cópias dele em diferentes partes do disco elegendo um como primário. Além disso, o
Oracle permite fazer backup do arquivo para o caso de alguma catastrofe acontecer, ser possível de recriar o
arquivo de controle.
alter database backup controlfile to trace
Arquivos de log em repositório: o oracle pode operar em dois modos archivelog e noarchivelog. No
modo noarchivelog, o arquivo de log de redo é escrito de maneira circular como dito ateriormente. Se uma
instância falhar, as transações serão reiniciadas no próximo restart e o arquivo de log será usado para
executar as transações que não conseguiram terminar. Mas, se o disco falhar as informações serão perdidas.
Entretanto, se o oracle estiver funcioando em archivelog, os arquivos de log, qdo totalmente preenchidos,
serão guardados em algum destino ou múltiplos destinos e, em caso de falha no disco, eles podem ser
resgatados do backup e utilizados para reconstruir o estado do banco de dados no momento da falha. Este
recurso é crítico para ambientes de alta disponibilidade do oracle conhecido de data guard.
Arquivos de log de alerta: arquivos usados para armazenar mensagem de alerta ou no caso de sessões
de usuário em background, como trace logs.
Além dos aquivos mencionados, existem os aquivos de backup, arquivos de senha, de inicalização
Multiplexação de arquivos: multiplexar os arquivos de log minimiza o risco de perda de dados devidos a
falhas em disco físico, podendo ser automatizada utilizando-se uma instância oracle chamada ASM –
Automatic Storage Management. Além disso, pode-se fazer a multiplexação de forma manual, sem uma
solução ASM ou RAID, por meio de alguns parâmetros de inicialização da instância oracle.
11. Estruturas de Memória Oracle
O Oracle utiliza a memória física do servidor para armazenar várias coisas para uma instância oracle:o
próprio código executaável oracle, informações de sessão, processos associados com o banco de dados e
compartilhamento de informações entre processos, tais como bloqueio em objetos de banco de dados. As
estruturas de memórias possuem, também instruções SQL de usuário e que serão armazenadas em disco,
como blocos de dados em segmentos de banco de dados e informações sobre transações completadas no
banco de dados. A área de memória alocada pelo oracle se chama SGA – System Global Area.
Existe també a chamada PGA – Program Global Area – que é privada para cada servidor e processo em
background; um PGA é alocado a cada processo.
SGA: é um grupo de estruturas de memória compartilhadas para uma instância oracle, compartilhada pelos
usuários da instância do banco de dados. Qdo a instância é iniciada a memória é alocada para a SGA
baseada nos valores especificados no arquivo de inicalização ou diretamento no software oracle.
Cache de Buffer: o cache de buffer de banco de dados contem os blocos de dados em disco recém-lidos
para devido a uma instrução select, ou que contém dados alterados ou adicionados via uma instrução DML.
Pool compartilhado: o pool compatilhado possui dois subcaches: o cache de biblioteca e o cache de
dicionário de dados. O cache de biblioteca contém informações sobre instruções SQL e PL/SQL executadas
no banco de dados que podem ser compartilhadas entre os usuário dos banco de dados, visto que
potencialmente eles podem acessar os mesmos dados e executar as mesmas consultas. Já o cache de
dicionário de dados é uma coleção de tabelas de banco de dados, que pertencem aos esquemas SYS e
SYSTEM que contêm os metadados do banco de dados, suas estruturas, e os privilégios e papéis dos
usuários do banco de dados. Além disso, esse cache contém blocos armazenando o dicionário de dados que
são utilizados para ajudar no processamento de instruções DML.
Buffer de log de redo: contém as alterações mais recentes para os blocos de dados nos arquivos de
dados. Qdo 1/3 do buffer de log estiver cheio ou a cada 3 segundos os registros de log de redo são
12. gravados no arquivos de log. Uma transação não é considerada completada se as entradas de log não
tenham sido gravadas completadamente nos arquivos de log de redo.
Large Pool: é uma área opcional da SGA, utilizada para transações que interagem com mais de um banco
de dados, buffers de mensagem para processos que realizam consultas paralelas e operações de restauração
e backup paralelo (RMAN)
Java Pool: utilizado pela JVM Oracle para todos os códigos e dados java dentro de um sessão de usuário.
Streams Pool: contém estruturas dados e de controle que suportam o recurso Oracle Streams, que
geerencia o compartilhamento de dados e eventos em ambiente distribuído.
Program Global Area: memória alocada e privada para um processo, que depende da configuração de
conexão de bando de dados, que pode ser conexão compartilhada ou conexão privada. Se for compartilhada
vários usuários usuaram a mesma conexão para o banco de dados, melhorando o uso de memória mas
diminuindo o tempo de resposta. Já a conexão privada é o contrário, sendo recomendado o uso e
ambientes dedicados.
Área de código de Software: armazenam os arquivos executáveis oracle que estão em execução por
parte da instância. São áreas estáticas de somente leitura e modificadas apenas por uma nova distribuição
de software. De acordo com os parêmtros de inicialização, esses arquivos podem ser compartilhados entre
vários usuário ou não, claro que isso reflete no uso de memória do servidor.
Processos em segundo plano
Quando uma instância oracle é iniciada, múltiplos processos em background também são iniciados. Um
processo em background é um código rodando em background projetado para um tarefa específica,
conforme listado abaixo e mostrado na figura.
13. SMON: System monitor: no caso de queda do sistema é responsável por ler os arquivos de log de redo
aplicando as entradas lidas no banco de dados para restaurar o banco de dados no momento da falha
ocorrida.
PMON: Process Monitor: se uma conexão do usuário for descartada por qualquer motivo ele realiza o
trabalho de faxina:
• reverte a transação que estava em progresso no caso de ter havido falha
• marca blocos da transação como disponíveis no cache de buffer
• remove os locks sobre as linhas afetadas na tabela
• remo o ID do processo que foi desconectado da lista de processos ativos
DBWn: Database Write, grava os blocos de dados novos ou alterados na cache de buffer de nos arquivos de
dados, utilizando um algoritmo de LRU. Até 20 processos DBWn podem ser iniciados.
LGWr: log writer: responsável pelo gerenciamento do buffer de log de redo. É um dos processos mais ativos
em uma instância que tem atividade DML intensa. Uma transação não é considerada bem sucedida se o
LGWr não escrever todas as entradas do buffer de log no aquivo de log de redo, incluindo o registro de
confirmação. Inclusive, os buffers sujos no cache de buffers não podem ser gravados nos arquivos de dados
pelo DBWn até que o LGWr tenha gravado as informações de redo.
ARCn: Archive process: se o banco de dados estivem em modo ARCHIVELOG, então este processo
armazena os logs de redo em um ou mais destinos (diretórios, dispositivos ou endereços de rede) sempre
que um arquivo de redo esteja totalmente preenchido e um novo acabou de começar a ser usado.
CKPT: checkpoint process: processo de ponto de verificação que ajuda a diminuir a quantidade de tempo
necessária para recuperção de instância.
RECO: Recovery process: trata falhas de transações distribuídas. Se uma tabela A no banco de dados AA for
alterada juntamente com uma tabela B no banco BB e ocorrer uma falha de conexão antes de BB ser
atualizado o RECO reverterá a transação.