国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

收縮SQL Server日志不是那么簡(jiǎn)單的(翻譯)

2024-08-31 00:56:00
字體:
供稿:網(wǎng)友
收縮SQL Server日志不是那么簡(jiǎn)單的(翻譯)

原文地址:http://rusanu.com/2012/07/27/how-to-shrink-the-sql-server-log/

說明:本文為了更好的說明收縮的過程,在原文翻譯的基礎(chǔ)上增加了一些個(gè)人的理解,省略了部分內(nèi)容,建議大家在閱讀本文時(shí)參考原文。

一、問題場(chǎng)景

我的數(shù)據(jù)庫日志文件已經(jīng)增大到200G了,我也嘗試去收縮數(shù)據(jù)庫,但大小沒有改變,請(qǐng)問該如何減小日志文件的大小?這個(gè)問題實(shí)際上就是說執(zhí)行DBCC SHRINKFILE沒有減小日志文件的大小,到底是什么原因?qū)е碌哪兀?

二、準(zhǔn)備知識(shí)

1、LSN

LSN用來標(biāo)識(shí)特定日志在日志文件中位置(詳情請(qǐng)見什么是LSN:日志序列號(hào)),它由兩部分組成:一部分用來標(biāo)識(shí)VLF(虛擬日志文件)的序列號(hào),剩下的用來標(biāo)識(shí)該日志在VLF中的具體的位置。

根據(jù)LSN不同,日志一般分為兩類:首日志(最新的活動(dòng)日志序號(hào))和尾日志(保留時(shí)間最長(zhǎng)的活動(dòng)日志序號(hào))。隨著數(shù)據(jù)庫的操作不斷增加(如數(shù)據(jù)庫中的update操作),首日志LSN序號(hào)不斷變化。尾日志的序號(hào)只有在日志備份后才會(huì)變化。

(圖一)日志文件結(jié)構(gòu)圖

2、VLF

你可以通過DCC LOGINFO去分析數(shù)據(jù)庫LDF中VLF(虛擬日志文件),LDF、VLF、日志的關(guān)系是:LDF包括多個(gè)VLF,每個(gè)VLF中包括多個(gè)日志記錄。在VLF中,當(dāng)事物日志增加時(shí),日志的頭部(首日志)不斷向前移動(dòng),日志將占用越來越多的剩余空間,當(dāng)這個(gè)VLF被占滿后,新的日志寫入到其他未被使用的VLF中,這個(gè)時(shí)候LDF并不會(huì)增大。當(dāng)LDF中沒有可用的VLF時(shí),數(shù)據(jù)庫會(huì)創(chuàng)建一個(gè)新的VLF。從而使得LDF文件物理增大,占用更多的磁盤空間。

(圖二)日志增長(zhǎng)

三、解決方法詳細(xì)闡述
1、日志的截?cái)?/td>

上圖演示了首日志向前移動(dòng)的場(chǎng)景,結(jié)合圖一和圖二可以看到,當(dāng)VLF2的空間被日志填滿后,數(shù)據(jù)庫擴(kuò)充LDF文件(向操作系統(tǒng)申請(qǐng)更多的磁盤空間),并在擴(kuò)充后的LDF中新建一個(gè)VLF3用來填充新的日志記錄。盡管VLF1中存在剩余空間,但因?yàn)閂LF1中存在活動(dòng)日志(哪怕只有一條),所以數(shù)據(jù)庫無法利用這個(gè)VLF的剩余空間,(詳細(xì)原因可以參考這篇文章什么是LSN:日志序列號(hào))。

這個(gè)時(shí)候做日志備份就會(huì)發(fā)生日志截?cái)嗟默F(xiàn)象。一般會(huì)將截?cái)嗬斫鉃?刪除"一些日志記錄(非活動(dòng)),實(shí)際上它只是意味著尾日志的向前移動(dòng):尾日志序號(hào)會(huì)被刷新成最小的活動(dòng)日志序號(hào),而從原來尾日志的位置到新位置之間的空間被標(biāo)記為"可重新利用"。這個(gè)過程并不會(huì)減少LDF已占用的磁盤空間。如下圖,整個(gè)VLF1的和部分VLF2上的日志(非活動(dòng))被截?cái)嗔恕?

日志截?cái)嗍疽鈭D(圖三)

隨著事務(wù)日志不斷增加,VLF3中日志頭部所在的位置將不斷向前移動(dòng),當(dāng)VLF3的空間被占滿后,數(shù)據(jù)庫會(huì)重新利用VLF1的空間,這種寫入、截?cái)唷⒃賹懭氲姆绞叫纬梢粋€(gè)寫日志的循環(huán)。在此期間LDF并不會(huì)物理上增大。

日志循環(huán)使用示意圖(圖四)

2、為什么日志不能收縮

現(xiàn)在我們?cè)賮砜匆粋€(gè)日志無法收縮的場(chǎng)景:

圖四中,VLF1中的日志不斷增加,直到VLF1的所有空間都被填滿(如圖五),此時(shí)因?yàn)闆]有發(fā)生截?cái)啵踩罩径荚赩LF2上,且VLF2和VLF3都被標(biāo)記為不可重新利用,數(shù)據(jù)庫只能擴(kuò)充LDF、新建一個(gè)VLF4用來記錄新的日志,首日志的位置將出現(xiàn)在VLF4中,整個(gè)寫日志的(從圖一到圖四)順序?yàn)閂LF2——>VLF3——>VLF1——>VLF4。這個(gè)過程會(huì)導(dǎo)致數(shù)據(jù)庫的日志文件在物理上增大。

