Sql-Server

在 SQL Server 中,檢查點對日誌緩衝區中的日誌記錄有什麼影響?

  • April 20, 2021

檢查點操作是否將日誌緩衝區中的所有內容刷新到日誌文件?或者只是與即將被刷新的髒頁相關的日誌記錄?我發現 SQL Server 行業的知名人士對此有一些不一致的描述。

來自 Kalen Delaney 的“Microsoft SQL Server 2012 Internals”:

檢查點操作還將正在進行的事務中的日誌記錄寫入磁碟,因為記憶體的日誌記錄也被認為是臟的。

“來自正在進行的事務”,是的,這是合理的,因為已送出事務的日誌記錄已寫入磁碟。所以這基本上意味著所有未刷新的日誌記錄都將被刷新。

來自 Itzik Ben-Gan 在https://sqlperformance.com/2018/11/sql-performance/understanding-log-buffer-flushes的“了解日誌緩衝區刷新” :

SQL Server 需要加固臟數據頁,例如在檢查點過程中,並且表示對這些頁的更改的日誌記錄尚未加固(預寫日誌記錄,簡稱 WAL)

臟頁對應的日誌緩衝區中的日誌記錄是否都是日誌緩衝區中未刷新的日誌記錄?我不知道。Itzik 的描述與 Kalen 的描述基本意思相同嗎?

我們可以實現一個 DBMS,這樣每個需要寫入日誌記錄的執行緒都會立即將其直接寫入磁碟並等待確認。這將是低效的,因為會有許多小的 IO 和許多執行緒在等待。每個執行緒寫入記憶體緩衝區並將該緩衝區作為單個大 IO 寫入磁碟更有效。所有寫日誌記錄的執行緒都添加到這個緩衝區,當它被寫入磁碟(即“刷新”或“硬化”)時,所有執行緒的所有日誌記錄都會被寫入。

那麼什麼時候必須刷新該緩衝區?強制性的三種情況

  1. 當事務送出時。
  2. 採取檢查點時。
  3. 當緩衝區滿時。

系統可以在它選擇的任何時間額外寫入緩衝區。這

在向客戶端發送送出確認之前,必須刷新日誌記錄,以滿足 ACID 的持久性保證。

檢查點將臟頁從緩衝池刷新到磁碟,無論臟頁的事務是否已送出。在故障後重新啟動時,DBMS 需要一種方法來確定對這些臟頁的哪些更改應該保留,哪些更改應該刪除。SQL Server 遵循 ARIES 恢復協議進行恢復,並且 ARIES 要求在刷新臟頁之前刷新預寫日誌。

自然地,緩衝區的大小必須是有限的,因此系統必須能夠在任何時候清空它。日誌包含除使用者數據更改之外的許多類型的記錄。ARIES 協議負責刷新日誌、刷新或未刷新緩衝池頁面以及已送出、未送出和回滾事務的各種組合。

您引用的作者說的是同一件事-必須先刷新日誌記錄,然後才能刷新相應的髒頁。這是先前連結的文件的迴聲

SQL Server 具有防止在寫入關聯的日誌記錄之前刷新臟頁的邏輯。

是的,他們似乎在說同樣的話。想像一個包含一些未送出修改的頁面,通過檢查點寫入磁碟。如果 sql 在檢查點後立即停止,我們需要能夠在啟動時回滾。我們如何回滾?我們需要將相應的日誌記錄也寫入磁碟。

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