← Voltar ao hub MariaDB
MariaDB 22 de outubro de 2026 5 min de leitura

MariaDB: tabelas temporais (System Versioning) para viajar no tempo dos dados

Com WITH SYSTEM VERSIONING, o MariaDB guarda sozinho cada versão de cada linha. Você consulta o banco como ele estava em qualquer momento, sem trigger e sem tabela de log.

MariaDB: tabelas temporais (System Versioning) para viajar no tempo dos dados

Sabe aquele chefe que pergunta "qual era o preço desse produto na terça passada às 15h?" No MySQL, a resposta honesta é: "depende de alguém ter criado uma tabela de log, umas triggers e rezado". No MariaDB, é um SELECT.

Este artigo faz parte da série MariaDB além do MySQL: dez recursos que existem no MariaDB e não existem no MySQL Community. Exemplos escritos para MariaDB 11.4 LTS (e 11.7+ quando indicado), comparados com MySQL 8.4 LTS.

O que é System Versioning?

É a implementação do MariaDB (desde a versão 10.3) para as tabelas temporais do padrão SQL:2011. Cada linha ganha duas colunas invisíveis, ROW_START e ROW_END. Quando você faz UPDATE ou DELETE, a versão antiga não some: ela é fechada com a data/hora da mudança e fica guardada.

linha id=1, preco=100  [ROW_START 01/10 09:00 → ROW_END 05/10 14:00]   ← histórico
linha id=1, preco=120  [ROW_START 05/10 14:00 → ROW_END ∞          ]   ← atual

UPDATE preco=120 ─────────┘ fecha a versão antiga e abre uma nova

Na prática

CREATE TABLE produtos (
  id    INT PRIMARY KEY,
  nome  VARCHAR(100),
  preco DECIMAL(10,2)
) WITH SYSTEM VERSIONING;

INSERT INTO produtos VALUES (1, 'Teclado mecânico', 100.00);
UPDATE produtos SET preco = 120.00 WHERE id = 1;

-- Como estava a tabela em um momento do passado?
SELECT * FROM produtos
  FOR SYSTEM_TIME AS OF TIMESTAMP '2026-10-05 10:00:00';

-- Todas as versões de uma linha
SELECT id, preco, ROW_START, ROW_END
  FROM produtos FOR SYSTEM_TIME ALL
 WHERE id = 1;

-- O que mudou num intervalo
SELECT * FROM produtos
  FOR SYSTEM_TIME BETWEEN '2026-10-01' AND '2026-10-07';

Para tabelas que já existem: ALTER TABLE produtos ADD SYSTEM VERSIONING;

E o histórico não vai explodir o disco?

Vai, se você deixar. Duas ferramentas resolvem:

-- Separar o histórico em partições por período
CREATE TABLE eventos (id INT, status VARCHAR(20))
  WITH SYSTEM VERSIONING
  PARTITION BY SYSTEM_TIME INTERVAL 1 MONTH (
    PARTITION p_hist HISTORY,
    PARTITION p_atual CURRENT
  );

-- Apagar histórico antigo (exige o privilégio DELETE HISTORY)
DELETE HISTORY FROM produtos BEFORE SYSTEM_TIME '2025-01-01';

Quando usar

  • Auditoria e compliance (LGPD, contábil, fiscal): quem tinha qual valor e quando.
  • Depuração: "o dado estava certo ontem?" vira uma consulta.
  • Relatórios retroativos sem snapshots manuais.

E no MySQL?

O MySQL 8.4 não implementa tabelas temporais do SQL:2011. O caminho é o artesanal: triggers AFTER UPDATE/DELETE gravando numa tabela de histórico, ou ler o binlog. Funciona, mas é código seu, bug seu e manutenção sua.

Cuidados

  • Cada UPDATE vira uma inserção a mais: tabelas com escrita intensa crescem rápido.
  • mysqldump não exporta o histórico por padrão; planeje o backup (o mariadb-backup copia tudo).
  • Não é substituto de backup: se o servidor morrer, o histórico morre junto.

A série completa: MariaDB além do MySQL

Ainda decidindo entre os dois? Leia MySQL ou MariaDB: qual é o melhor? e o guia definitivo de MySQL.

Quer dominar a base que os dois compartilham?

MariaDB nasceu do MySQL, e tudo o que é fundamento (modelagem, índices, transações, replicação, otimização) vale para os dois. É isso que eu ensino no livro Aprendendo MySQL: Prática, Teoria, Laboratórios, Desafios e Projetos: 292 páginas, 10 laboratórios guiados, 277 exercícios e 4 desafios com gabarito, e uma máquina virtual pronta para você quebrar (e consertar) à vontade.

Conheça o livro e leia a degustação gratuita.

Bora trocar ideia?

Se este artigo te ajudou (ou te fez discordar, que também vale), me siga no LinkedIn e no Instagram. Lá eu posto bastidores de banco de dados, história da computação e histórias de produção que ninguém conta em curso oficial.


Sobre o autor: Alexandre Almeida atua com bancos de dados há mais de 25 anos, foi instrutor oficial de MySQL e Oracle para mais de 1.000 alunos e escreveu Aprendendo MySQL: Prática, Teoria e Laboratórios.

Fontes: MariaDB Server Documentation (MariaDB Knowledge Base), notas de release do MariaDB Server, MySQL 8.4 Reference Manual. Imagem de capa: ilustração gerada por IA (administrador de banco de dados olhando um relógio e uma linha do tempo de dados no monitor).