Corruption
何時從預寫日誌 (WAL) 中刪除條目?
如果我理解正確,當使用者更新數據庫記錄並送出事務時,commit() 呼叫將阻塞,直到完成以下步驟:
- 數據庫在預寫日誌 (WAL)中記錄更改。
- 數據庫更新實際記錄。
- 數據庫刪除 WAL 條目。
我對 WAL 有以下疑問:
- 數據庫何時知道從 WAL 中刪除條目是安全的?
- WAL 是否意味著將記錄寫入磁碟兩次(一次在 WAL 中,一次在數據庫文件中)?
- Postgres聲稱 WAL“顯著減少了磁碟寫入次數,因為只有日誌文件需要刷新到磁碟”但是(回到問題 #1)在從沃爾?
首先,很好地嘗試了解 WAL 的工作原理。它經常被誤解,但是當人們掌握了這個概念時,它就是理解數據庫的真正燈泡時刻。
我們需要重新描述您對送出事務發生的步驟的描述:
- 數據庫在預寫日誌 (WAL) 中記錄更改。
- 數據庫更新記憶體中的記錄。
就是這樣,我們完成了,事務已送出。記憶體中的記錄被修改,修改內容的詳細資訊儲存在日誌中,無需將每條記錄更改硬化到物理磁碟。
關於你的問題:
數據庫何時知道從 WAL 中刪除條目是安全的?
一種簡單的解釋是,一旦將修改的數據庫記錄刷新到磁碟,就不需要日誌條目。何時發生這種情況取決於多種因素,這些因素因數據庫而異。例如,SQL Server 有一個可配置的恢復間隔,用於控制檢查點頻率(將更改的記錄刷新到磁碟的操作)。
WAL 是否意味著將記錄寫入磁碟兩次(一次在 WAL 中,一次在數據庫文件中)?
是的,有點,不,取決於你的觀點。更改記錄一次,修改將記錄到日誌中,當發生檢查點時,寫入磁碟。在檢查點之間更改記錄 15 次,日誌中記錄了 15 次更改,但修改後的記錄只會在下一個檢查點寫入磁碟一次。
Postgres 聲稱 WAL “顯著減少了磁碟寫入次數,因為只有日誌文件需要刷新到磁碟”但是(回到問題 #1)在從沃爾?
是的,但請參閱上文,了解 WAL 減少磁碟寫入的原因。