Postgresql

postgres WAL 文件中 LSN 的排序

  • September 17, 2021

debezium 的原始碼中有一條神秘的註釋,它說 LSN 不需要在 WAL 文件中排序。這怎麼可能?如果 LSN 表示 WAL 中的字節偏移量,怎麼能不排序呢?在我們討論的時候,有人可以準確地解釋 XLOG 記錄是如何在並發事務期間寫入的嗎?例如,tx1 送出,並且 tx1 的 XLOG 記錄正在寫入 WAL。現在 tx2 送出,因此 tx2 的 XLOG 記錄將與 tx1 的 XLOG 記錄混合。例如,以下順序是否可行?

tx1_begin, tx2_begin, tx1_xlog1, tx2_xlog1, tx1_commit, tx2_commit

是的,你引用的評論很神秘。您的評估是正確的——LSN 只是 WAL 中的一個位置。

來自不同事務的 XLOG 記錄可以自由混合;當它們發生時,它們會被記錄下來。WAL 不是在送出時寫入,而是在數據修改語句發生時寫入。在送出時寫入的唯一 WAL 記錄是一條COMMIT記錄,並且 WAL 被刷新到磁碟。

在恢復期間,每個 WAL 條目都會立即重播。在 PostgreSQL 中沒有真正的回滾:如果一個事務被中止,該資訊將保留在送出日誌中,並且該事務添加的數據變得不可見。

引用自:https://dba.stackexchange.com/questions/299722