本篇文章是系列文章中的第三篇,前兩篇的地址如下:
淺談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是下列三者之一的最小值:
是一個日誌的片段:
(圖片摘自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結束:
因此可以看出,簡單復原模式下日誌是不儲存的(當事務結束後,相關的會被截斷)。僅僅是用於保證交易回復和崩潰恢複的用途.所以備份日誌也就無從談起,更不能利用日誌來恢複資料庫。
總結
本文介紹了簡單復原模式下日誌的原理,並簡單的引出了一些備份或者恢複資料的基礎。而實際上,除了在開發或測試環境下。使用簡單復原模式的情境並不多,因為在現實生活中,在生產環境允許幾個小時的資料丟失的情境幾乎沒有.下篇文章將會講述在完整復原模式下,日誌的作用。