淺談SQL Server中的事務日志(一)----事務日志的物理和邏輯構架
簡介
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在操作中會如何使用到日志文件。










浙公網安備 33010602011771號