[Oracle] SNAPSHOT TOO OLD – TABLESPACE UNDO

[Oracle] SNAPSHOT TOO OLD – TABLESPACE UNDO

Antes de conversamos sobre este erro que muito é nós apresentado, precisamos falar um pouco sobre o conceito da tablespace de undo. Eu sei que para muitas pessoas este assunto já e sabido, porem para os novos DBA´s pode ser mais uma fonte de conhecimento, e eu no fundo do coração espero que seja .

Conceito da Tablespace de UNDO

A tablespace de undo é usada para armazenar informações antigas dos blocos de dados que foram modificados, permitindo que as transações possam ser revertidas, caso necessário. Essas informações são conhecidas como imagens antes das alterações (ou undo records). Mesmo após o commit, esses registros de undo não são imediatamente liberados, pois podem ser necessários para outras transações ou para operações como o flashback query. O espaço na tablespace de undo é liberado gradualmente, à medida que o Oracle identifica que os registros de undo não são mais necessários.

Por este motivo, podemos nos deparar com um erro chamado SNAPSHOT TOO OLD. Esse erro basicamente indica que os blocos de undo estão sendo reutilizados antes que as transações que dependem deles tenham sido concluídas, e não há espaço suficiente na tablespace de UNDO para armazenar novas imagens. Como mencionado, o Oracle mantém essas imagens de undo por um determinado período, liberando o espaço aos poucos. Isso pode ocorrer especialmente após uma longa transação que consumiu grande parte do espaço de UNDO e, em seguida, o banco de dados é submetido a outro longo UPDATE. Se não houver espaço suficiente disponível no UNDO, podemos nos deparar com esse erro.

Existem algumas categorias que devemos saber, pois o oracle segue uma sequencia de liberação sendo o primeiro EXPIRED depois o UNEXPIRED e por último ACTIVE caso ele precise vitimizar os blocos.

ACTIVE – Está sendo utilizado

UNEXPIRED – Transações foram comitados porem nao ultrapassou o tempo de UNDO_RETENTION

EXPIRED – Transações já foram comitadas, e os blocos podem ser utilizados.

A query abaixo mostra o que foi explicado acima :

SELECT segment_name, status, tablespace_name, bytes/1024/1024 MB

FROM dba_undo_extents

WHERE tablespace_name = ‘nome_de_undo’

ORDER BY status;

Beleza ? Agora voce me pergunta tá e como eu resolvo isso ?
Galera o que eu posso falar e o que eu fiz, e naquele determinado tempo e condição deu certo.
Existem alguns parametros que podem ser utilizados. Coloquem alguns aqui abaixo pois estes parametros funcionaram para mim.

Enfim o que eu fiz ?

Alterei a UNDO_RETENTION para o tempo minimo e alterei a tablespace de UNDO para NOGUARANTEE.

*********************************************************************************** *ALTER TABLESPACE nome_da_undo_tablespace RETENTION NOGUARANTEE;                        *
***********************************************************************************

Segue abaixo a explicação destes parâmetros

UNDO NOGUARANTEE – Ele vai utilizar os blocos e nao vai respeitar a UNDO_RETENTION, pois ira precisar dos blocos.

UNDO RETENTION: Parametro que definie o tempo mínimo que Oracle deve reter as informações de undo após uma transação ter sido concluída.

Galera , valeu e até a próxima!!!!

Tags: , , , , , , , , , , , , , , , , , , ,