簡介
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號,還有其對應事務的事務日誌:
一個簡單的圖片示例如下:
許多型別的操作都記錄在事務日誌中。這些操作包括:
-
每個事務的開始和結束。
-
每次資料修改(插入、更新或刪除)。這包括系統儲存過程或資料定義語言 (DDL) 語句對包括系統表在內的任何表所做的更改。
-
每次分配或釋放區和頁。
-
建立或刪除表或索引。
對於LSN如何在ROLLBACK或者是ROLL FORWARD中以及在備份恢復過程中起作用,會在後續文章中提到
總結
本篇文章從事務日誌的邏輯和物理構架簡單介紹了事務日誌的構成.這是理解SQL Server如何利用日誌保證永續性和資料備份恢復的基礎。下一篇文章將會介紹SQL Server在操作中會如何使用到日誌檔案。