emaj
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
emaj | 5.0.0 | TIME | GPL-3.0 | SQL |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 1050 | emaj | 否 | 是 | 否 | 是 | 否 | 否 | emaj |
| 相关扩展 | btree_gist dblink table_version pgmemento data_historization table_log ddl_historization periods temporal_tables |
|---|
Requires max_prepared_transactions
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PIGSTY | 5.0.0 | 1817161514 | emaj | btree_gist, dblink |
| RPM | PIGSTY | 5.0.0 | 1817161514 | e-maj_$v | - |
| DEB | PIGSTY | 5.0.0 | 1817161514 | postgresql-$v-emaj | - |
构建
您可以使用 pig build 命令构建 emaj 扩展的 RPM / DEB 包:
pig build pkg emaj # 构建 RPM / 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; -- 依赖: 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_group、emaj_set_mark_group与emaj_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的直接INSERT、UPDATE或DELETE必须改为调用emaj_set_param。 - 幂等启动和停止调用增加了允许已启动或允许已空闲参数;使用命名参数的调用方必须检查参数重命名。
- PHP 命令行客户端与
emaj_uninstall.sql已移除。
通过独立 SQL 脚本安装的环境没有相同的就地扩展升级路径;应遵循官方删除并重装流程。
要求与注意事项
标准 CREATE EXTENSION 路径需要超级用户权限,并通过 CASCADE 安装 dblink 与 btree_gist。E-Maj 也支持受限的非超级用户脚本安装,其能力限制取决于安装角色。
只有并行回滚客户端需要 max_prepared_transactions,其值必须不小于计划使用的会话数;修改后需要重启。大型表组也可能需要更高的 max_locks_per_transaction。应把 E-Maj 日志表视为运维数据:明确规划保留策略、监控增长,并继续使用普通备份进行灾难恢复。