WAL 是關聯式資料庫中,用於提供原子性和持久性的方法,所有的修改在正式生效之前,都要先寫入 log 。不只在 PostgreSQL , MySQL 和 Databricks 也有這樣的機制,確保資料不會有部分完成,部分錯誤沒有存入的問題。
要查看WAL是否有作用,有三種方式:
pg_current_wal_lsn()
確認當前 WAL 的位址是否有變動pg_waldump
解析 WAL 內容pg_stat_wal
統計 WAL 使用狀況下面會介紹如何使用這三種方式查看。
pg_current_wal_lsn()
是 PostgreSQL 提供的一個系統函數,用來取得當前 WAL 寫入位置,以 LSN(Log Sequence Number)的格式表示。
一開始可以先使用 select pg_current_wal_lsn()
這個指令確認現在的LSN。
接著執行 SQL 的指令,例如:
BEGIN;
INSERT INTO wal_test (val) VALUES ('C');
COMMIT;
再次執行 select pg_current_wal_lsn()
,就可以很清楚看到 LSN 改變了。
使用 pg_current_wal_lsn()
只能簡單的確認是否有 WAL,無法知道更詳細的內容。如果想要知道 WAL 的細節,甚至是下過哪些 SQL 指令,可以使用 pg_waldump
。只要到 /pg_wal
這個資料夾底下,針對其中一個WAL檔案下 pg_waldump
的指令,像是 pg_waldump 000000010000000000000001
,即可取得詳細的紀錄。
可以更清楚看到上面 BEGIN
、 INSERT INTO
和 COMMIT
指令執行的過程,並且記錄了每一條指令的 LSN ,rmgr 也會標示每條 log 屬於那個種類,顯示這條 log 是 PostgreSQL 做了什麼操作。以下面範例來說,可以看到有 Transaction 的操作,因為 table 有建索引 ,而且是使用 Btree 這個演算法,所以也有 Btree 的操作。
pg_stat_wal
可用來統計 WAL 的使用,提供 wal_records
、 wal_fpi、wal_bytes
、 wal_buffers_full
、 wal_write、wal_sync
、 wal_write_time
、 wal_sync_time
和 stats_reset
等資訊。wal_records
可以知道總共產生過幾條 logs,wal_bytes
可以知道這些 logs 佔的容量。如果想要知道 WAL 寫入或同步到硬碟的次數,可以查詢 wal_write
和 wal_sync
,評估是否有寫入太頻繁的情況,太頻繁的寫入會影響資料庫的效能。
Reference: