Pular para o conteúdo

Compreendendo o UNDO no banco de dados Oracle: Garantindo a integridade das transações e a consistência dos dados

UNDO: A Chave para a Integridade das Transações

No mundo dos bancos de dados, manter a integridade das transações e garantir a consistência das informações é como cuidar de uma planta: tudo precisa de atenção e equilíbrio. É aí que o componente UNDO do Oracle Database entra em cena, funcionando como uma “memória de segurança” que registra cada alteração feita nas transações. Neste artigo, vamos explorar como o UNDO trabalha nos bastidores para garantir que as mudanças sejam sempre rastreadas, permitindo que você tenha dados confiáveis e atualizados a qualquer momento.

Entender o papel do UNDO não só torna sua administração de banco de dados mais eficiente, mas também te prepara para enfrentar situações inesperadas no dia a dia, com a tranquilidade de quem sabe que os dados estão sempre sob controle.

Funcionamento do UNDO no Oracle Database

O UNDO no Oracle Database é um componente essencial para garantir a integridade das transações e a consistência dos dados. Ele mantém registros das alterações realizadas pelas transações, permitindo que o banco de dados execute várias operações importantes.

image
SHOW PARAMETER UNDO
SQL
show parameter undo

TEMP_UNDO_ENABLED (boolean – FALSE):

Indica se o UNDO temporário está ativado. Quando FALSE, operações temporárias usam o mesmo espaço de UNDO que os objetos permanentes. Se estivesse como TRUE, haveria uma área separada, como uma “lixeira especial” apenas para operações temporárias.

UNDO_MANAGEMENT (string – AUTO):

Indica que o Oracle gerencia automaticamente os segmentos de UNDO. Pense nisso como um “piloto automático”, onde o DBA não precisa ajustar manualmente a alocação de espaço de UNDO.

UNDO_RETENTION (integer – 900):

Define o tempo (em segundos) que o Oracle tenta manter os dados de UNDO após uma transação ser concluída. Nesse caso, o tempo é de 15 minutos. Isso ajuda a garantir que consultas possam acessar dados consistentes por um período, como se o banco “guardasse uma cópia” temporária dos dados antigos.

UNDO_TABLESPACE (string – UNDOTBS1):

Indica a tablespace onde o UNDO está sendo armazenado. Pense nela como o “armazém” de todos os dados que precisam ser desfeitos ou mantidos para garantir a consistência das transações.

Mas afinal onde o UNDO é armazenado?

O Oracle Database armazena os dados de UNDO dentro do próprio banco de dados, e não em logs externos. No meu laboratório, podemos observar isso abaixo:

image 1
SELECT TABLESPACE_NAME, FILE_NAME FROM DBA_DATA_FILES
SQL
SELECT TABLESPACE_NAME, FILE_NAME FROM DBA_DATA_FILES

Com essa consulta, podemos visualizar o nome da tablespace (UNDOTBS1) que está sendo utilizada e o local onde o datafile está fisicamente armazenado.

Esses dados são armazenados em blocos de UNDO, que são atualizados de forma semelhante aos blocos de dados regulares. As alterações nesses blocos geram redo logs. É importante ter em mente que o UNDO gera REDO, mas o REDO não gera UNDO.

O banco de dados acessa as informações de UNDO de maneira eficiente, sem a necessidade de ler logs externos.

image 3
RING OF ALLOCATED EXTENTS IN AN UNDO SEGMENT

Quando uma transação é iniciada, ela é vinculada a um único segmento de UNDO. Cada transação grava seus dados em um extent dentro desse segmento, e várias transações podem compartilhar o mesmo segmento de UNDO. No entanto, cada bloco de dados dentro do extent armazena informações de apenas uma transação.

O segmento de UNDO é composto por extents, e o Oracle organiza esses extents de forma circular, como mostrado na figura. À medida que um extent se enche, o próximo é alocado. Se todos os extents forem utilizados e nenhum dado for mais necessário (ou seja, nenhuma transação ativa os estiver usando), a transação pode sobrescrever extents antigos, respeitando a ordem circular.

Se uma transação precisar de espaço e encontrar um extent ainda em uso por uma transação ativa, o Oracle buscará o próximo extent disponível. Isso garante que o processo circular funcione sem conflitos, desde que existam extents livres.

