PostgreSQL 18「瞬間複製資料庫」實測:讀後筆記與深度解析

本篇文章更新時間:2025/12/24
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣新台幣 贊助支持。


PostgreSQL 18 的瞬間資料庫克隆:用 Copy-on-Write 實現真正的零成本複製

編輯前言:這篇文章來自 boringSQL 的 Instant database clones with PostgreSQL 18,它拆解了 PostgreSQL 18 如何透過檔案系統層級的 clone 技術,讓資料庫複製速度從「數十秒」變成「兩百毫秒」。如果你做過大型資料庫 migration 或測試環境建立,這篇值得一讀。

核心觀點 (Key Takeaways)

  • PostgreSQL 18 讓 CREATE DATABASE 可透過 FILE_COPY + clone 實現「零拷貝」複製,大幅加快速度。
  • clone 的秘密來自現代檔案系統(XFS、ZFS、APFS)提供的 Copy-on-Write(CoW)能力。
  • 零拷貝並非零成本,只要你開始寫入資料,檔案系統會逐頁拆離,兩份資料庫就會逐漸分叉。

深入解析

這篇文章從 PostgreSQL 的模板機制講起。一般我們執行:

CREATE DATABASE mydb;

其實 PostgreSQL 會悄悄從 template1 複製一份資料庫出來。作者提醒,這套模板系統本身就具備「複製能力」,只是大家平常用到的都是預設的 template1。

1. STRATEGY 參數與 PostgreSQL 15 的轉變

PostgreSQL 15 開始新增 CREATE DATABASE ... STRATEGY,預設值改成 WALLOG。WAL 方式的好處是避免過去 FILECOPY 需要 CHECKPOINT 所造成的 I/O 峰值(俗稱 checkpoint storm)。代價是速度變慢——尤其是當模板資料庫很大時。

文章內的例子很直接:複製 6GB 的資料庫,用 WAL_LOG 需要 67 秒。

2. PostgreSQL 18 的新武器 filecopymethod = clone

PostgreSQL 18 允許改變 FILE_COPY 底層真正用哪種方法來複製檔案:

filecopymethod = clone

如果底層檔案系統支援 Copy-on-Write(像 XFS、ZFS、APFS),那麼檔案會透過 metadata 指向同一批 block,等你真正寫入資料時才觸發分離。

作者示範把 file_copy_method 設為 clone,再執行 FILE_COPY,結果速度從剛剛的 67 秒降到僅僅 212 毫秒。

CREATE DATABASE fastclone TEMPLATE sourcedb STRATEGY=FILE_COPY;
Time: 212 ms

這基本上就是 LVM snapshot、ZFS clone 的 PostgreSQL 版。

3. clone 後到底怎麼運作?

clone 並不是把資料複製了一份,而是兩個資料庫實際上共享同樣的實體 blocks。

作者引用 XFS 的 filefrag 輸出,兩份資料庫檔案的 extents 對應到同一段 physical offset,且標記為 shared。

然而只要一做 UPDATE,就會造成 Copy-on-Write:

  • 舊 tuple 所在的 page
  • 新 tuple 被寫入的 page
  • 可能需要更新的 index page
  • 相關的 FSM / visibility map

都會生成新的 block,讓兩份資料庫逐漸不再共享儲存空間。

這就是 CoW 的核心邏輯:只有寫入動作才會造成成本。

筆者心得與啟發

這篇文章最讓我有感的,不只是技術上的提速,而是「讓資料庫複製變成一個幾乎零成本的操作」所代表的可能性。

我在閱讀時一直想到兩個情境:

  • 開發環境需要不斷 reset 資料庫狀態
  • 寫 E2E 測試時想要為每條測試建立乾淨 DB snapshot

過去這種需求往往靠 pg_dump + restore 解決,但當資料庫大到百 MB / GB,成本就爆炸。現在,看起來 PostgreSQL 18 讓這件事重新變得可行,而且快得不可思議。

當然,文章也提醒我們不能忽略限制:

  • clone 時來源資料庫不能有任何 active connection
  • 多 tablespace 跨多個 mount point 無法使用 clone
  • 雲端託管服務通常不給你底層檔案系統權限

實務上,我覺得最能落地的場景,是在自主管理的 VM 或裸機環境中建立「template DB」,一旦需要專屬的 ephemeral DB,瞬間複製即可。

總結來說,PostgreSQL 18 給開發者與 DBA 帶來的,不只是複製技術的加速,而是整個資料庫工作流程的革新。我會很期待接下來社群圍繞這項能力做出的工具與最佳實踐。


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____36%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Apply Filters
Mastodon