日志增長(zhǎng)示意圖(圖五)

這時(shí)我們?cè)賮斫財(cái)嗍挛锶罩荆缟衔乃f,尾日志的會(huì)被更新,最后可能出現(xiàn)尾日志和首日志在同一個(gè)VLF上的場(chǎng)景。從日志文件記錄的架構(gòu)上來看,我們可以將這個(gè)過程簡(jiǎn)單地理解為:截?cái)嗟捻樞驎?huì)按照首日志移動(dòng)的順序移動(dòng),從VLF2——>VLF3——>VLF1——>VLF4,最終尾日志和首日志出現(xiàn)在同一個(gè)VLF上。

日志截?cái)嗍疽鈭D二(圖六)

如上圖,這個(gè)LDF文件包括3個(gè)空的和1個(gè)只有小部分活動(dòng)日志的VLF文件,首日志和尾日志在同一個(gè)VLF中,這種情況下,試圖通過DBCC SHRINKFILE是不會(huì)減小LDF文件的大小的。

日志文件能被收縮的原因是該文件尾部的數(shù)據(jù)被清除了,使得該部分空間被釋放,而不是逃過尾部去刪除文件首部或者中間部分的內(nèi)容。這點(diǎn)與MDF文件不同,MDF文件中的數(shù)據(jù)是不能被刪除的,只能將文件尾部的數(shù)據(jù)遷移到其他區(qū)域的剩余空間上,然后釋放尾部占用的空間。

在LDF中 ,日志是不能被遷移的,而且也沒有遷移的必要,因?yàn)楫?dāng)事物被提交后,日志變?yōu)椴换顒?dòng)狀態(tài),通過事物日志備份即可將其截?cái)啵ㄌ厥馇闆r下日志備份不一定能截?cái)啵绨l(fā)布訂閱的環(huán)境)。

綜上所述,日志文件能被收縮的前提是:日志文件的最后一個(gè)VLF必須是free狀態(tài),從后向前推,只要是free狀態(tài)的VLF都會(huì)被收縮,據(jù)此可以估算一個(gè)日志文件可以釋放的空間大小。

如下我們看一個(gè)實(shí)際的例子:

USE DBname

DBCC loginfo

VLF狀態(tài)示意圖(圖七)

從上圖可以看到,這個(gè)數(shù)據(jù)庫的日志文件共有13個(gè)VLF,其中有前12個(gè)處于free狀態(tài),最后1個(gè)處于活動(dòng)狀態(tài),因此,我們可以推斷首日志和尾日志的位置都在這個(gè)VLF上。這個(gè)時(shí)候執(zhí)行文件收縮將看不到文件減小的效果。

3、如何解決這個(gè)問題

那么碰到這種情況,該怎么去收縮日志呢:盡可能多的執(zhí)行一些能夠產(chǎn)生大量日志的操作,這些日志將導(dǎo)致數(shù)據(jù)庫重新利用startoffset靠前的非活動(dòng)狀態(tài)的VLF,將首日志的位置定位到這個(gè)startoffset,然后做一次事務(wù)日志備份,將尾日志也遷移到startoffset靠前的非活動(dòng)狀態(tài)的VLF中,如下圖,最后再執(zhí)行DBCC SHRINKFILE即可收縮日志文件。

日志截?cái)嗍疽鈭D三(圖六)

四、重要說明

前文中一直在說通過日志備份即可解決日志截?cái)嗟膯栴},其實(shí)這只是最簡(jiǎn)單的場(chǎng)景。在實(shí)際環(huán)境中可能有很多因素會(huì)影響日志的截?cái)啵纾?/p>

  • 活動(dòng)的事物日志

日志備份只能截?cái)喾腔顒?dòng)的日志,如果一個(gè)事物長(zhǎng)時(shí)間運(yùn)行,此時(shí)備份事物日志將不會(huì)引起截?cái)喟l(fā)生。

  • 事物日志分發(fā)

事物日志分發(fā)中,只有當(dāng)日志讀取器代理已經(jīng)讀取完待分發(fā)的日志后,日志才能變得非活動(dòng)狀態(tài)。(之前我處理過一個(gè)類似問題,大家可以通過這個(gè)鏈接看看http://www.cnblogs.com/i6first/p/3281437.html。)

  • 數(shù)據(jù)庫鏡像和AlwaysOn

這兩種數(shù)據(jù)庫技術(shù)都需要將日志傳遞到接受端,在傳遞還沒有完成時(shí),日志會(huì)一直保留,即使是備份日志也無法截?cái)唷?/p>


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 汉沽区| 康马县| 宁明县| 潼南县| 松潘县| 千阳县| 桑植县| 通榆县| 富源县| 东海县| 清新县| 炉霍县| 香港| 木兰县| 大悟县| 宁国市| 嵊州市| 财经| 富源县| 成安县| 汕头市| 朝阳区| 南漳县| 钦州市| 咸阳市| 马龙县| 武鸣县| 乐安县| 固始县| 武川县| 龙游县| 米脂县| 进贤县| 清镇市| 缙云县| 宝丰县| 凤冈县| 屯昌县| 团风县| 普陀区| 普陀区|