emaj

让数据库的子集具有细粒度日志和时间旅行功能

概览

扩展包名版本分类许可证语言
emaj4.7.1TIMEGPL-3.0SQL
ID扩展名BinLibLoadCreateTrustReloc模式
1050emajemaj
相关扩展dblink btree_gist timescaledb_toolkit timescaledb periods temporal_tables table_version pg_cron pg_partman timeseries

max_prepared_transactions

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED4.7.11817161514emajdblink, btree_gist
RPMPGDG4.7.11817161514e-maj_$v-
DEBPIGSTY4.7.11817161514postgresql-$v-emaj-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64

构建

您可以使用 pig build 命令构建 emaj 扩展的 DEB 包:

pig build pkg emaj         # 构建 DEB 包

安装

您可以直接安装 emaj 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install emaj;          # 当前活跃 PG 版本安装
pig ext install -y emaj -v 18  # PG 18
pig ext install -y emaj -v 17  # PG 17
pig ext install -y emaj -v 16  # PG 16
pig ext install -y emaj -v 15  # PG 15
pig ext install -y emaj -v 14  # PG 14
dnf install -y e-maj_18       # PG 18
dnf install -y e-maj_17       # PG 17
dnf install -y e-maj_16       # PG 16
dnf install -y e-maj_15       # PG 15
dnf install -y e-maj_14       # PG 14
apt install -y postgresql-18-emaj   # PG 18
apt install -y postgresql-17-emaj   # PG 17
apt install -y postgresql-16-emaj   # PG 16
apt install -y postgresql-15-emaj   # PG 15
apt install -y postgresql-14-emaj   # PG 14

创建扩展

CREATE EXTENSION emaj CASCADE;  -- 依赖: dblink, btree_gist

用法

E-Maj: 记录并回滚表内容变更

文档 | Emaj_web 图形界面

E-Maj 记录表上执行的变更操作(Insert、Update、Delete、Truncate),涵盖一个或多个表集合,并可在需要时高效地撤销这些变更,将表集合恢复到预定义的稳定状态。

开发环境中,它可以轻松回滚程序执行产生的所有更新,方便反复重放测试流程。

生产环境中,它提供:

  • 表变更历史记录,供检查与审计
  • 表组的批间保存点
  • 无需停机即可将表组"恢复"到稳定状态
  • 批处理窗口内的多个保存点,每个都可用作恢复点

核心概念

表组(Tables Group)

表组是一组生命节奏相同的应用表——它们的内容可以作为整体恢复。一个组可以包含不同 schema 中的表和序列。每个组处于两种状态之一:LOGGING(记录中)或 IDLE(空闲),并可指定为:

  • ROLLBACKABLE(标准)——支持记录和回滚
  • AUDIT_ONLY——只记录变更,不支持回滚,适用于没有主键的表或 UNLOGGED 表

标记(Mark)

标记代表表组生命周期中的快照时刻,捕获所有组成员的稳定状态。标记名称在组内唯一。

回滚(Rollback)

回滚操作将表和序列恢复到建立特定标记时的状态:

  • 非日志回滚(Unlogged rollback)——撤销的更新不留痕迹
  • 日志回滚(Logged rollback)——撤销操作也会被记录,允许后续再次反转

注意:E-Maj 的回滚与 PostgreSQL 原生的事务回滚有本质区别。

主要函数

启动表组

SELECT emaj.emaj_start_group('my_group', 'mark_1');

激活变更记录。表组必须处于 IDLE 状态。会自动创建初始标记。

设置中间标记

SELECT emaj.emaj_set_mark_group('my_group', 'mark_2');

记录应用状态的时间点快照。表组必须处于 LOGGING 状态。

回滚表组

非日志回滚(恢复表,不留撤销痕迹):

SELECT * FROM emaj.emaj_rollback_group('my_group', 'mark_1');

日志回滚(允许撤销本次回滚):

SELECT * FROM emaj.emaj_logged_rollback_group('my_group', 'mark_1');

两者都支持 '_EMAJ_LAST_MARK_' 关键字来指定最近的标记。

停止表组

SELECT emaj.emaj_stop_group('my_group');

停用记录功能,将表组状态从 LOGGING 切换为 IDLE。

多组操作

支持同时对多个表组进行批量操作:

SELECT emaj.emaj_start_groups('{"group1","group2"}', 'multi_mark');
SELECT emaj.emaj_set_mark_groups('{"group1","group2"}', 'common_mark');
SELECT * FROM emaj.emaj_rollback_groups('{"group1","group2"}', 'common_mark');
SELECT emaj.emaj_stop_groups('{"group1","group2"}');

变更检查

E-Maj 提供函数用于统计和检查标记之间的数据变更内容,并可生成重放已记录变更的 SQL 脚本。这对审计和调试非常有用。

Emaj_web

Emaj_web 是一个基于 PHP 的 Web 图形管理工具,提供友好的 E-Maj 管理界面。可在 GitHub 获取,详见文档


最后修改 2026-03-14: update extension metadata (953cbd0)