iT邦幫忙

2025 iThome 鐵人賽

DAY 25
1
Software Development

我所不知道的PostgreSQL 30天系列 第 25

Day 25: 如何查看Write-Ahead Logging (WAL)的使用情況?

  • 分享至 

  • xImage
  •  

WAL 是關聯式資料庫中,用於提供原子性和持久性的方法,所有的修改在正式生效之前,都要先寫入 log 。不只在 PostgreSQL , MySQL 和 Databricks 也有這樣的機制,確保資料不會有部分完成,部分錯誤沒有存入的問題。

要查看WAL是否有作用,有三種方式:

  • 使用 pg_current_wal_lsn() 確認當前 WAL 的位址是否有變動
  • 使用 pg_waldump 解析 WAL 內容
  • 使用 pg_stat_wal 統計 WAL 使用狀況

下面會介紹如何使用這三種方式查看。

使用 pg_current_wal_lsn() 確認

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_waldump 解析 WAL 內容

使用 pg_current_wal_lsn() 只能簡單的確認是否有 WAL,無法知道更詳細的內容。如果想要知道 WAL 的細節,甚至是下過哪些 SQL 指令,可以使用 pg_waldump 。只要到 /pg_wal 這個資料夾底下,針對其中一個WAL檔案下 pg_waldump 的指令,像是 pg_waldump 000000010000000000000001 ,即可取得詳細的紀錄。

可以更清楚看到上面 BEGININSERT INTOCOMMIT 指令執行的過程,並且記錄了每一條指令的 LSN ,rmgr 也會標示每條 log 屬於那個種類,顯示這條 log 是 PostgreSQL 做了什麼操作。以下面範例來說,可以看到有 Transaction 的操作,因為 table 有建索引 ,而且是使用 Btree 這個演算法,所以也有 Btree 的操作。

使用 pg_stat_wal 統計 WAL 使用狀況

pg_stat_wal 可用來統計 WAL 的使用,提供 wal_recordswal_fpi、wal_byteswal_buffers_fullwal_write、wal_syncwal_write_timewal_sync_timestats_reset 等資訊。
wal_records 可以知道總共產生過幾條 logs,wal_bytes 可以知道這些 logs 佔的容量。如果想要知道 WAL 寫入或同步到硬碟的次數,可以查詢 wal_writewal_sync ,評估是否有寫入太頻繁的情況,太頻繁的寫入會影響資料庫的效能。

Reference:


上一篇
Day 24: 什麼是 Write-Ahead Logging (WAL)?
下一篇
Day 26: pgAdmin 的 EXPLAIN 工具介紹(上)
系列文
我所不知道的PostgreSQL 30天30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言