Skip to content
emaj

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
Package Version OS ORG SIZE File URL
e-maj_18 5.0.0 el8.x86_64 pigsty 314.7 KiB e-maj_18-5.0.0-2PIGSTY.el8.noarch.rpm
e-maj_18 5.0.0 el8.x86_64 pgdg 5.4 MiB e-maj_18-5.0.0-1PGDG.rhel8.10.noarch.rpm
e-maj_18 4.7.1 el8.x86_64 pgdg 5.3 MiB e-maj_18-4.7.1-1PGDG.rhel8.noarch.rpm
e-maj_18 5.0.0 el8.aarch64 pigsty 314.7 KiB e-maj_18-5.0.0-2PIGSTY.el8.noarch.rpm
e-maj_18 5.0.0 el8.aarch64 pgdg 5.4 MiB e-maj_18-5.0.0-1PGDG.rhel8.10.noarch.rpm
e-maj_18 4.7.1 el8.aarch64 pgdg 5.3 MiB e-maj_18-4.7.1-1PGDG.rhel8.noarch.rpm
e-maj_18 5.0.0 el9.x86_64 pigsty 219.6 KiB e-maj_18-5.0.0-2PIGSTY.el9.noarch.rpm
e-maj_18 4.7.1 el9.x86_64 pgdg 5.1 MiB e-maj_18-4.7.1-2PGDG.rhel9.8.noarch.rpm
e-maj_18 4.7.1 el9.x86_64 pgdg 5.1 MiB e-maj_18-4.7.1-1PGDG.rhel9.noarch.rpm
e-maj_18 5.0.0 el9.aarch64 pigsty 219.5 KiB e-maj_18-5.0.0-2PIGSTY.el9.noarch.rpm
e-maj_18 5.0.0 el9.aarch64 pgdg 5.2 MiB e-maj_18-5.0.0-1PGDG.rhel9.8.noarch.rpm
e-maj_18 4.7.1 el9.aarch64 pgdg 5.1 MiB e-maj_18-4.7.1-2PGDG.rhel9.8.noarch.rpm
e-maj_18 4.7.1 el9.aarch64 pgdg 5.1 MiB e-maj_18-4.7.1-1PGDG.rhel9.noarch.rpm
e-maj_18 5.0.0 el10.x86_64 pigsty 219.9 KiB e-maj_18-5.0.0-2PIGSTY.el10.noarch.rpm
e-maj_18 5.0.0 el10.x86_64 pgdg 5.2 MiB e-maj_18-5.0.0-1PGDG.rhel10.2.noarch.rpm
e-maj_18 4.7.1 el10.x86_64 pgdg 5.1 MiB e-maj_18-4.7.1-2PGDG.rhel10.2.noarch.rpm
e-maj_18 4.7.1 el10.x86_64 pgdg 5.1 MiB e-maj_18-4.7.1-1PGDG.rhel10.noarch.rpm
e-maj_18 5.0.0 el10.aarch64 pigsty 219.8 KiB e-maj_18-5.0.0-2PIGSTY.el10.noarch.rpm
e-maj_18 5.0.0 el10.aarch64 pgdg 5.2 MiB e-maj_18-5.0.0-1PGDG.rhel10.2.noarch.rpm
e-maj_18 4.7.1 el10.aarch64 pgdg 5.1 MiB e-maj_18-4.7.1-2PGDG.rhel10.2.noarch.rpm
e-maj_18 4.7.1 el10.aarch64 pgdg 5.1 MiB e-maj_18-4.7.1-1PGDG.rhel10.noarch.rpm
postgresql-18-emaj 5.0.0 d12.x86_64 pigsty 232.0 KiB postgresql-18-emaj_5.0.0-1PIGSTY~bookworm_all.deb
postgresql-18-emaj 5.0.0 d12.aarch64 pigsty 232.0 KiB postgresql-18-emaj_5.0.0-1PIGSTY~bookworm_all.deb
postgresql-18-emaj 5.0.0 d13.x86_64 pigsty 232.1 KiB postgresql-18-emaj_5.0.0-1PIGSTY~trixie_all.deb
postgresql-18-emaj 5.0.0 d13.aarch64 pigsty 232.1 KiB postgresql-18-emaj_5.0.0-1PIGSTY~trixie_all.deb
postgresql-18-emaj 5.0.0 u22.x86_64 pigsty 209.9 KiB postgresql-18-emaj_5.0.0-1PIGSTY~jammy_all.deb
postgresql-18-emaj 5.0.0 u22.aarch64 pigsty 209.9 KiB postgresql-18-emaj_5.0.0-1PIGSTY~jammy_all.deb
postgresql-18-emaj 5.0.0 u24.x86_64 pigsty 210.0 KiB postgresql-18-emaj_5.0.0-1PIGSTY~noble_all.deb
postgresql-18-emaj 5.0.0 u24.aarch64 pigsty 210.0 KiB postgresql-18-emaj_5.0.0-1PIGSTY~noble_all.deb
postgresql-18-emaj 5.0.0 u26.x86_64 pigsty 209.7 KiB postgresql-18-emaj_5.0.0-1PIGSTY~resolute_all.deb
postgresql-18-emaj 5.0.0 u26.aarch64 pigsty 209.7 KiB postgresql-18-emaj_5.0.0-1PIGSTY~resolute_all.deb

Source

pig build pkg emaj;		# build rpm/deb

Install

Make sure PGDG and PIGSTY repo available:

pig repo add pgsql -u   # add both repo and update cache

Install 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 14

Create this extension with:

CREATE EXTENSION emaj CASCADE; -- requires btree_gist, dblink

Usage

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_group and assignment functions define table groups.
  • emaj_start_group, emaj_set_mark_group, and emaj_stop_group manage logging sessions and marks.
  • emaj_rollback_group performs an unlogged rollback; emaj_logged_rollback_group records 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_param changes 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, or DELETE against emaj_param must be replaced by emaj_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.sql were 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.

Last updated on