翻譯 在簡單的恢復模式下,為什麼日誌會持續增長

2021-06-09 11:29:41 字數 2665 閱讀 1119

說明:這篇blog的原文標題為:a race condition in the ****** recovery mode: why is my log autogrowing。其中,race condition 的字面意思為「競態條件」,感覺不怎麼通。但是,文中確確實實是在講由於sql server 的其它執行緒比較繁忙而導致checkpoint執行緒不能被及時的喚醒和完成工作而導致了日誌的增長。翻譯水平有限,大家多指教,謝謝。

譯文:「我的資料庫工作在簡單的恢復模式。不,我沒有任何巨大的、長時間執行後者用於複製的事務日誌,並且,我有足夠數量的vlfs迴圈使用,準確的說有250個vlfs。為什麼我的事務日誌會保持持續增長呢?」

正如sql server 聯機叢書所記載的一樣,當資料庫工作在簡單恢復模式的時候,在sql sever喚醒檢查點執行緒並執行的時候,它的事務日誌被截斷(即:所有的沒有包含任何活動事務記錄的虛擬日誌被標記為可重用),而檢查點執行緒在以下三種情況下會被喚醒,1.恢復的時間間隔閾值被足夠多的日誌記錄超過。2.你手工執行了checkpoint命令。3.事物日誌已經達到了70%滿。

即使沒有任何大型的,長時間執行或者用於複製的事物,對於乙個執行在簡單恢復模式的資料庫來說,當checkpoint程序不能被足夠快的喚醒而及時的截斷日誌,填滿日誌空間或者在自動增長被啟用的情況下導致日誌的增長是非常可能發生的事情。

例如:即使更改沒有達到恢復間隔的閾值,但是,如果更改在日誌70%空間被使用以後非常快,sql server 在日誌空間被用盡以前沒有足夠的時間來執行checkpoint以完成日誌的截斷。從某種意義上來說,日誌空間是否會被用完(或自動增長)取決於下面兩個條件之間的競爭狀態:

1. 如果sql server能夠首先截斷日誌,日誌空間將被釋放且標記為可重用,那麼,將不會自動增長或失敗事物。

2. 但是,由於資料改變的足夠快以至於在日誌被截斷以前而用盡了日誌的空間,這種情況也是可能發生的。

讓我們用乙個指令碼來實際的闡明這種行為。首先在乙個測試資料庫中執行一下指令碼建立乙個測試表並填充一些資料。測試資料庫1.已經設定為簡單的恢復模式。2.日誌的大小固定為100m.3.日誌檔案的自動增長被禁用(因為觀察日誌空間被用完的錯誤比檢查自動增長要容易)

setnocount 

ongo

drop

table

test

gocreate

table

test(i 

int, c 

char

(1000

))go

declare

@iint

set@i=1

while

@i<

10000

begin

insert

test 

values(@i

, 'abc'

)set@i=

@i+1end

為了觀察這種資源競爭,執行一下指令碼

setnocount 

ongo

declare

@change_size

intset

@change_size

=100

--adjust this value

declare

@iint

set@i=1

while

@i<

100begin

if@i%2

=0update

test 

setc 

=replicate('

a', @change_size

) else

update

test 

setc 

=replicate('

b', @change_size

)select@i=

@i+1end

你可能需要多次調整變數@change_size的值,首先使用乙個比較小的值(比如40)使指令碼能夠執行至結束,然後挑乙個比較大的值(比如400)使該指令碼執行失敗。請盡量使該指令碼在執行中途失敗。在我的幾次測試中,當@change_size=100時,成功執行了上面的指令碼並且在執行過程中日誌的空間沒有被填滿。但是當我將@change_size改為120時,我得到了9002的錯誤資訊非常準確的告訴我資料庫的事務日誌已滿。

當我將變數@change_size設定為116時,有時候指令碼會成功結束,而有時候會失敗。但這只是乙個大致的閾值,在乙個不穩定的測試及此測試環境下它是不精確的。實際上,在我的其它一些測試中,這個閾值低至50。這中情況說明,sql server 在有些時候能夠足夠快的截斷日誌,而有時候卻不能。

值得注意的是,儘管上面的兩個update語句的每乙個都更新了9999行,由修改而占用的日誌空間控制的比較好,大約在2-3m或者總日誌空間2%-3%.這並不是乙個很小的事務,儘管它也不是乙個大的,長時間執行的事務。

對於乙個工作在簡單恢復模式的資料庫來說,對我們有什麼啟示呢?

首先,在事務日誌中預留足夠的空間。這可能意味著你必須讓sql server 有機會能喚醒checkpoint 程序來及時的截斷事務日誌。其次,你可能必須手工的發出backup log with no_log命令來幫助它。

注意,在sql server 2008中,backup log with no_log 和backup log with truncate_only這兩個命令都已經被移除。如果您確實需要手工的截斷事務日誌,可能您不得不發出checkpoint命令,而這個命令除了截斷事務日誌以外,還將做很多其它事情。

Linux下為什麼目錄的大小總是4096

檢視os系統塊的大小 root sbin tune2fs l dev sda1 檢視os系統頁的大小 oracle skate test getconf pagesize 4096 修改塊的大小 建立檔案系統時,可以指定塊的大小。如果將來在你的檔案系統中是一些比較大的檔案的話,使用較大的塊大小將得到...

Linux下為什麼目錄的大小總是4096

linux下為什麼目錄的大小總是4096 1.在linux下一切皆檔案,因此資料夾也是檔案,這個大小指的是資料夾的大小,和windows下不同。2.4096是io塊,類似磁碟的標記的東西,即 即使是0大小也要占用乙個塊 而檔案大小是這樣計算的,占有的塊數你看到的那個4096 8就是檔案大小,位元組為...

自己想了一下為什麼在ajax方法裡找不到伺服器控制項

伺服器控制項依賴pageload,只有頁面提交 他們request伺服器,如果沒有pageload 他們是不會request伺服器,所以在裡ajax不走pageload,伺服器並不知道他們幹什麼了 所以應該是js不能用後台依賴與pageload的控制項的響應事件,最後想了一下 原來伺服器控制項和依賴...