table_log

记录某张表的修改日志并做表/行级时间点恢复

概览

扩展包名版本分类许可证语言
table_log0.6.4ADMINPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
5860table_log-
相关扩展temporal_tables emaj pg_drop_events pg_auditor pg_upless pg_savior pgaudit pgauditlogtofile

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED0.6.41817161514table_log-
RPMPIGSTY0.6.41817161514table_log_$v-
DEBPGDG0.6.41817161514postgresql-$v-tablelog-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PGDG 0.6.4
PGDG 0.6.4
PGDG 0.6.4
PGDG 0.6.4
PGDG 0.6.4
d12.aarch64
PGDG 0.6.4
PGDG 0.6.4
PGDG 0.6.4
PGDG 0.6.4
PGDG 0.6.4
d13.x86_64
PGDG 0.6.4
PGDG 0.6.4
PGDG 0.6.4
PGDG 0.6.4
PGDG 0.6.4
d13.aarch64
PGDG 0.6.4
PGDG 0.6.4
PGDG 0.6.4
PGDG 0.6.4
PGDG 0.6.4
u22.x86_64
u22.aarch64
PGDG 0.6.4
PGDG 0.6.4
PGDG 0.6.4
PGDG 0.6.4
PGDG 0.6.4
u24.x86_64
u24.aarch64
PGDG 0.6.4
PGDG 0.6.4
PGDG 0.6.4
PGDG 0.6.4
PGDG 0.6.4

构建

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

pig build pkg table_log         # 构建 RPM 包

安装

您可以直接安装 table_log 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install table_log;          # 当前活跃 PG 版本安装
pig ext install -y table_log -v 18  # PG 18
pig ext install -y table_log -v 17  # PG 17
pig ext install -y table_log -v 16  # PG 16
pig ext install -y table_log -v 15  # PG 15
pig ext install -y table_log -v 14  # PG 14
dnf install -y table_log_18       # PG 18
dnf install -y table_log_17       # PG 17
dnf install -y table_log_16       # PG 16
dnf install -y table_log_15       # PG 15
dnf install -y table_log_14       # PG 14
apt install -y postgresql-18-tablelog   # PG 18
apt install -y postgresql-17-tablelog   # PG 17
apt install -y postgresql-16-tablelog   # PG 16
apt install -y postgresql-15-tablelog   # PG 15
apt install -y postgresql-14-tablelog   # PG 14

创建扩展

CREATE EXTENSION table_log;

用法

table_log: 记录表修改日志并实现表/行级别的时间点恢复

table_log 扩展将对表的 INSERT、UPDATE 和 DELETE 操作记录到单独的日志表中,实现表或行级别的时间点恢复。

初始化日志

CREATE EXTENSION table_log;

-- 基本设置:为 'my_table' 创建日志表和触发器
-- Level 5 = 记录 trigger_id + trigger_user + trigger 列
SELECT table_log_init(5, 'my_table');

-- 指定日志模式
SELECT table_log_init(5, 'my_table', 'log_schema');

-- 完整形式,包含所有选项
SELECT table_log_init(
    5,                -- 级别: 3=最小, 4=+用户, 5=+id+用户
    'public',         -- 源模式
    'my_table',       -- 源表
    'log_schema',     -- 日志表模式
    'my_table_log',   -- 日志表名(默认: {table}_log)
    'SINGLE',         -- 分区模式: 'SINGLE' 或 'PARTITION'
    false,            -- basic_mode(更简单的触发器)
    '{INSERT, UPDATE, DELETE}'::text[]  -- 要记录的操作
);

日志表结构

日志表镜像原始表的列,加上元数据:

描述
trigger_mode操作类型:INSERT、UPDATE、DELETE
trigger_tuple元组版本:‘old’ 或 ’new’
trigger_changed变更时间戳
trigger_id序列 ID(级别 4+)
trigger_user执行变更的用户(级别 5)

时间点恢复

-- 将表恢复到特定时间点
SELECT table_log_restore_table(
    'my_table',           -- 原始表名
    'my_table_log',       -- 日志表名
    'id',                 -- 主键列
    'trigger_changed',    -- 日志中的时间戳列
    'trigger_tuple',      -- 日志中的元组类型列
    '2024-01-15 10:30:00' -- 恢复到此时间戳
);

触发器函数

函数描述
table_log()完整触发器函数,记录所有列
table_log_basic()基本触发器函数,更简单的记录
table_log_restore_table(...)将表状态恢复到给定时间戳

最后修改 2026-03-14: update extension metadata (953cbd0)