本篇文章是系列文章中的第三篇,前兩篇的地址如下:
淺談SQL Server中的事務日志(一)----事務日志的物理和邏輯構架
淺談SQL Server中的事務日志(二)----事務日志在修改數據時的角色
簡介
在簡單恢復模式下,日志文件的作用僅僅是保證了SQL Server事務的ACID屬性。並不承擔具體的恢復數據的角色。正如”簡單”這個詞的字面意思一樣,數據的備份和恢復僅僅是依賴於手動備份和恢復.在開始文章之前,首先要了解SQL Server提供的幾種不同備份類型。
SQL Server提供的幾種備份類型
SQL Server所提供的幾種備份類型基本可以分為以下三種(文件和文件組備份以及部分備份不在本文討論之列):
1.完整(Full)備份:直接將所備份的數據的所有區(Extent)進行復制。這里值得注意的有2點:
- 完整備份並不像其名字“完整”那樣備份所有部分,而是僅備份數據庫本身,而不備份日志(雖然僅僅備份少量日志用於同步)
- 完整備份在備份期間,數據庫是可用的。完整備份會記錄開始備份時的MinLSN號,結束備份時的LSN號,將這個區間的日志進行備份,在恢復時應用到被恢復的數據庫(這里經過修改,感謝魔君六道指出)
2.差異(Differential)備份:只備份上次完整備份后,做修改的部分。備份單位是區(Extent)。意味着某個區內即使只有一頁做了變動,則在差異備份里會被體現.差異備份依靠一個BitMap進行維護,一個Bit對應一個區,自上次完整備份后,被修改的區會被置為1,而BitMap中被置為1對應的區會被差異備份所備份。而到下一次完整備份后,BitMap中所有的Bit都會被重置為0。
3.日志(Log)備份:僅僅備份自上次完整備份或日志備份之后的記錄。在簡單模式下,日志備份毫無意義(SQL Server不允許在簡單恢復模式下備份日志),下文會說明在簡單恢復模式下,為什么日志備份沒有意義。
簡單恢復模式(Simple Recovery Mode)
在簡單恢復模式下,日志僅僅是為了保證SQL Server事務的ACID。並沒有恢復數據的功能.
比如,我們有一個備份計划,如下:
我們在每周一0點做一次完整備份,在周三0點和周五0點分別做差異備份。在簡單恢復模式下,如果周六數據庫崩潰。我們的恢復計划只有根據周一0點的做的完整備份恢復后,再利用周五0點的差異備份進行恢復.而周五0點之后到服務器崩潰期間所有的數據將會丟失。
正如”簡單”這個詞所涵蓋的意思,在簡單恢復模式下,日志可以完全不用管理。而備份和恢復完全依賴於我們自己的完整和差異備份.
恢復模式是一個數據庫級別的參數,可以通過在SSMS里或通過SQL語句進行配置:
簡單恢復模式下日志的空間使用
在本系列文章的第一篇文章提到過,日志文件會划分成多個VLF進行管理,在邏輯上記錄是線性的,給每個記錄一個順序的,唯一的LSN。
而在簡單恢復模式下,為了保證事務的持久性,那些有可能回滾的數據會被寫入日志。這些日志需要被暫時保存在日志以確保在特定條件下事務可以順利回滾。這就涉及到了一個概念—最小恢復LSN(Minimum Recovery LSN(MinLSN) )
MinLsn是在還未結束的事務記錄在日志中最小的LSN號,MinLSN是下列三者之一的最小值:
-
CheckPoint的開始LSN
-
還未結束的事務在日志的最小LSN
-
尚未傳遞給分發數據庫的最早的復制事務起點的 LSN.
下圖是一個日志的片段:
(圖片摘自MSDN)
可以看到,最新的LSN是148,147是CheckPoint,在這個CheckPoint之前事務1已經完成,而事務2還未完成,所以對應的MinLSN應該是事務2的開始,也就是142.
而從MinLSN到日志的邏輯結尾處,則稱為活動日志(Active Log)。
而活動日志分布在物理VLF上的關系可以用下圖表示:
因此,VLF的狀態是源自其上所含有的LSN的狀態,可以分為兩大類:活動VLF和不活動VLF
而更加細分可以將VLF的狀態分為以下四類:
- 活動(Active) –在VLF 上存儲的任意一條LSN是活動的時,則VLF則為活動狀態,即使一個200M的VLF只包含了一條LSN,如上圖的VLF3
- 可恢復(Recoverable) – VLF是不活動的,VLF上不包含活動LSN,但還未被截斷(truncated)
- 可重用(Reusable) – VLF是不活動的,VLF上不包含活動LSN,已經被截斷(truncated),可以重用
- 未使用(Unused) – VLF是不活動的,並且還未被使用過
概念如下圖:
而所謂的截斷(truncated)只是將可恢復狀態的VLF轉換到可重用狀態。在簡單恢復模式下,每一次CheckPoint,都會去檢查是否有日志可以截斷.如果有inactive的VLF時,CheckPoint都會將可截斷部分進行截斷,並將MinLSN向后推.
在日志達到日志文件(ldf文件)末尾時,也就是上圖的VLF8時,會重新循環到VLF1開始,以便讓空間進行重復利用.所以日志雖然可以從物理順序上是從VLF1到VLF8,但邏輯順序可以是從VLF6開始到VLF2結束:
因此可以看出,簡單恢復模式下日志是不保存的(當事務結束后,相關的會被截斷)。僅僅是用於保證事務回滾和崩潰恢復的用途.所以備份日志也就無從談起,更不能利用日志來恢復數據庫。
總結
本文介紹了簡單恢復模式下日志的原理,並簡單的引出了一些備份或者恢復數據的基礎。而實際上,除了在開發或測試環境下。使用簡單恢復模式的場景並不多,因為在現實生活中,在生產環境允許幾個小時的數據丟失的場景幾乎沒有.下篇文章將會講述在完整恢復模式下,日志的作用。