首页 > 解决方案 > PostgreSQL:操作日志

问题描述

我需要确保在我的数据库中捕获所有数据修改(插入/更新/删除)。更大的图景,一个过程将读取每个修改并将该信息映射到特定的消息结构,然后将其添加到像 Kafka 这样的队列中。不过,我不确定最好的方法。这个答案提示使用test_decoding插件。其他资源指向 WAL 和查询复制槽,但我不需要存档 WAL 或实际复制我的数据。我只需要记录该数据发生的所有事情。就像是:

SELECT * FROM operations_log;

> | query                                                              |
> | INSERT INTO users (id, name, bio) VALUES (1, 'pat', 'a person')    |
> | UPDATE users SET name = 'Pat' WHERE id = 1                         |     

人们如何在 PostgreSQL 中管理这种需求?是否需要复制或 WAL 归档才能获得此好处?

标签: postgresql

解决方案


我通常使用表上的后触发器来解决这个问题,然后将旧行以及时间戳和任何其他相关信息插入另一个审计表中。

因此,以您的 users 表为例,我将创建一个 users_audit 表:

create table users_audit (
    ts timestamptz default current_timestamp,
    like users
);

然后是触发函数

create function users_audit_trigger() returns trigger
language plpgsql as $$
insert into users_audit values (current_timestamp, OLD.*);
$$

最后是真正的触发器......

create trigger users_audit_tg after update or delete on users
for each row execute procedure users_audit_trigger();

以上内容未经测试,您可能希望记录更多信息,例如执行更新的用户或更新或删除的实际操作,因此详细信息可能会有所不同。

您可以使用逻辑复制在不同的服务器上执行部分或全部此操作,但基本思想保持不变。


推荐阅读