SQL Server 2012笔记分享-29:日志文件的工作方式
預寫日志 (WAL)
SQL Server 使用預寫日志 (WAL),此日志確保在將關聯的日志記錄寫入磁盤后再將數據修改寫入磁盤。這維護了事務的 ACID 屬性。
SQL Server 維護當必須檢索數據時,將數據頁讀入的緩沖區高速緩存。數據修改不是直接在磁盤上進行,而是修改高速緩沖存儲器中的頁副本。直到數據庫中出現檢查點,或者必須將修改寫入磁盤才能使用緩沖區來容納新頁時,才將修改寫入磁盤。將修改后的數據頁從高速緩沖存儲器寫入磁盤的操作稱為刷新頁。在高速緩存中修改但尚未寫入磁盤的頁稱為“臟頁”。
對緩沖區中的頁進行修改時,將在記錄修改的日志高速緩存中生成一條日志記錄。在將關聯的臟頁從高速緩沖存儲器刷新到磁盤之前,必須將這條日志記錄寫入磁盤。如果在寫入日志記錄前刷新臟頁,則該臟頁便會在磁盤上創建修改。如果服務器在將日志記錄寫入磁盤前失敗,則不能回滾此修改。SQL Server 具有防止在寫入關聯的日志記錄前刷新臟頁的邏輯。日志記錄將在提交事務時寫入磁盤。
注意:
某些 IDE SATA 驅動器在將數據寫入磁盤之前將數據寫入緩存在內部內存中。這樣會導致預寫日志無法正確工作。如果正在運行 SQL Server 的計算機使用這些磁盤類型之一,則應啟用 enable_force_flush 選項。
=======================================================================
日志文件的I/O是順序I/O,所以創建多個日志文件是沒有意義的。
當針對數據庫對象所做的任何修改保存到數據庫之前,相應的日志首先會被記錄到日志文件。這個記錄會被按照先后順序記錄到日志文件的邏輯末尾,并分配一個全局唯一的日志序列號(log sequence number,簡稱LSN),這個序列號完全是按照順序來的,如果日志中兩個序列號LSN2>LSN1,則說明LSN2所在LSN1之后發生的.
由此可以看出,將日志文件分為多個文件除了磁盤空間的考慮之外。完全不會像數據那樣可以并行訪問,所以將日志文件分為多個完全不會有性能上的提升.
LSN號可以看作是將日志文件和其記錄數據之間的紐帶.每一條日志不僅有LSN號,還有其對應事務的事務日志:
參考:http://www.360doc.com/content/14/0619/11/18247611_388004580.shtml
=======================================================================
日志序列號 (LSN)
SQL Server 事務日志中的每個記錄都由一個日志序列號 (LSN) 唯一標識。LSN 是這樣排序的:如果 LSN2 大于 LSN1,則 LSN2 所標識的日志記錄描述的更改發生在日志記錄 LSN1 描述的更改之后。
發生重大事件的日志記錄的 LSN 對于構造正確的還原順序可能很有用。因為 LSN 是有順序的,所以可以比較它們是否相等(即 <、>、=、<=、>=)。構造還原順序時,這種比較很有用。
LSN 是數據類型為 numeric 的值 (25,0)。算術運算(例如加法或減法)對 LSN 沒有任何意義,請不要與 LSN 一起使用。
RESTORE 順序期間,在內部使用 LSN 跟蹤數據還原到的時間點。還原備份后,數據被還原到與進行備份的時間點相對應的 LSN。差異和日志備份將還原的數據庫推到稍后的時間,該時間與一個更高的 LSN 相對應。
日志備份 B 中出現的日志記錄 n,在日志備份 A 中記錄為 last_lsn,在日志備份 B 中記錄為 first_lsn。
日志備份 A 的 last_lsn 等于日志備份 B 的 first_lsn
=======================================================================
虛擬日志文件(VLF)
SQL Server 數據庫引擎在內部將每一物理日志文件分成多個虛擬日志文件。虛擬日志文件沒有固定大小,且物理日志文件所包含的虛擬日志文件數不固定。數據庫引擎在創建或擴展日志文件時動態選擇虛擬日志文件的大小。數據庫引擎嘗試維護少量的虛擬文件。在擴展日志文件后,虛擬文件的大小是現有日志大小和新文件增量大小之和。管理員不能配置或設置虛擬日志文件的大小或數量。
只有當日志文件使用較小的 size 和 growth_increment 值定義時,虛擬日志文件才會影響系統性能。如果這些日志文件由于許多微小增量而增長到很大,則它們將具有很多虛擬日志文件。這會降低數據庫啟動以及日志備份和還原操作的速度。建議您為日志文件分配一個接近于最終所需大小的 size 值,并且還要分配一個相對較大的 growth_increment 值。
在SQL Server對于日志文件的管理,是將邏輯上一個ldf文件劃分成多個邏輯上的虛擬日志文件(virtual log files,簡稱VLFs).以便于管理。那為什么SQL Server要把日志文件劃分出多個VLFS呢?因為SQL Server通過這種方式使得存儲引擎管理事務日志更加有效.并且對于日志空間的重復利用也會更加高效。使用VLF作為收縮數據庫的最小單位比使用ldf文件作為最小單位無疑是更加高效的。
=======================================================================
Checkpoint
檢查點的作用:控制內存緩沖區的數據寫入到磁盤,當數據庫宕機之后,我們可以利用更少的時間去恢復,數據庫需要redo的時間就更少。checkpoint默認的時間間隔是1分鐘;checkpoint控制數據從內存寫入到磁盤的時間間隔,設置的時間越短,則數據庫恢復的越快。
CheckPoint會將所有緩沖區的臟頁寫入磁盤,不管臟頁中的數據是否已經Commit。這意味著有可能已經寫入磁盤的“臟頁”會在之后回滾(RollBack).不過不用擔心,如果數據回滾,SQL Server會將緩沖區內的頁再次修改,并寫入磁盤。
通過CheckPoint的運作機制可以看出,CheckPoint的間歇(Recovery Interval)長短有可能會對性能產生影響。這個CheckPoint的間歇是一個服務器級別的參數。可以通過sp_config進行配置,也可以在SSMS中進行配置。
=======================================================================
TARGET_RECOVERY_TIME和”recovery interval”
參考:http://543925535.blog.51cto.com/639838/1424306
=======================================================================
sys.database的log_reuse_wait/log_reuse_wait_desc列
? ?
log_reuse_wait
log_reuse_wait_desc
正確響應已滿事務日志在某種程度上取決于導致日志已滿的情況。若要在給定情況下查找阻止日志截斷的原因,請使用 sys.database 目錄視圖的 log_reuse_wait 列和 log_reuse_wait_desc 列。
=============================================================
2014年6.27日補充
大多數情況下,日志文件分配的空間大概為數據文件的20%左右就夠了;數據文件和日志文件分開存放(如果底層存儲陣列做了RAID,數據存放本身就是打散放在多塊磁盤的,那么分開存放意義不大了);
默認的數據庫自動增長為1M,日志為10%,這不符合最佳實踐,頻繁擴充對I/O有影響,建議文件自動增長幅度設置為100-500M比較合適;
================================================================
總結
以上是生活随笔為你收集整理的SQL Server 2012笔记分享-29:日志文件的工作方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 管道和过滤器模式----POSA模式助记
- 下一篇: 《转》程序员必须知道的10大基础实用算法