table_log
记录某张表的修改日志并做表/行级时间点恢复
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
table_log | 0.6.4 | ADMIN | PostgreSQL | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 5860 | table_log | 否 | 是 | 否 | 是 | 否 | 否 | - |
| 相关扩展 | temporal_tables emaj pg_drop_events pg_auditor pg_upless pg_savior pgaudit pgauditlogtofile |
|---|
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | MIXED | 0.6.4 | 1817161514 | table_log | - |
| RPM | PIGSTY | 0.6.4 | 1817161514 | table_log_$v | - |
| DEB | PGDG | 0.6.4 | 1817161514 | postgresql-$v-tablelog | - |
构建
您可以使用 pig build 命令构建 table_log 扩展的 RPM 包:
pig build pkg table_log # 构建 RPM 包
安装
您可以直接安装 table_log 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
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 扩展将对表的 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(...) | 将表状态恢复到给定时间戳 |