上饒做網(wǎng)站多少錢廣州網(wǎng)站排名優(yōu)化公司
PostgreSQL 沒有內(nèi)置的 binlog(binary log)機(jī)制像 MySQL 那樣。它使用 Write-Ahead Logging (WAL) 來記錄數(shù)據(jù)庫的變更。要將這些變更記錄到某張表中,通??梢允褂眠壿嫃?fù)制(Logical Replication)和觸發(fā)器(Triggers)來實(shí)現(xiàn)。以下是一個實(shí)現(xiàn)的思路:
1. 啟用邏輯復(fù)制
首先,確保 PostgreSQL 已啟用邏輯復(fù)制:
在 postgresql.conf 文件中,設(shè)置以下參數(shù):
# 啟用邏輯復(fù)制
wal_level = logical# 設(shè)置允許的最大同步槽數(shù)量
max_replication_slots = 4# 設(shè)置允許的最大訂閱數(shù)量
max_wal_senders = 4
然后重啟 PostgreSQL 服務(wù):
sudo systemctl restart postgresql
2. 創(chuàng)建發(fā)布和訂閱
1. 創(chuàng)建發(fā)布
在數(shù)據(jù)庫中,創(chuàng)建一個發(fā)布:
CREATE PUBLICATION my_publication FOR TABLE my_table;
這樣,my_table 的變更將會被記錄并可以被訂閱。
2. 創(chuàng)建訂閱
在另一個數(shù)據(jù)庫中,創(chuàng)建一個訂閱:
CREATE SUBSCRIPTION my_subscription
CONNECTION 'dbname=mydb host=localhost user=myuser password=mypassword'
PUBLICATION my_publication;
這樣,my_table 的變更將會被傳輸?shù)奖镜氐挠嗛啍?shù)據(jù)庫。
3. 使用觸發(fā)器記錄變更
如果你希望將變更記錄到特定的表中,你可以創(chuàng)建觸發(fā)器。以下是一個簡單的示例:
- 創(chuàng)建日志表
CREATE TABLE my_table_log (id SERIAL PRIMARY KEY,operation TEXT,old_data JSONB,new_data JSONB,changed_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
);
- 創(chuàng)建觸發(fā)器函數(shù)
CREATE OR REPLACE FUNCTION log_my_table_changes() RETURNS TRIGGER AS $$
BEGININSERT INTO my_table_log (operation, old_data, new_data)VALUES (TG_OP,row_to_json(OLD),row_to_json(NEW));RETURN NEW;
END;
$$ LANGUAGE plpgsql;
- 創(chuàng)建觸發(fā)器
CREATE TRIGGER my_table_changes
AFTER INSERT OR UPDATE OR DELETE ON my_table
FOR EACH ROW
EXECUTE FUNCTION log_my_table_changes();
這樣,每當(dāng) my_table 表中的數(shù)據(jù)發(fā)生變化時,觸發(fā)器會將這些變更記錄到 my_table_log 表中。這種方法可以記錄數(shù)據(jù)庫表中的變更并進(jìn)行審計(jì)。