日志真沒(méi)想象的那么簡(jiǎn)單
原創(chuàng)【51CTO精選譯文】凡是接觸過(guò)SQL Server的人現(xiàn)在應(yīng)該都知道,事務(wù)日志(transaction log)是任何SQL Server數(shù)據(jù)庫(kù)的一個(gè)重要組成部分。談?wù)撊罩臼俏覀€(gè)人偏愛(ài)的話題之一,單單介紹日志方面通常存在的一些誤解會(huì)是長(zhǎng)篇大論,豈止這篇短文涵蓋得了。
在過(guò)去的兩年里,我曾在無(wú)數(shù)次大會(huì)上作過(guò)名為《簡(jiǎn)單恢復(fù)到底有多簡(jiǎn)單?》的報(bào)告,今年5月在加拿大蒙特利爾舉行的DevTeach / SQLTeach大會(huì)上我還會(huì)做同樣的報(bào)告。雖然我無(wú)法在此介紹所有詳細(xì)內(nèi)容,也無(wú)法介紹日志的組織、日志為何會(huì)擴(kuò)大或縮小,以及截?cái)嗳罩镜降资鞘裁匆馑?,但可以基本回答“?jiǎn)單恢復(fù)到底有多簡(jiǎn)單”這個(gè)問(wèn)題。簡(jiǎn)單恢復(fù)的簡(jiǎn)單之處在于你的備份策略。你沒(méi)必要為每隔多久進(jìn)行日志備份而操心,因?yàn)闊o(wú)法進(jìn)行日志備份。
簡(jiǎn)單恢復(fù)并不意味著SQL Server不用日志功能了。這是個(gè)非常普遍的誤解,也是個(gè)普遍的要求——許多用戶想要以某種方法來(lái)運(yùn)行SQL Server,又不用負(fù)擔(dān)日志開(kāi)銷,因而想知道允許這么做的特殊而秘密的跟蹤標(biāo)志(trace flag)。實(shí)際上,沒(méi)有所謂的不生成日志的操作,即無(wú)日志操作,盡管人們可能需要這樣子。SQL Server至少需要把關(guān)于你操作的足夠多的信息記入日志,以便正常運(yùn)行過(guò)程中系統(tǒng)突然出現(xiàn)故障的話,可以撤消(或回滾)一切。
雖然SQL Server沒(méi)有執(zhí)行無(wú)日志操作的可能性,不過(guò)倒是有最小日志(minimal logging)這樣的操作。不過(guò)我發(fā)現(xiàn),最小日志中到底哪些信息被記入日志并沒(méi)有得到一個(gè)很明確的定義。SQL Server聯(lián)機(jī)叢書(shū)(BOL)描述了一組最小日志操作,表示“最小日志記錄的僅僅是在不支持及時(shí)點(diǎn)恢復(fù)的情況下,恢復(fù)事務(wù)所需要的信息?!边@個(gè)定義意味著最小日志必須記錄足夠多的信息,以便恢復(fù)或前滾事務(wù),即使每一單獨(dú)的數(shù)據(jù)行變更并沒(méi)有按時(shí)間順序記入日志。然而,其他定義表明最小日志只夠回滾事務(wù)。
簡(jiǎn)單恢復(fù)是三種恢復(fù)模式之一,而這三種模式之間的差異恰恰決定了如何管理日志。如果你在BOL中讀到關(guān)于恢復(fù)模式的部分,它不但列出了可以最小日志的一系列操作,還寫(xiě)到那些操作只是在大批量日志(BULK_LOGGED)和簡(jiǎn)單(SIMPLE)恢復(fù)模式下才是最小日志的;而在完全(FULL)恢復(fù)模式下,操作都是完全日志的。但我找不到哪里有完整的定義表明“完全日志”是什么意思。我過(guò)去以為完全日志意味著,每一個(gè)單獨(dú)的行都寫(xiě)入到日志中,就好像你執(zhí)行了一組單獨(dú)的插入(INSERT)、更新(UPDATE)或刪除(DELETE)操作。但對(duì)某些操作來(lái)說(shuō),事實(shí)并非如此。
當(dāng)一個(gè)可以最小日志的操作在完全恢復(fù)模式下在數(shù)據(jù)庫(kù)里面執(zhí)行時(shí),寫(xiě)入到事務(wù)日志的并不是每一個(gè)單獨(dú)的行,而是操作期間被修改的每一頁(yè)。所以,如果你在完全恢復(fù)模式下在數(shù)據(jù)庫(kù)里面執(zhí)行大批量插入(BULK INSERT)操作時(shí),由于每一頁(yè)塞滿了新的行,該頁(yè)寫(xiě)入到日志中,而這條日志記錄的大小將是8192個(gè)字節(jié)大?。ㄅcSQL Server的頁(yè)大小相同)。如果你在完全恢復(fù)模式下在數(shù)據(jù)庫(kù)里面構(gòu)建或重構(gòu)索引,SQL Server并不會(huì)把生成的每一個(gè)單獨(dú)的索引行記入到日志。而是一旦整個(gè)索引頁(yè)生成,就把它們記入到日志。
從空間和時(shí)間方面來(lái)看,把整個(gè)頁(yè)記入日志其實(shí)要比把每一個(gè)單獨(dú)的行記入日志高效得多。但只針對(duì)被認(rèn)為是最小日志操作的那些操作才這么做。所以,我認(rèn)為那些操作進(jìn)行完全日志與單獨(dú)的數(shù)據(jù)修改操作進(jìn)行完全日志不是一個(gè)概念。
所以,有一組操作我們可以稱之為最小日志操作。點(diǎn)擊這里:http://msdn.microsoft.com/en-us/library/ms191244(v=SQL.100).aspx,可以參閱這些操作的完整列表。這些操作之所以很特別,就在于它們?cè)诿恳环N恢復(fù)模式下日志方式各不相同。在完全恢復(fù)模式下,每一個(gè)完整的被修改頁(yè)寫(xiě)入到日志;在大批量日志恢復(fù)模式和簡(jiǎn)單恢復(fù)模式下,SQL Server只是把關(guān)于被修改頁(yè)的信息記入日志,而不是將頁(yè)里面的內(nèi)容本身記入日志。其他操作是真正的完全日志——不管你在哪種恢復(fù)模式下,它們含有每一個(gè)變更行的全部詳細(xì)信息,包括含有操作的事務(wù)、操作執(zhí)行時(shí)間以及受到影響的頁(yè)。
恢復(fù)模式是為SQL Server 2000產(chǎn)品添加的一項(xiàng)很棒的特性,但任何一種恢復(fù)模式根本就不簡(jiǎn)單。你對(duì)于SQL Server如何管理事務(wù)日志了解得越深入,就能做出越明智的決定,確定哪一種恢復(fù)模式適合自己。
原文鏈接:http://www.sqlmag.com/article/log-files3/How-Simple-Is-Logging-.aspx
【編輯推薦】