簡介
SQL Server中的交易記錄無疑是SQL Server中最重要的部分之一。因為SQL SERVER利用交易記錄來確保持久性(Durability)和交易回復(Rollback)。從而還部分確保了事務的ACID屬性.在SQL Server崩潰時,DBA還可以通過交易記錄將資料恢複到指定的時間點。當SQL Server運轉良好時,多瞭解一些交易記錄的原理和概念顯得並不是那麼重要。但是,一旦SQL SERVER發生崩潰時,瞭解交易記錄的原理和概念對於快速做出正確的決策來恢複資料顯得尤為重要.本系列文章將會從交易記錄的概念,原理,SQL Server如何使用日誌來確保持久性屬性等方面來談SQL Server的交易記錄.
交易記錄的物理組織構架
交易記錄僅僅是記錄與其對應資料庫上的事務行為和對資料庫修改的記錄檔.在你建立資料庫時,伴隨著資料庫檔案,會有一個預設以ldf為副檔名的交易記錄檔. 當然,一個資料庫也可以配有多個記錄檔,但是在邏輯上,他們可以看成一個.
在SQL Server對於記錄檔的管理,是將邏輯上一個ldf檔案劃分成多個邏輯上的虛擬記錄檔(virtual log files,簡稱VLFs).以便於管理。用個類比方法來看,記錄檔(ldf)好比一趟火車,每一節車廂都是一個虛擬記錄檔(VLFs):
那為什麼SQL Server要把記錄檔劃分出多個VLFS呢?因為SQL Server通過這種方式使得儲存引擎管理交易記錄更加有效.並且對於日誌空間的重複利用也會更加高效。使用VLF作為收縮資料庫的最小單位比使用ldf檔案作為最小單位無疑是更加高效的.
VLFS的個數和大小無法通過配置進行設定,而是由SQL Server進行管理.當Create或Alter資料庫時,SQL Server通過ldf檔案的大小來決定VLFS的大小和數量。在記錄檔增長時,SQL Server也會重新規劃VLFS的數量.
注意:根據這個原理不難看書,如果設定記錄檔的增量過小,則會產生過多的VLFS,也就是記錄檔片段,過多的記錄檔片段會拖累SQL Server效能.
SQL Server建立資料庫時,根據記錄檔(ldf)的大小,產生VLF的數量公式如下:
ldf檔案的大小 |
VLF的數量 |
1M到64M |
4 |
64M到1GB |
8 |
大於1GB |
16 |
下面我們來看一個例子:
建立資料庫,指定日誌大小為65M
通過DBCC,我們可以看到,對應的有8個VLFs:
再次建立資料庫,指定日誌初始大小為28M:
可以看到,對應的,VLF的數量變為4:
而對於記錄檔的增長,SQL Server使用了和建立資料庫時相同的公式,也就是每次增長比如為2M,則按照公式每次增長4個VLFs.
我們建立一個TestGrow資料庫,指定記錄檔為2M,此時有4個VLFS:
當我們增長2M時,這個2M則是按照公式,再次分配4個VLFs:
此時,這時能看到的VLFs數量應該為4+4=8個:
由此可以看出,指定合適的記錄檔初始大小和增長,是減少日誌片段最關鍵的部分.
交易記錄的邏輯組織構架
當針對資料庫物件所做的任何修改儲存到資料庫之前,相應的日誌首先會被記錄到記錄檔。這個記錄會被按照先後順序記錄到記錄檔的邏輯末尾,並分配一個全域唯一的記錄序號(log sequence number,簡稱LSN),這個序號完全是按照順序來的,如果日誌中兩個序號LSN2>LSN1,則說明LSN2所在LSN1之後發生的.
由此可以看出,將記錄檔分為多個檔案除了磁碟空間的考慮之外。完全不會像資料那樣可以並行訪問,所以將記錄檔分為多個完全不會有效能上的提升.
LSN號可以看作是將記錄檔和其記錄資料之間的紐帶.每一條日誌不僅有LSN號,還有其對應事務的交易記錄:
一個簡單的圖片樣本如下:
許多類型的操作都記錄在交易記錄中。這些操作包括:
對於LSN如何在ROLLBACK或者是ROLL FORWARD中以及在備份恢複過程中起作用,會在後續文章中提到
總結
本篇文章從交易記錄的邏輯和物理構架簡單介紹了交易記錄的構成.這是理解SQL Server如何利用日誌保證持久性和資料備份恢複的基礎。下一篇文章將會介紹SQL Server在操作中會如何使用到記錄檔。