預寫式日志(Write-Ahead Logging (WAL))


     SQL Server中使用了WAL(Write-Ahead Logging)技術來保證事務日志的ACID特性。而且大大減少了IO操作。

     WAL的核心思想是:在數據寫入到數據庫之前,先寫入到日志.再將日志記錄變更到存儲器中。

        SQL Server修改數據的步驟

     1.在SQL Server的緩沖區的日志中寫入”Begin Tran”記錄

     2.在SQL Server的緩沖區的日志頁寫入要修改的信息

     3.在SQL Server的緩沖區將要修改的數據寫入數據頁

     4.在SQL Server的緩沖區的日志中寫入”Commit”記錄

     5.將緩沖區的日志寫入日志文件

     6.發送確認信息到客戶端(SMSS,ODBC等)

     7.將緩沖區內的頁寫入到磁盤

     本篇着重介紹將緩沖區的數據頁寫入到磁盤的兩個過程:CheckPoint和Lazy Writer。
     當事務遇到Commit時,僅僅是將緩沖區的所有日志頁寫入磁盤中的日志文件;而直到Lazy Writer或CheckPoint時,才真正將緩沖區的數據頁寫入磁盤文件。

     CheckPoint:系統會按照恢復間隔 SQL Server 配置選項確定的間隔自動發出檢查點。 Checkpoint 方法會立即發出檢查點,而無論恢復間隔設置為何。

      這個CheckPoint的間隔是一個服務器級別的參數。可以通過sp_config進行配置,也可以在SSMS中進行配置:image

需要注意的是CHECKPOINT 權限預設會授予系統管理員 (sysadmin) 固定伺服器角色及 db_ownerdb_backupoperator 固定資料庫角色的成員,並不可加以轉讓。更短的恢復間歇意味這更短的恢復時間和更多的磁盤IO,而更長的恢復間歇則帶來更少的磁盤IO占用和更長的恢復時間.

checkpoint的觸發條件

1. 自上次檢查點后產生大量日志

2. 服務實例關閉

3. 數據庫完整備份或差異備份(日志備份不會觸發checkpoint)

4. 數據庫恢復模式為簡單恢復模式下當日志文件使用超過70%時

Lazy Writer:lazywriter是一個系統進程,其主要任務是成批刷新老化的臟緩沖區(指包含更改的緩沖區,這些更改必須寫回磁盤,才能使該緩沖區由其它頁重新使用),並使之可由用戶進程使用。

lazywriter的觸發條件

1. 緩存區內可用空閑緩存塊數據不足

2. Windows系統內存壓力

區別:

      Checkpoint目的是減少數據庫的恢復時間(服務奔潰或重啟服務后的恢復),而Lazy writer的目的是保證SQL OS 有空閑緩存塊和系統有一定可用內存。

      Checkpoint和LazyWriter都會將緩沖區內臟頁寫入到磁盤;

      LazyWriter會更新緩存區空閑可用列表,而checkpoint不會;

      Checkpoint操作會被記錄到數據庫日志中,而lazywriter不會;

      通過指定CheckPoint后的參數,SQL Server會按照這個時間來完成CheckPoint過程,如果時間指定的短,則SQL Server會使用更多的資源優先完成CheckPoint過程。

      通常情況下,將“臟”頁寫入磁盤的工作,Lazy Writer要做的比CheckPoint會多出許多。

總結

    本文簡單介紹了WAL的概念和最終實現數據實際修改的兩種方法。介紹了CheckPoint和Lazy Writer,同時對比了兩種方法的機制和觸發條件,這對我們將來進一步講解事務日志的基本原理和恢復機制提供了良好的基礎。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM