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 归档才能获得此好处?

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

因此,以您的用户表为例,我将创建一个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();

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

您可以使用逻辑复制在不同的 服务器,但基本思想保持不变。

最新更新