1. 程式人生 > >(2.6)備份與還原--在簡單恢復模式下事務日誌的角色

(2.6)備份與還原--在簡單恢復模式下事務日誌的角色

除了 空間 ble 暫時 cover recovery html AC truncated

簡介

在簡單恢復模式下,日誌文件的作用僅僅是保證了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的狀態分為以下四類:

  1. 活動(Active) –在VLF 上存儲的任意一條LSN是活動的時,則VLF則為活動狀態,即使一個200M的VLF只包含了一條LSN,如上圖的VLF3
  2. 可恢復(Recoverable) – VLF是不活動的,VLF上不包含活動LSN,但還未被截斷(truncated)
  3. 可重用(Reusable) – VLF是不活動的,VLF上不包含活動LSN,已經被截斷(truncated),可以重用
  4. 未使用(Unused) – VLF是不活動的,並且還未被使用過

概念如下圖:

技術分享圖片

而所謂的截斷(truncated)只是將可恢復狀態的VLF轉換到可重用狀態。在簡單恢復模式下,每一次CheckPoint,都會去檢查是否有日誌可以截斷.如果有inactive的VLF時,CheckPoint都會將可截斷部分進行截斷,並將MinLSN向後推.

在日誌達到日誌文件(ldf文件)末尾時,也就是上圖的VLF8時,會重新循環到VLF1開始,以便讓空間進行重復利用.所以日誌雖然可以從物理順序上是從VLF1到VLF8,但邏輯順序可以是從VLF6開始到VLF2結束:

技術分享圖片

因此可以看出,簡單恢復模式下日誌是不保存的(當事務結束後,相關的會被截斷)。僅僅是用於保證事務回滾和崩潰恢復的用途.所以備份日誌也就無從談起,更不能利用日誌來恢復數據庫。

總結

本文介紹了簡單恢復模式下日誌的原理,並簡單的引出了一些備份或者恢復數據的基礎。而實際上,除了在開發或測試環境下。使用簡單恢復模式的場景並不多,因為在現實生活中,在生產環境允許幾個小時的數據丟失的場景幾乎沒有.下篇文章將會講述在完整恢復模式下,日誌的作用。

轉自:http://www.cnblogs.com/CareySon/archive/2012/02/17/2355200.html

(2.6)備份與還原--在簡單恢復模式下事務日誌的角色