Escolar Documentos
Profissional Documentos
Cultura Documentos
________________________________________
Visão Geral
Processos em
Background Os
processos em
background executam
tarefas distintas
assincronicamente em
benefício a todos os
usuários de um banco de
dados. Não existe uma
relação direta entre os
processos em
background e os
processos dos usuários
conectados a uma
instância ORACLE.
Apesar de poderem
existir outros em uma
instância, o que depende
da configuração do
ORACLE utilizada, os
processos mais
conhecidos são o PMON,
SMON, DBWR, LGWR,
RECO, LCK, CKPT e o
ARCH.
________________________________________
Estruturas de Memória
SGA e PGA.
Processos.
O processo log writer (LGWR) escreve todas as entradas de redo log para o
disco. Os dados de redo log são armazenados em memória no redo log buffer
cache, na SGA. No momento em que uma transação for efetivada com o
comando COMMIT e o redo log buffer estiver preenchido, o LGWR escreve as
entradas de redo log nos arquivos redo log apropriados.
O processo archiver (ARCH) copia os arquivos redo log para fita ou mesmo
outro disco, no momento em que um deles torna-se completo. Esse processo
geralmente está presente quando o banco de dados está sendo utilizado no
modo ARCHIVELOG. Os arquivos redo log nada têm a ver com auditoria. Eles
são usados somente para a recuperação de um banco de dados.
Por sua vez, os processos lock (LCKn) são usados para controlar o lock entre
instâncias em uma configuração Parallel Server.
Program interface.
________________________________________
Conhecendo os processos e estruturas de memória, fica bastante fácil para
que entendamos o modo como ORACLE trabalha:
________________________________________
Antes que os dados possam ser acessados, um processo servidor criado para
um determinado usuário conectado ao ORACLE traz os blocos dos arquivos
fisicamente armazenados nos discos para dentro do database buffer cache.
Cada comando SQL é armazenado na estrutura de memória shared pool e são
compartilhados entre todos os usuários conectados a uma instância. Em certo
momento, os blocos de dados modificados pelos comandos dos usuários que
se encontram no database buffer cache são escritos novamente para os
arquivos de dados. Isso é feito pelo processo em background DBWR.
Usamos dois termos para referenciarmos ao acesso aos dados: cache miss e
cache hit. O termo cache miss é usado para identificar as vezes que um
processo experimenta acessar uma informação e o bloco que a contém precisa
ser lido do disco. O termo cache hit é usado para identificar as vezes que um
processo encontra uma informação na memória. Assim, um acesso através de
um cache hit é mais rápido do que através de um cache miss.
Essa é a forma básica em que se processa o acesso aos dados, usando como
exemplo um comando SQL para a atualização de informações em uma tabela:
Por sua vez os buffers identificados como data dictionary cache contêm:
Ele é organizado em duas listas: a dirty list e a least recently used list (LRU). A
dirty list é uma lista que contém os blocos alterados que ainda não foram
escritos em disco.
A LRU é uma lista que contém blocos do ORACLE que foram alterados pelos
comandos dos usuários mas ainda não foram gravados em disco. Contém
ainda blocos livres e blocos em uso.
Para uma operação que envolve o comando SELECT é preciso que os blocos
de dados que contêm as linhas a serem retornadas, de acordo com o critério
de pesquisa, estejam em memória, no database buffer cache.
Nenhuma tabela ocupa menos de dois blocos de dados. Portanto, quando uma
certa informação armazenada em uma tabela é requerida na memória, pelo
menos dois blocos de dados são necessários: um bloco de cabeçalho e outro
bloco com os dados.
Segmentos de rollback.
Cada transação deve ser assinalada a um segmento de rollback. Isso pode ser
feito automaticamente baseado em alguns critérios que o ORACLE possui,
como pode ser feito manualmente pelos usuários através do comando:
Onde:
Consistência de leitura.
A partir deste momento, quaisquer alterações feitas em uma tabela por outros
usuários não são enxergadas pelo usuário que emitiu o comando SELECT, até
que os outros usuários que atualizaram a tabela terminem suas transações,
com os comandos COMMIT ou ROLLBACK.
Processo DBWR.
________________________________________
Configuração multi-threaded
Esse processo
servidor é criado
quando ocorre a
conexão de um
usuário com o
ORACLE.
Multi-Threaded
Server A
configuração
Multi-Threaded
Server do
ORACLE permite
que diversos
processos de
usuários
conectados a uma
instância possam
compartilhar um
conjunto de
processos
servidores
disponíveis.
Esses processos
servidores são
fornecidos pelo
ORACLE quando
o usuário requisita
um comando.
Combined
User/Server
Process Nesta
configuração os
códigos de uma
aplicação e do
ORACLE são
combinados em
uma única tarefa.
Essa configuração
é disponível em
alguns sistemas
operacionais,
como o VMS.
A arquitetura multi-threaded.
A segunda fase é caracterizada pela emissão dos comandos SQL por parte
dos usuários. Quando um deles emite qualquer comando, essa requisição é
recebida pelo processo despachante ao qual o usuário está conectado. Por sua
vez, o despachante coloca a requisição em uma fila de requisições, ou fila de
entrada, que se encontra na SGA. O primeiro processo servidor compartilhado
que estiver disponível obtém a requisição na fila de entrada e o processa. Ao
término do processamento, o processo servidor coloca a resposta em uma fila
de respostas, única para o despachante ao qual o usuário estiver conectado.
Finalmente, esse despachante retorna a resposta ao usuário original.
A fila de entrada, que recebe todas as requisições dos usuários, é única na
instância e é compartilhada por todos os despachantes. Essa fila é do tipo
FIFO, ou seja, primeiro-que-entra-primeiro-que-sai (first-in-first-out). As filas de
respostas são usadas para conter todas as respostas dos comandos SQL
executados pelos processos servidores compartilhados. Cada um dos
despachantes possui a sua própria fila de respostas.
################
# Exemplo do arquivo listener.ora
################
LISTENER =
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL=TCP)
(HOST=192.1.1.10)
(PORT=1525)
)
)
STARTUP_WAIT_TIME_LISTENER=0
CONNECT_TIMEOUT_LISTENER=10
LOG_FILE_LISTENER=listener.log
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=sid1)
(ORACLE_HOME=/usr/oracle)
)
)
TRACE_LEVEL_LISTENER=0
Para criarmos o processo, usamos o utilitário LSNRCTL:
$ lsnrctl start
###################
# Exemplo do arquivo tnsnames.ora
###################
sid1mts =
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=
(PROTOCOL=TCP)
(HOST=192.1.1.10)
(PORT=1525)
)
)
(CONNECT_DATA=
(SID=sid1)
)
)
sid1dedic =
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=
(PROTOCOL=TCP)
(HOST=192.1.1.10)
(PORT=1525)
)
)
(CONNECT_DATA=
(SID=sid1)
(SERVER=DEDICATED)
)
)
MTS_DISPATCHERS="tcp,3", "ipc,2"
MTS_MAX_DISPATCHERS=10
MTS_SERVERS=4
MTS_MAX_SERVERS=14
MTS_SERVICE=sid1
MTS_LISTENER_ADDRESS="(ADDRESS=(PROTOCOL=
TCP)(HOST=gp.com)(PORT=1525))"
________________________________________
O redo log buffer cache é uma estrutura de memória de uso circular que
contém buffers ou conjuntos de blocos ORACLE com informações sobre todas
as alterações feitas nos dados de um banco de dados. Essas informações são
armazenadas sob a forma de entradas de redo log e são usadas para
recosntruir as informações dos segmentos alterados, inclusive os segmentos
de rollback.
Como vimos, todas as alterações feitas nos dados são armazenadas como
entradas de redo na estrutura redo log buffer cache.
Processo LGWR.
4. Ocorre o time-out.
Em uma instância existe somente um único grupo de arquivos redo log sendo
utilizado para a escrita das entradas de redo log, da memória para o disco,
simultaneamente, assim como somente um processo LGWR ativo. Enquanto
uma transação não for registrada em um arquivo redo log o COMMIT emitido
não é confirmado. Uma transação pode fazer com que outras transações sejam
também gravadas nos arquivos redo log (piggy-backed, brincadeira conhecida
entre nós como cavalinho), quando são efetivadas simultaneamente.
Quando um grupo for preenchido, ocorre o log switch, ou seja, o próximo grupo
disponível passa a ser utilizado. Caso o banco opere no modo ARCHIVELOG,
podemos usar os parâmetros LOG_ARCHIVE_BUFFER_SIZE e
LOG_ARCHIVE_BUFFERS para melhorarmos a gravação dos mesmos para
outro dipositivo.
O comando COMMIT efetiva as alterações feitas nos dados por uma transação,
tornando-as permanentes.
Fonte: http://www.oocities.com/gsaudino/html/70f100-1.html