資料庫事務日誌碎片原理分析與方案 分析篇

2021-09-08 08:56:02 字數 3008 閱讀 6901

前言:對於log日誌檔案,相信大家都應該非常的熟悉了,log日誌檔案的優化是效能調優和故障排除中的乙個老大難。

在優化的過程中,常常有人說」把log日誌放在單獨的磁碟上面,並且將其自動增長禁止,並且把大小設定的和磁碟大小接近,可以提高效能「,確實,這句話看起來很對,但是最後發現似乎又不太對。

通過研究和學習,也看了一些國外社群的文章,發布此文。

一般而言,我們都沒有必要去關心事務日誌中的虛擬日誌檔案的個數。這裡提到的「虛擬日誌檔案」的概念,我們後面會進行專門的講述。很多的時候,我們在建立資料庫的時候,都採用了它的預設配置,即:將日誌的增長方式設定為「自動增長」,這樣會直接導致乙個後果就是「檔案碎片」,從而直接導致整個資料庫的效能嚴重下降。那麼,如何避免這種情況?如何識別碎片問題?如何解決問題?這就是我們本篇文章要講述的內容了。

首先,我們來看看什麼是「虛擬日誌檔案」。

我們知道,在正常的資料庫操作中,

sql server

會以順序的方式去寫日誌檔案,記錄

dll和

dml的操作的詳細資訊。每乙個日誌記錄都有乙個與之相關的邏輯序列號(

lsn)。這些

lsn處於不斷增長的狀態,這就是說

lsn2

的日誌記錄所代表的操作在

lsn1

之後進行。並且最近新增的日誌記錄的

lsn號碼最大。

在sql server

內部,sql server

將日誌檔案的空間劃分為很多不同的「塊」,也稱之為「虛擬日誌檔案」(

vlf)。看看到下面的乙個圖:

sql server

首先將會把事務的詳細資訊記錄到第乙個可用的

vlf中,此時也就是寫到

vlf1

中。並且,在寫的過程中,日誌記錄是按照順序寫入的,也就是說首先會寫滿

vlf1

,然後寫

vlf2

,以此類推。如果最後全部的

vlf都寫滿了之後,日誌會迴圈寫入,也就說,日誌會再在寫入

vlf1

中,將vlf1

中之前的日誌記錄覆蓋,當然,這個寫入是有條件的,即:只有在

vlf1

是可重用的情況下才能寫入。

到這裡,大家可能會有很多的問題,其中乙個就是:如何知道

vlf1

現在是否可被重用。先不急,接著看。

上面的圖描述了乙個簡單的場景:乙個事務t1,

t3已經提交,而t2,

t4處於執行狀態,並且在

lsn10

的地方執行乙個

checkpoint

操作。現在我們的有4個

vlf檔案,每乙個

vlf中都包含了

4個事物日誌記錄。這些日誌記錄包含了四個事務的詳細資訊。在圖中,

lsn1

表明這個事務

t1開始的點,

lsn2

記錄t1

事務執行的乙個

update

操作的詳細資訊,

lsn3

記錄了t1

事務執行了

commit

操作,lsn4

,又是另外乙個事務

t2開始的點,以此類推。

注意:完全可以存在乙個事務的日誌記錄跨越多個

vlf,道理很簡單,大家自己想想

。從上面的圖中可以看出,現在存在

2個活動的事務(t2,

t4)。而

lsn4

是最先活動事務

t2的開始點。

在圖中還有乙個所謂的

minlsn

,就是最先開始的一條活動的日誌記錄。執行

checkpoint

的地方是

maxlsn

,就是活動日誌最後的點,因為後面還沒有寫入新的日誌記錄。其實所謂的活動日誌,主要是因為這些日誌有可能被用來執行回滾操作。

在這裡朋友們可能就要問了:在上圖中,t3

中的事務不是已經提交了嗎,應該不屬於活動日誌啊

?確實,原本應該是這樣的,但是在

t3之後,又開始了

t4,而且還沒有提交,從而使得

t3處於沒有提交的事務t2和

t4之間,導致這一連串的都成為「活動的「。我們再把問題延伸一下:如果在

lsn10

後面又開始了新的事務,而且

t2事務還沒有提交,那麼會導致活動日誌的範圍變得更大。所以希望這裡大家可以明白我的意思。

包含有活動日誌的

vlf就是處於活動的狀態,圖中的

vlf1-3

都是活動的,如果

vlf是活動的,那麼就不能被重用。什麼意思呢

我們現在試想一下:如果

t2事務一直提交,而新的事務不斷的在開啟,那麼最後的結果就是

vlf1-4

中都包含活動日誌,使得所以的

vlf都是活動的,如果

vlf4

已經空間寫完,此時資料庫發現它不能迴圈的寫入,即不能再從

vlf1

開始寫,因為

vlf1

是活動的,這個時候,資料庫就分配新的空間,分配新的

vlf,然後再寫入。試想,如果總是這樣,那麼,勢必會導致檔案碎片。所以這也是為什麼避免事務執行時間過長的原因之一。

在上圖中,此時活動日誌包含在

vlf4

中,而vlf1-3

都是非活動的

,所以如果日誌不斷寫入導致

vfl4

寫滿,此時日誌會再次寫入

vlf1

,然後是

vlf2

,以此類推!

今天就到這,明天開始講述與日誌相關的效能與設定問題。

【資料庫事務日誌碎片原理分析與方案】-深入解析篇

負載均衡詳解第一篇:負載均衡的需求.pdf

C 資料庫事務原理

隔離級別的概念 企業級的資料庫每一秒鐘都可能應付成千上萬的併發訪問,因而帶來了併發控制的問題。由資料庫理論可知,由於併發訪問,在不可預料的時刻可能引發如下幾個可以預料的問題 髒讀 包含未提交資料的讀取。例如,事務1 更改了某行。事務2 在事務1 提交更改之前讀取已更改的行。如果事務1 回滾更改,則事...

資料庫事務隔離級別與實現原理

1 原子性 atomic 指的是事物所有的操作要麼全做 要麼全不做。2 一致性 consistency 事物應該確認資料庫從乙個一致狀態轉變為另乙個一致狀態。資料庫中的資料應滿足完整性約束 3 隔離性 isolation 指的是多個事物併發執行的時候 乙個事物的執行不應當影響到其它的事物 即事物與事...

檢視資料庫事務日誌檔案

dbcc log type 引數 dbid or dbname 任一資料庫的id或名字 type 輸出結果的型別 0 最少資訊 operation,context,transaction id 1 更多資訊 plus flags,tags,row length 2 非常詳細的資訊 plus obje...