De maneira prática, vamos visualizar o comportamento desses segmentos de UNDO e suas estatísticas.
Usaremos a visão V$UNDOSTAT para visualizar informações sobre o uso de UNDO e sua geração de redo logs.

image 4
SELECT V$UNDOSTAT
SQL
SELECT begin_time, end_time, undoblks, txncount, maxquerylen, maxconcurrency
FROM v$undostat
ORDER BY end_time DESC
FETCH FIRST 10 ROWS ONLY;

Perto de um banco de dados em produção, o que vemos acima pode parecer uma piada, com tão poucos dados, rs.
No entanto, essa visão oferece uma visão geral do uso de UNDO e de como ele interage com as transações, ajudando a entender o impacto no redo.

UNDOBLKS: Número de blocos de UNDO usados no período.

TXNCOUNT: Número de transações realizadas.

MAXQUERYLEN: O tempo máximo que uma consulta permaneceu ativa (em segundos).

MAXCONCURRENCY: Número máximo de transações concorrentes.

Para ver quais segmentos de UNDO estão sendo usados e quais blocos estão sendo afetados, utilize a visão V$ROLLSTAT (estatísticas dos segmentos de rolagem/UNDO).

image 5
V$ROLLSTAT
SQL
SELECT us.segment_name, us.status, us.tablespace_name, rs.extents, rs.rssize
FROM dba_rollback_segs us
JOIN v$rollstat rs ON us.segment_id = rs.usn
WHERE us.status = 'ONLINE' AND
TABLESPACE_NAME = 'UNDOTBS1';

RSSIZE: Tamanho total dos segmentos de UNDO.

EXTENTS: Número de extents alocados ao segmento.

Neste ponto, acredito que a imagem abaixo vai ajudar a entender melhor o tempo e o espaço em que estamos, funcionando como uma espécie de organograma visual dos comandos mencionados anteriormente e do comando a seguir.

image 6
CYCLICAL USE OF ALLOCATED EXTENTS IN AN UNDO SEGMENT

Se você deseja monitorar transações específicas e visualizar os blocos de UNDO envolvidos, pode utilizar a visão V$TRANSACTION. Ela fornece informações sobre as transações em andamento, incluindo o uso de UNDO.

image 7
V$SESSION JOIN V$TRANSACTION
SQL
SELECT s.sid, s.serial#, t.xidusn, t.ubafil, t.ubablk, t.used_urec, t.used_ublk
FROM v$session s
JOIN v$transaction t ON s.saddr = t.ses_addr;

UBAFIL e UBABLK: Indicam o número do arquivo e o número do bloco de UNDO onde os dados de UNDO dessa transação estão armazenados.

USED_UREC: Número de registros de UNDO usados.

USED_UBLK: Número de blocos de UNDO usados pela transação.

Para visualizar a quantidade de redo logs gerados pelo banco, utilize:

image 8
V$SYSSTAT
SQL
SELECT name, value
FROM v$sysstat
WHERE name IN ('redo size', 'undo change vector size');

REDO SIZE: Quantidade total de redo gerado.

UNDO CHANGE VECTOR SIZE: Quantidade de redo gerado especificamente por alterações em blocos de UNDO.

Esses comandos oferecem uma visão abrangente dos blocos de UNDO e das alterações associadas que geram REDO LOGS, além de estatísticas sobre transações ativas e o uso de blocos de UNDO.

Em resumo, o UNDO é um recurso indispensável no Oracle Database, garantindo que suas transações sejam gerenciadas com segurança e precisão. Ao entender seu funcionamento e como interage com os dados e as transações, você pode otimizar a administração do seu banco de dados, melhorar a performance e evitar problemas futuros. Lembre-se de que, em um ambiente em constante mudança, ter controle sobre o UNDO é fundamental para manter a integridade e a consistência dos dados. Explore as estatísticas e comandos apresentados e utilize-os a seu favor, transformando a gestão do seu banco de dados em uma tarefa mais eficiente e segura.

Quão útil foi este post ?

Clique em uma estrela para classificar o post

nota média 5 / 5. Contagem de votos: 4

Sem votos ! Seja o primeiro a classificar !

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress