SQL Server日誌在簡單恢復模式下的角色

2021-09-21 12:05:14 字數 2894 閱讀 3303

在簡單恢復模式下,日誌檔案的作用僅僅是保證了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不允許在簡單恢復模式下備份日誌),下文會說明在簡單恢復模式下,為什麼日誌備份沒有意義。

簡單恢復模式(****** 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結束:

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

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

Sqlserver命令SQLCMD備份恢復資料庫

1,備份,建立指令碼bak.bat,內容 sqlcmd i f dbbak bak.sql 指令碼呼叫恢復的語句文字 connect backup database db1 to disk f dbbak db1.bak with init go 2,還原,建立還原指令碼restore.bat,內容...

mysql的告警日誌在哪 mysql日誌檔案在哪

本篇文章將介紹mysql中的幾種日誌檔案位置,如何能夠找到。查詢錯誤日誌檔案路徑 在mysql資料庫中,錯誤日誌功能是預設開啟的。並且,錯誤日誌無法被禁止。預設情況下,錯誤日誌儲存在mysql資料庫的資料檔案中。錯誤日誌檔案通常的名稱為hostname.err。其中,hostname表示伺服器主機名...

python獲取日誌 在Python中獲取日誌

不,您不能同時從python和c登入到同乙個檔案。可能是因為多個寫日誌的人沒有把日誌記錄在一起。在 如果您不擁有c dll,那麼您可能會走運,除非它允許您從c 程式配置日誌檔案 級別,否則python無法解決它。但是,如果您控制源 並且可以構建乙個新的dll,請考慮更改c 類以允許您傳入乙個委託 l...