淺談幾個(gè)SQL的日志概念
今天抽出一點(diǎn)時(shí)間解釋幾個(gè)關(guān)于SQL日志的概念,他們也經(jīng)常使初學(xué)者望而止步,反正計(jì)算機(jī)的術(shù)語都是很抽象的,所以第一感覺就是頭疼,然后然后幾次后就沒感覺了.以下有些是從書上摘抄的,有的是從網(wǎng)上找的算是借花獻(xiàn)佛吧!!
物理日志文件:
? ? 這個(gè)比較好理解,實(shí)實(shí)在在的東西,數(shù)據(jù)庫目錄下面的.ldf文件就是,有些人喜歡改后綴,感覺不大好,數(shù)據(jù)庫的事務(wù)日志記錄就在這里面
虛擬日志:
? ? 相信多數(shù)人有這個(gè)感覺,虛擬這個(gè)字眼總是神秘的代名詞,虛擬個(gè)飯島愛我喜歡,但虛擬日志,虛擬內(nèi)存,虛擬。。。。,看了就討厭。解釋應(yīng)該是這樣的,對(duì)于一個(gè)或多個(gè)連續(xù)的物理日志文件,SQL SERVER在這些文件的內(nèi)部又劃分成了多個(gè)小的文件,稱為虛擬日志文件,他是日志文件收縮和日志截?cái)嗟淖钚挝?,比如物理日志文件?00M,內(nèi)部劃分了4個(gè)100M的虛擬文件,收縮時(shí)你得到的是300M,200M,不可能得到239M,對(duì)于一個(gè)物理文件,會(huì)劃分成多少個(gè)虛擬文件,這個(gè)由SQL自己維護(hù),唯一可以人工干預(yù)的是指定較大的物理日志文件,并指定較大的增長(zhǎng)比例,這樣可能虛擬文件的塊頭會(huì)大點(diǎn),數(shù)量會(huì)少點(diǎn),系統(tǒng)的維護(hù)開銷會(huì)低一點(diǎn)
邏輯日志:
? ? 不要頭暈,硬著頭皮看吧?。?!感覺這個(gè)應(yīng)該是數(shù)據(jù)庫事務(wù)日志的真實(shí)寫照,物理日志文件好比是一個(gè)容器,里面容納的是日志記錄,這些記錄就稱為邏輯日志,從物理日志文件的起點(diǎn)開始,邏輯日志順序的生成,記錄下數(shù)據(jù)庫里發(fā)生的每個(gè)事務(wù),這些事務(wù)被打上一個(gè)標(biāo)簽,LSN,順序的排列下來,這樣邏輯日志就在物理日志文件內(nèi)慢慢的成長(zhǎng),直到充滿了他,這個(gè)時(shí)候物理日志文件就會(huì)自動(dòng)添加新的空間,以繼續(xù)前面的步驟,這種情況是最直接的一種(從來不截?cái)嗳罩荆旧暇褪沁@樣的),但事實(shí)上往往是復(fù)雜的多
檢測(cè)點(diǎn)(checkpoint)和恢復(fù)周期(recovery interval):
? ? checkpoint不是用于檢查數(shù)據(jù)是否完整,頁面連接是否正確的,他是由系統(tǒng)維護(hù)的一個(gè)進(jìn)程(你也可以手工的執(zhí)行),用于將高速緩存里的臟頁刷新到磁盤,兩者的配合算是惟妙惟肖,當(dāng)緩存中的臟頁積累到一定的數(shù)量,SQL估計(jì)演算這些臟頁要花的時(shí)間快要接近設(shè)定的recovery interval(分鐘)時(shí),系統(tǒng)就會(huì)產(chǎn)生一個(gè)checkpoint,所以checkpoint的產(chǎn)生不是定時(shí)的,它由recovery interval和數(shù)據(jù)庫的更新頻繁度決定。如果你的數(shù)據(jù)庫永遠(yuǎn)不用重啟,永遠(yuǎn)不會(huì)出現(xiàn)什么故障,就這么一直運(yùn)行下去,那么checkpoint和recovery interval就沒有想象中的重要了,SQL總是先寫日志,情況應(yīng)該是這樣的:用戶提交一個(gè)更新操作,SQL在高速緩存里緩沖了需要的數(shù)據(jù)頁和日志頁,然后打上begin tran標(biāo)簽,對(duì)日志進(jìn)行修改,再修改數(shù)據(jù)頁,然后打上commit tran標(biāo)簽,最后把修改過的日志頁刷新到磁盤上,在保證了這個(gè)步驟完成后,數(shù)據(jù)頁才被寫入磁盤,如果這個(gè)時(shí)候機(jī)器突然斷電導(dǎo)致高速緩存中數(shù)據(jù)頁的丟失,那么重啟機(jī)器時(shí)SQL的恢復(fù)進(jìn)程將根據(jù)已經(jīng)刷新的日志記錄來演算剛才的數(shù)據(jù)頁,保證數(shù)據(jù)的完整性,這就好比支票已經(jīng)開到了,但貨卻在路上丟了,憑借支票,你還是可以得到你的東西,像這種提交了又還沒來得及刷新數(shù)據(jù)頁到磁盤的日志事務(wù)可以稱為活動(dòng)日志,雖然概念不是這么定義的,但可以這么理解,因?yàn)橐坏┤罩居涗浐推鋵?duì)應(yīng)的數(shù)據(jù)頁被刷新到磁盤的話,這條日志的作用也就完成了,并稱為非活動(dòng)的日志,他的唯一用處就是備份下來留著以后做日志恢復(fù),所以SQL的邏輯日志你就應(yīng)該知道大概是怎么個(gè)樣子了,前面一大部分,是已經(jīng)演算的日志記錄(非活動(dòng)日志),后面一部分,是還沒有演算的(活動(dòng)日志),活動(dòng)部分的第一條事務(wù)稱為MinLSN,系統(tǒng)會(huì)擱段時(shí)間利用檢測(cè)點(diǎn)(checkpoint)演算活動(dòng)日志,來縮短數(shù)據(jù)庫重啟時(shí)的恢復(fù)時(shí)間,在演算結(jié)束后,checkpoint會(huì)在日志里打上一個(gè)結(jié)束語,并將MinLSN標(biāo)識(shí)給下一個(gè)緊跟著的活動(dòng)事務(wù)日志,這也是下一個(gè)checkpoint的起點(diǎn)
截?cái)嗍聞?wù)日志:
? ? 這個(gè)概念很是讓初學(xué)者費(fèi)解,截?cái)嗍鞘裁匆馑迹浚浚拷財(cái)嗪笕罩具€會(huì)增長(zhǎng)嗎???截?cái)嗫傆袀€(gè)斷點(diǎn)吧,他是從哪里開始截?cái)嗟陌????截?cái)嗪髸?huì)釋放日志空間嗎???等等。。。?,F(xiàn)在逐一擊破
? ? 首先截?cái)嗍菍?duì)SQL邏輯日志的一個(gè)清除過程,清除非活動(dòng)的邏輯事務(wù)日志??梢韵胂髷帱c(diǎn)應(yīng)該是活動(dòng)與非活動(dòng)的邊界處--MinLSN,他會(huì)將MinLSN前面的這段日志清除掉,邏輯日志的起點(diǎn)也會(huì)指向斷點(diǎn)MinLSN處,清除出來的空間并不會(huì)返還給操作系統(tǒng),而是被標(biāo)識(shí)為非活動(dòng)的虛擬日志文件,他表示當(dāng)有新的日志記錄進(jìn)來時(shí),這些空間可以被再次利用,所以截?cái)嗳罩静⒉粫?huì)減小物理日志文件的大小,只是清理了里面的一些內(nèi)容,以便新的日志記錄可以進(jìn)來,SQL總是以循環(huán)鏈表的方式使用物理日志文件的,當(dāng)邏輯日志增長(zhǎng)到物理日志文件的盡頭時(shí),他會(huì)循環(huán)到日志文件的首部搜索被截?cái)喽尫懦鰜淼目臻g,如果這個(gè)時(shí)候沒有空間的話,說明物理日志已經(jīng)用完了,就得增加物理日志的大小,如果磁盤也用盡了,系統(tǒng)就會(huì)返回一個(gè)錯(cuò)誤提示。至于截?cái)嗪笕罩臼欠襁€會(huì)增長(zhǎng),疑點(diǎn)可能存在于trunc log on chkpt上,當(dāng)數(shù)據(jù)庫處于這種狀態(tài)時(shí)用戶會(huì)發(fā)現(xiàn)他們的日志文件總是那么小一點(diǎn)點(diǎn),道理很簡(jiǎn)單,檢查點(diǎn)截?cái)嗳罩竞?,日志文件里面總?huì)有空間容納新的日志記錄,自然是不會(huì)變大了,但也有特殊情況,當(dāng)一個(gè)較長(zhǎng)的事務(wù)運(yùn)行時(shí)(比如一個(gè)長(zhǎng)達(dá)2個(gè)小時(shí)的UPDATE語句),他會(huì)迅速的充滿日志,并補(bǔ)充新的空間進(jìn)來,這個(gè)時(shí)候系統(tǒng)是來不及截?cái)嗟?,這樣物理日志文件就馬上變大了,當(dāng)事務(wù)完成后,截?cái)嘣龠M(jìn)行時(shí),對(duì)文件的大小他是無能為力了,只是清理下剛才的戰(zhàn)場(chǎng)而已,所以截?cái)嗳罩竞筮壿嬋罩臼抢^續(xù)增長(zhǎng)的,至于物理日志,要看你提交事務(wù)的大小了
最后的話題:
? ? 經(jīng)常聽到這樣的說法,定期轉(zhuǎn)存事務(wù)日志,以釋放日志空間,backup log...with no_log,backup log...with truncate_only,這些只能使日志文件不變大,要想減小日志文件,還是要收縮日志文件,這樣才真正將空間返還給操作系統(tǒng),在sybase里面truncate_only和no_log還是有區(qū)別的,都是截?cái)嗳罩?,但前者在截?cái)嘀皶?huì)啟動(dòng)checkpoint,所以當(dāng)你的日志完全被充滿,truncate_only是不能成功的,他已經(jīng)沒有空間讓你checkpoint,這時(shí)只能采用no_log(SQL里面我還不知道),還有一個(gè)關(guān)鍵字就是no_truncate,他表示備份但不截?cái)嗳罩荆J(rèn)是截?cái)嗟模?,在?shù)據(jù)庫因故障損壞時(shí)用這個(gè)備份日志特別有效
好了,就說這么多了,由于這部分的概念實(shí)在是太抽象,本人能力也非常有限,所以表述可能不大清楚,錯(cuò)誤的地方請(qǐng)多多指教?。。?
今天抽出一點(diǎn)時(shí)間解釋幾個(gè)關(guān)于SQL日志的概念,他們也經(jīng)常使初學(xué)者望而止步,反正計(jì)算機(jī)的術(shù)語都是很抽象的,所以第一感覺就是頭疼,然后然后幾次后就沒感覺了.以下有些是從書上摘抄的,有的是從網(wǎng)上找的算是借花獻(xiàn)佛吧!!
物理日志文件:
? ? 這個(gè)比較好理解,實(shí)實(shí)在在的東西,數(shù)據(jù)庫目錄下面的.ldf文件就是,有些人喜歡改后綴,感覺不大好,數(shù)據(jù)庫的事務(wù)日志記錄就在這里面
虛擬日志:
? ? 相信多數(shù)人有這個(gè)感覺,虛擬這個(gè)字眼總是神秘的代名詞,虛擬個(gè)飯島愛我喜歡,但虛擬日志,虛擬內(nèi)存,虛擬。。。。,看了就討厭。解釋應(yīng)該是這樣的,對(duì)于一個(gè)或多個(gè)連續(xù)的物理日志文件,SQL SERVER在這些文件的內(nèi)部又劃分成了多個(gè)小的文件,稱為虛擬日志文件,他是日志文件收縮和日志截?cái)嗟淖钚挝?,比如物理日志文件?00M,內(nèi)部劃分了4個(gè)100M的虛擬文件,收縮時(shí)你得到的是300M,200M,不可能得到239M,對(duì)于一個(gè)物理文件,會(huì)劃分成多少個(gè)虛擬文件,這個(gè)由SQL自己維護(hù),唯一可以人工干預(yù)的是指定較大的物理日志文件,并指定較大的增長(zhǎng)比例,這樣可能虛擬文件的塊頭會(huì)大點(diǎn),數(shù)量會(huì)少點(diǎn),系統(tǒng)的維護(hù)開銷會(huì)低一點(diǎn)
邏輯日志:
? ? 不要頭暈,硬著頭皮看吧?。?!感覺這個(gè)應(yīng)該是數(shù)據(jù)庫事務(wù)日志的真實(shí)寫照,物理日志文件好比是一個(gè)容器,里面容納的是日志記錄,這些記錄就稱為邏輯日志,從物理日志文件的起點(diǎn)開始,邏輯日志順序的生成,記錄下數(shù)據(jù)庫里發(fā)生的每個(gè)事務(wù),這些事務(wù)被打上一個(gè)標(biāo)簽,LSN,順序的排列下來,這樣邏輯日志就在物理日志文件內(nèi)慢慢的成長(zhǎng),直到充滿了他,這個(gè)時(shí)候物理日志文件就會(huì)自動(dòng)添加新的空間,以繼續(xù)前面的步驟,這種情況是最直接的一種(從來不截?cái)嗳罩荆旧暇褪沁@樣的),但事實(shí)上往往是復(fù)雜的多
檢測(cè)點(diǎn)(checkpoint)和恢復(fù)周期(recovery interval):
? ? checkpoint不是用于檢查數(shù)據(jù)是否完整,頁面連接是否正確的,他是由系統(tǒng)維護(hù)的一個(gè)進(jìn)程(你也可以手工的執(zhí)行),用于將高速緩存里的臟頁刷新到磁盤,兩者的配合算是惟妙惟肖,當(dāng)緩存中的臟頁積累到一定的數(shù)量,SQL估計(jì)演算這些臟頁要花的時(shí)間快要接近設(shè)定的recovery interval(分鐘)時(shí),系統(tǒng)就會(huì)產(chǎn)生一個(gè)checkpoint,所以checkpoint的產(chǎn)生不是定時(shí)的,它由recovery interval和數(shù)據(jù)庫的更新頻繁度決定。如果你的數(shù)據(jù)庫永遠(yuǎn)不用重啟,永遠(yuǎn)不會(huì)出現(xiàn)什么故障,就這么一直運(yùn)行下去,那么checkpoint和recovery interval就沒有想象中的重要了,SQL總是先寫日志,情況應(yīng)該是這樣的:用戶提交一個(gè)更新操作,SQL在高速緩存里緩沖了需要的數(shù)據(jù)頁和日志頁,然后打上begin tran標(biāo)簽,對(duì)日志進(jìn)行修改,再修改數(shù)據(jù)頁,然后打上commit tran標(biāo)簽,最后把修改過的日志頁刷新到磁盤上,在保證了這個(gè)步驟完成后,數(shù)據(jù)頁才被寫入磁盤,如果這個(gè)時(shí)候機(jī)器突然斷電導(dǎo)致高速緩存中數(shù)據(jù)頁的丟失,那么重啟機(jī)器時(shí)SQL的恢復(fù)進(jìn)程將根據(jù)已經(jīng)刷新的日志記錄來演算剛才的數(shù)據(jù)頁,保證數(shù)據(jù)的完整性,這就好比支票已經(jīng)開到了,但貨卻在路上丟了,憑借支票,你還是可以得到你的東西,像這種提交了又還沒來得及刷新數(shù)據(jù)頁到磁盤的日志事務(wù)可以稱為活動(dòng)日志,雖然概念不是這么定義的,但可以這么理解,因?yàn)橐坏┤罩居涗浐推鋵?duì)應(yīng)的數(shù)據(jù)頁被刷新到磁盤的話,這條日志的作用也就完成了,并稱為非活動(dòng)的日志,他的唯一用處就是備份下來留著以后做日志恢復(fù),所以SQL的邏輯日志你就應(yīng)該知道大概是怎么個(gè)樣子了,前面一大部分,是已經(jīng)演算的日志記錄(非活動(dòng)日志),后面一部分,是還沒有演算的(活動(dòng)日志),活動(dòng)部分的第一條事務(wù)稱為MinLSN,系統(tǒng)會(huì)擱段時(shí)間利用檢測(cè)點(diǎn)(checkpoint)演算活動(dòng)日志,來縮短數(shù)據(jù)庫重啟時(shí)的恢復(fù)時(shí)間,在演算結(jié)束后,checkpoint會(huì)在日志里打上一個(gè)結(jié)束語,并將MinLSN標(biāo)識(shí)給下一個(gè)緊跟著的活動(dòng)事務(wù)日志,這也是下一個(gè)checkpoint的起點(diǎn)
截?cái)嗍聞?wù)日志:
? ? 這個(gè)概念很是讓初學(xué)者費(fèi)解,截?cái)嗍鞘裁匆馑迹浚浚拷財(cái)嗪笕罩具€會(huì)增長(zhǎng)嗎???截?cái)嗫傆袀€(gè)斷點(diǎn)吧,他是從哪里開始截?cái)嗟陌????截?cái)嗪髸?huì)釋放日志空間嗎???等等。。。?,F(xiàn)在逐一擊破
? ? 首先截?cái)嗍菍?duì)SQL邏輯日志的一個(gè)清除過程,清除非活動(dòng)的邏輯事務(wù)日志??梢韵胂髷帱c(diǎn)應(yīng)該是活動(dòng)與非活動(dòng)的邊界處--MinLSN,他會(huì)將MinLSN前面的這段日志清除掉,邏輯日志的起點(diǎn)也會(huì)指向斷點(diǎn)MinLSN處,清除出來的空間并不會(huì)返還給操作系統(tǒng),而是被標(biāo)識(shí)為非活動(dòng)的虛擬日志文件,他表示當(dāng)有新的日志記錄進(jìn)來時(shí),這些空間可以被再次利用,所以截?cái)嗳罩静⒉粫?huì)減小物理日志文件的大小,只是清理了里面的一些內(nèi)容,以便新的日志記錄可以進(jìn)來,SQL總是以循環(huán)鏈表的方式使用物理日志文件的,當(dāng)邏輯日志增長(zhǎng)到物理日志文件的盡頭時(shí),他會(huì)循環(huán)到日志文件的首部搜索被截?cái)喽尫懦鰜淼目臻g,如果這個(gè)時(shí)候沒有空間的話,說明物理日志已經(jīng)用完了,就得增加物理日志的大小,如果磁盤也用盡了,系統(tǒng)就會(huì)返回一個(gè)錯(cuò)誤提示。至于截?cái)嗪笕罩臼欠襁€會(huì)增長(zhǎng),疑點(diǎn)可能存在于trunc log on chkpt上,當(dāng)數(shù)據(jù)庫處于這種狀態(tài)時(shí)用戶會(huì)發(fā)現(xiàn)他們的日志文件總是那么小一點(diǎn)點(diǎn),道理很簡(jiǎn)單,檢查點(diǎn)截?cái)嗳罩竞?,日志文件里面總?huì)有空間容納新的日志記錄,自然是不會(huì)變大了,但也有特殊情況,當(dāng)一個(gè)較長(zhǎng)的事務(wù)運(yùn)行時(shí)(比如一個(gè)長(zhǎng)達(dá)2個(gè)小時(shí)的UPDATE語句),他會(huì)迅速的充滿日志,并補(bǔ)充新的空間進(jìn)來,這個(gè)時(shí)候系統(tǒng)是來不及截?cái)嗟?,這樣物理日志文件就馬上變大了,當(dāng)事務(wù)完成后,截?cái)嘣龠M(jìn)行時(shí),對(duì)文件的大小他是無能為力了,只是清理下剛才的戰(zhàn)場(chǎng)而已,所以截?cái)嗳罩竞筮壿嬋罩臼抢^續(xù)增長(zhǎng)的,至于物理日志,要看你提交事務(wù)的大小了
最后的話題:
? ? 經(jīng)常聽到這樣的說法,定期轉(zhuǎn)存事務(wù)日志,以釋放日志空間,backup log...with no_log,backup log...with truncate_only,這些只能使日志文件不變大,要想減小日志文件,還是要收縮日志文件,這樣才真正將空間返還給操作系統(tǒng),在sybase里面truncate_only和no_log還是有區(qū)別的,都是截?cái)嗳罩?,但前者在截?cái)嘀皶?huì)啟動(dòng)checkpoint,所以當(dāng)你的日志完全被充滿,truncate_only是不能成功的,他已經(jīng)沒有空間讓你checkpoint,這時(shí)只能采用no_log(SQL里面我還不知道),還有一個(gè)關(guān)鍵字就是no_truncate,他表示備份但不截?cái)嗳罩荆J(rèn)是截?cái)嗟模?,在?shù)據(jù)庫因故障損壞時(shí)用這個(gè)備份日志特別有效
好了,就說這么多了,由于這部分的概念實(shí)在是太抽象,本人能力也非常有限,所以表述可能不大清楚,錯(cuò)誤的地方請(qǐng)多多指教?。。?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
