Administrando dados de UNDO

Propaganda
Pedro F. Carvalho
Analista de Sistemas
[email protected]
www.pedrofcarvlho.com.br
CAPITULO 10 – ADMINISTRANDO DADOS DE UNDO
User
Visão Geral
- Sempre que um dado é alterado, o Oracle armazena num segmento de undo (ou
rollback) a imagem antiga deste dado.
- Os segmentos de Undo são utilizados para rollback de transações, consultas
consistentes e operações de flashback.
- As alterações em dados de usuários (DML) utilizam-se dos segmentos de undo
normais.
- As alterações em estruturas (DDL) utlizam o segmento de rollback existente na
tablespace SYSTEM.
- Se o gerenciamento automático de Undo (UNDO_MANAGEMENT=AUTO) estiver
sendo usado, o Oracle cria e gerencia os segmentos de undo automaticamente.
- Se o gerenciamento for manual, os segmentos precisam ser criados e gerenciados
pelo DBA (comandos CREATE ROLLBACK SEGMENT).
- Um segmento de Undo pode ser compartilhado por várias transações ao mesmo
tempo.
- Uma transação estará sempre restrita a um único segmento de undo.
- O cabeçalho de um segmento de Undo contém informações sobre as transações
ativas naquele segmento.
#Utilidades dos Segmentos de Undo#
*Rollback de Transação
- Quando uma sessão executa um ROLLBACK, o Oracle regrava todas as imagens de
dados alterados pela transação e salvas no segmento de undo de volta para seus locais
originais.
- Se uma sessão termina de maneira anormal, o Oracle faz o ROLLBACK
automaticamente.
- Se a instância falhar enquanto transações estão em curso, os dados dos segmentos
de Undo também serão usadas na recuperação da instância, para efetuar o ROLLBACK
destas transações.
*Flashback
- A partir do Oracle 9i foram introduzidos recursos para consultas de dados como eram
no passado (por exemplo, para ver os dados de uma tabela como eram há uma hora
atrás). Este tipo de consulta é chamado de Flashback Query.
*Consistência de Leitura
- Se uma sessão consulta um dado que está sendo alterado por uma transação ativa
Pedro F. Carvalho
Analista de Sistemas
[email protected]
www.pedrofcarvlho.com.br
(não submetida a COMMIT), o Oracle utiliza os dados do segmento de undo para
mostrar o valor anterior à alteração.
Uma consulta sempre verá todos os dados de seu resultado consistentemente ao
momento inicial da leitura.
- Se isto não for possível (por falta de espaço suficiente de Undo por exemplo), a
consulta recebe uma mensagem de erro.
#Parâmetros de Inicialização relacionados com Undo#
*UNDO_MANAGEMENT
- Determina se o gerenciamento de undo será automático ou manual.
AUTO: utiliza tablespace de undo, com segmentos de undo gerenciados pelo Oracle.
MANUAL: utiliza segmentos de rollback criados pelo DBA numa tablespace comum.
*UNDO_TABLESPACE
- Nome da tablespace de undo ativa no banco de dados.
*UNDO_RETENTION
- Tempo de retenção de dados nos segmentos de Undo após o término da transação.
Auxilia em leituras consistentes e consultas flashback.
*UNDO_SUPPRESS_ERROS
- Se este parâmetro for FALSE e o gerenciamento de undo for automático, os
comandos de gerenciamento de segmentos de rollback manual receberão erros.
Para evitar estes erros, define-se este parâmetro como TRUE. (Obsoleto no Oracle
10g).
#Retenção dos dados de Undo#
*Definição
- Os dados de Undo devem obrigatoriamente ser mantidos até o final da transação. Ao
final de uma transação, seus dados em Undo podem ser liberados. Se estes dados
estiverem sendo usados por leitura consistentes ou flashback, e forem apagados por
outra transação que precisou de espaço, a consulta recebe erro.
- Para minimizar esta possibilidade, foi introduzido o parâmetro UNDO_RETENTION
na versão 9i.
- Com o UNDO_RETENTION, é possível determinar o tempo (em segundos) após o
final da transação que o Oracle tentará manter os dados em Undo.
*Valores
- No Oracle 9i, se UNDO_RETENTION=0, o recurso está desligado.
- No Oracle 10g, o Oracle gerencia automaticamente o UNDO_RETENTION, tentando
manter os dados o máximo de tempo possível em Undo.
- Se a tablespace de Undo for autoextensível, UNDO_RETENTION indica a retenção
mínima.
- Se a tablespace de Undo for de tamanho fixo, UNDO_RETENTION só será considerado
pelo Oracle se houver retenção garantida.
*Garantia de Retenção
- No Oracle 9i, o UNDO_RETENTION só será respeitado se houver espaço suficiente na
tablespace de Undo.
Pedro F. Carvalho
Analista de Sistemas
[email protected]
www.pedrofcarvlho.com.br
- Uma transação procura espaço em Undo livre ou com dados já expirados.
- Se não encontrar, pode “roubar” o espaço mesmo que o tempo de retenção não
tenha terminado.
- No Oracle 10g, é possível determinar a garantia de retenção:
Retenção Sem Garantia: padrão, funcionamento igual ao Oracle 9i.
Retenção Garantida: se a transação não encontrar espaço com dados já expirados, ela
recebe erro.
- A garantia de retenção é definida pelos seguintes comandos:
CREATE TABLESPACE nome [RETENTION GUARANTEE|NOGUARANTEE];
ALTER TABLESPACE nome [RETENTION GUARANTEE|NOGUARANTEE];
ALTER TABLESPACE UNDOTBS1 RETENTION GUARANTEE;
#Informações Sobre Segmentos de Undo/Rollback#
- Para obter informações sobre todos os segmentos de rollback no banco de dados,
consulte a view DBA_ROLLBACK_SEGS.
#Problemas mais Comuns com Undo#
*Espaço Insuficiente Para Transações
- A transação recebe erro por não haver espaço suficiente no segmento de undo.
*Causas Possíveis
- Se o gerenciamento for automático, a tablespace de Undo pode não ser grande o
suficiente, ou ainda podem existir sessões consumindo muito espaço de undo
anormalmente. Verifique as transações
consumindo muito undo e considere aumentar a tablespace.
- Se o gerenciamento for manual, além das causa acima ainda é possível que os
segmentos de rollback criados sejam pequenos demais ou não estejam sendo limpos
de maneira adequada. Verifique as configurações de segmentos de rollback
(quantidades e tamanhos), e considere utilizar o gerenciamento automático.
*Erro de Consistência na Leitura
- Uma consulta recebe erro “snapshot too old” (ORA-01555) porque estava
consultando dados em segmentos de undo (leitura consistente), e estes dados foram
apagados por uma transação que precisou de espaço.
*Causas Possíveis
- Segmentos de undo/rollback muito pequenos. Aumente os segmentos.
- Consultas muito longas. Ajuste as consultas.
- Verifique a possibilidade de ajustar o UNDO_RETENTION e RETENTION
GUARANTEE.
Exercícios complementar :
Examine as configurações de UNDO se seu banco de dados
Pedro F. Carvalho
Analista de Sistemas
[email protected]
www.pedrofcarvlho.com.br
1 – Determine se seu banco de dados esta usando segmentos de undo.
SQL> SELECT VALUE FROM V$PARAMETER WHERE NAME=’UNDO_MANAGEMENT’
2 – Determine quais tablespaces de undo foram criados e qual deles esta sendo usado
SQL>select tablespace_name from dba_tablespaces where contents=’UNDO’;
SQL> select value from v$parameter where name = ‘undo_tablespace’
3 – Determine quais segmentos de undo estão em uso no banco e quais são seus
tamanhos
SQL> select tablespace_name, segment_name, segment_id, status from
dba_rollback_segs;
SQL>select usn, resize, from v$rollstat
Download