emaj
emaj : Enables fine-grained write logging and time travel on subsets of the database.
Overview
| ID | Extension | Package | Version | Category | License | Language |
|---|---|---|---|---|---|---|
| 1050 | emaj
|
emaj
|
5.0.0 |
TIME
|
GPL-3.0
|
SQL
|
| Attribute | Has Binary | Has Library | Need Load | Has DDL | Relocatable | Trusted |
|---|---|---|---|---|---|---|
--s-d--
|
No
|
Yes
|
No
|
Yes
|
no
|
no
|
| Relationships | |
|---|---|
| Schemas | emaj |
| Requires | btree_gist
dblink
|
| See Also | table_version
pgmemento
data_historization
table_log
ddl_historization
periods
temporal_tables
|
Requires max_prepared_transactions
Packages
| Type | Repo | Version | PG Major Compatibility | Package Pattern | Dependencies |
|---|---|---|---|---|---|
| EXT | PIGSTY
|
5.0.0 |
18
17
16
15
14
|
emaj |
btree_gist, dblink |
| RPM | PIGSTY
|
5.0.0 |
18
17
16
15
14
|
e-maj_$v |
- |
| DEB | PIGSTY
|
5.0.0 |
18
17
16
15
14
|
postgresql-$v-emaj |
- |
| Linux / PG | PG18 | PG17 | PG16 | PG15 | PG14 |
|---|---|---|---|---|---|
el8.x86_64
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
el8.aarch64
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
el9.x86_64
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
el9.aarch64
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
el10.x86_64
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
el10.aarch64
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
d12.x86_64
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
d12.aarch64
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
d13.x86_64
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
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
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
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
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
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
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
u26.aarch64
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
PIGSTY 5.0.0
|
Source
pig build pkg emaj; # build rpm/debInstall
Make sure PGDG and PIGSTY repo available:
pig repo add pgsql -u # add both repo and update cacheInstall this extension with pig:
pig install emaj; # install via package name, for the active PG version
pig install emaj -v 18; # install for PG 18
pig install emaj -v 17; # install for PG 17
pig install emaj -v 16; # install for PG 16
pig install emaj -v 15; # install for PG 15
pig install emaj -v 14; # install for PG 14Create this extension with:
CREATE EXTENSION emaj CASCADE; -- requires btree_gist, dblinkUsage
Sources:
The canonical extension name is emaj; E-Maj records table and sequence changes for a coordinated table group and can roll that group back to a named mark. It is useful for repeatable test runs, batch savepoints, change inspection, and targeted recovery, but an E-Maj rollback is not a replacement for PostgreSQL transaction rollback or backup.
Core Workflow
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');A rollbackable table group can contain tables and sequences from several schemas, but each table must have a primary key. Audit-only groups can record changes for objects that are not rollbackable. Starting and stopping a group takes locks on its application tables, so plan these operations around concurrent traffic.
Important Objects
emaj_create_groupand assignment functions define table groups.emaj_start_group,emaj_set_mark_group, andemaj_stop_groupmanage logging sessions and marks.emaj_rollback_groupperforms an unlogged rollback;emaj_logged_rollback_grouprecords the compensating changes.- Multi-group variants operate on arrays of group names at one common point in time.
- Statistics and change-dump functions inspect changes between marks or generate SQL for replay.
emaj_set_paramchanges or resets an E-Maj parameter without direct writes to the internal parameter table.emaj_drop_extension()is the supported full-removal helper.
Version 5.0 Upgrade
For an E-Maj extension installed at version 2.3.1 or later, install the new package files and run:
ALTER EXTENSION emaj UPDATE;The documented extension upgrade preserves logs and can run while groups remain in the LOGGING state. Review these 5.0 compatibility changes before cutover:
- PostgreSQL 14 through 19 are supported; PostgreSQL 12 and 13 are no longer supported.
- Direct
INSERT,UPDATE, orDELETEagainstemaj_parammust be replaced byemaj_set_param. - Idempotent start and stop calls have new allow-already-active or allow-already-idle parameters; named-argument callers must review renamed parameters.
- The PHP command-line clients and
emaj_uninstall.sqlwere removed.
Installations made with the standalone SQL script do not have the same in-place extension upgrade path; follow the official delete-and-reinstall procedure.
Requirements and Caveats
The standard CREATE EXTENSION path requires superuser privileges and installs dblink plus btree_gist through CASCADE. E-Maj also supports a limited non-superuser script installation, with capability restrictions tied to the installer role.
max_prepared_transactions is required only for the parallel rollback client and must be at least the intended session count; changing it requires a restart. Large groups can also require a higher max_locks_per_transaction. Treat E-Maj log tables as operational data: size retention deliberately, monitor their growth, and keep ordinary backups for disaster recovery.