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.

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.
mysqldumpnão exporta o histórico por padrão; planeje o backup (omariadb-backupcopia tudo).- Não é substituto de backup: se o servidor morrer, o histórico morre junto.
A série completa: MariaDB além do MySQL
- Tabelas temporais (System Versioning) para viajar no tempo dos dados
- Períodos de aplicação e WITHOUT OVERLAPS para reservas sem conflito
- SEQUENCE, o gerador de números que o AUTO_INCREMENT não consegue ser
- INSERT e DELETE ... RETURNING, uma ida ao banco em vez de duas
- Modo Oracle (SQL_MODE=ORACLE) para migrar PL/SQL com menos dor
- Multi-master síncrono que já vem na caixa
- Banco colunar para análise sem sair do SQL
- Sharding transparente com tabelas distribuídas
- Thread pool gratuito para milhares de conexões
- Busca vetorial com índice HNSW para IA e RAG
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).