emaj
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
emaj | 4.7.1 | TIME | GPL-3.0 | SQL |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 1050 | emaj | 否 | 是 | 否 | 是 | 否 | 否 | emaj |
| 相关扩展 | dblink btree_gist timescaledb_toolkit timescaledb periods temporal_tables table_version pg_cron pg_partman timeseries |
|---|
max_prepared_transactions
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | MIXED | 4.7.1 | 1817161514 | emaj | dblink, btree_gist |
| RPM | PGDG | 4.7.1 | 1817161514 | e-maj_$v | - |
| DEB | PIGSTY | 4.7.1 | 1817161514 | postgresql-$v-emaj | - |
构建
您可以使用 pig build 命令构建 emaj 扩展的 DEB 包:
pig build pkg emaj # 构建 DEB 包
安装
您可以直接安装 emaj 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
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 记录表上执行的变更操作(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 获取,详见文档。