天天看點

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語句進行配置:

SQL Server日志在簡單恢複模式下的角色

  簡單恢複模式下日志的空間使用

  在本系列文章的第一篇文章提到過,日志檔案會劃分成多個VLF進行管理,在邏輯上記錄是線性的,給每個記錄一個順序的,唯一的LSN。

  而在簡單恢複模式下,為了保證事務的持久性,那些有可能復原的資料會被寫入日志。這些日志需要被暫時儲存在日志以確定在特定條件下事務可以順利復原。這就涉及到了一個概念—最小恢複LSN(Minimum Recovery LSN(MinLSN) )

  MinLsn是在還未結束的事務記錄在日志中最小的LSN号,MinLSN是下列三者之一的最小值:

  ·CheckPoint的開始LSN

  ·還未結束的事務在日志的最小LSN

  ·尚未傳遞給分發資料庫的最早的複制事務起點的 LSN.

  下圖是一個日志的片段:

SQL Server日志在簡單恢複模式下的角色

(圖檔摘自MSDN)

  可以看到,最新的LSN是148,147是CheckPoint,在這個CheckPoint之前事務1已經完成,而事務2還未完成,是以對應的MinLSN應該是事務2的開始,也就是142.

  而從MinLSN到日志的邏輯結尾處,則稱為活動日志(Active Log)。

  而活動日志分布在實體VLF上的關系可以用下圖表示:

SQL Server日志在簡單恢複模式下的角色

  是以,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是不活動的,并且還未被使用過

  概念如下圖:

SQL Server日志在簡單恢複模式下的角色

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

  在日志達到日志檔案(ldf檔案)末尾時,也就是上圖的VLF8時,會重新循環到VLF1開始,以便讓空間進行重複利用.是以日志雖然可以從實體順序上是從VLF1到VLF8,但邏輯順序可以是從VLF6開始到VLF2結束:

SQL Server日志在簡單恢複模式下的角色

  是以可以看出,簡單恢複模式下日志是不儲存的(當事務結束後,相關的會被截斷)。僅僅是用于保證事務復原和崩潰恢複的用途.是以備份日志也就無從談起,更不能利用日志來恢複資料庫。

  總結

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

本文轉自 wws5201985 51CTO部落格,原文連結:http://blog.51cto.com/wws5201985/798095,如需轉載請自行聯系原作者