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