emaj

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

概览

扩展包名版本分类许可证语言
emaj5.0.0TIMEGPL-3.0SQL
ID扩展名BinLibLoadCreateTrustReloc模式
1050emajemaj
相关扩展btree_gist dblink table_version pgmemento data_historization table_log ddl_historization periods temporal_tables

Requires max_prepared_transactions

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY5.0.01817161514emajbtree_gist, dblink
RPMPIGSTY5.0.01817161514e-maj_$v-
DEBPIGSTY5.0.01817161514postgresql-$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
PIGSTY 5.0.0
PIGSTY 5.0.0
PIGSTY 5.0.0
PIGSTY 5.0.0
PIGSTY 5.0.0
u22.x86_64
u22.aarch64
PIGSTY 5.0.0
PIGSTY 5.0.0
PIGSTY 5.0.0
PIGSTY 5.0.0
PIGSTY 5.0.0
u24.x86_64
u24.aarch64
PIGSTY 5.0.0
PIGSTY 5.0.0
PIGSTY 5.0.0
PIGSTY 5.0.0
PIGSTY 5.0.0
u26.x86_64
u26.aarch64

构建

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

pig build pkg emaj         # 构建 RPM / 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;  -- 依赖: btree_gist, dblink

用法

来源:

规范扩展名是 emaj;E-Maj 为一个协调表组记录表与序列变更,并可把整个表组回滚到命名标记。它适用于可重复测试、批处理保存点、变更检查与定向恢复,但 E-Maj 回滚不能替代 PostgreSQL 事务回滚或备份。

核心流程

CREATE EXTENSION emaj CASCADE;
GRANT emaj_adm TO app_admin;

SELECT emaj.emaj_create_group('my_group', true);
SELECT emaj.emaj_assign_table('app', 'orders', 'my_group');
SELECT emaj.emaj_assign_sequences('app', '.*', '', 'my_group');

SELECT emaj.emaj_start_group('my_group', 'mark_1');
-- Run application changes.
SELECT emaj.emaj_set_mark_group('my_group', 'mark_2');
-- Run more application changes.

SELECT emaj.emaj_rollback_group('my_group', 'mark_1');
SELECT emaj.emaj_stop_group('my_group');
SELECT emaj.emaj_drop_group('my_group');

可回滚表组可以包含多个 schema 中的表与序列,但每张表必须有主键。仅审计表组可记录不可回滚对象的变更。启动和停止表组会锁定其应用表,因此要结合并发流量安排这些操作。

重要对象

  • emaj_create_group 与各类分配函数用于定义表组。
  • emaj_start_groupemaj_set_mark_groupemaj_stop_group 管理日志会话和标记。
  • emaj_rollback_group 执行不记日志的回滚;emaj_logged_rollback_group 会记录补偿变更。
  • 多组变体可在同一时间点操作由组名组成的数组。
  • 统计与变更导出函数可检查两个标记之间的变更,或生成用于重放的 SQL。
  • emaj_set_param 无需直接写内部参数表即可修改或重置 E-Maj 参数。
  • emaj_drop_extension() 是受支持的完整移除辅助函数。

5.0 版本升级

如果 E-Maj 以扩展方式安装且版本不低于 2.3.1,先安装新软件包文件,再执行:

ALTER EXTENSION emaj UPDATE;

文档给出的扩展升级会保留日志,而且表组可以继续处于 LOGGING 状态。切换前应检查以下 5.0 兼容性变化:

  • 支持 PostgreSQL 14 到 19;不再支持 PostgreSQL 12 与 13。
  • emaj_param 的直接 INSERTUPDATEDELETE 必须改为调用 emaj_set_param
  • 幂等启动和停止调用增加了允许已启动或允许已空闲参数;使用命名参数的调用方必须检查参数重命名。
  • PHP 命令行客户端与 emaj_uninstall.sql 已移除。

通过独立 SQL 脚本安装的环境没有相同的就地扩展升级路径;应遵循官方删除并重装流程。

要求与注意事项

标准 CREATE EXTENSION 路径需要超级用户权限,并通过 CASCADE 安装 dblinkbtree_gist。E-Maj 也支持受限的非超级用户脚本安装,其能力限制取决于安装角色。

只有并行回滚客户端需要 max_prepared_transactions,其值必须不小于计划使用的会话数;修改后需要重启。大型表组也可能需要更高的 max_locks_per_transaction。应把 E-Maj 日志表视为运维数据:明确规划保留策略、监控增长,并继续使用普通备份进行灾难恢复。


最后修改:2026-07-30: extension update 2026-07-30 (7373242)