文章出處

SQLSERVER中的log block校驗(譯)

來自:http://sankarreddy.com/2010/03/transaction-log-block-checksum/

閱讀下文之前可以先看這篇文章:再談SQL Server中日志的的作用

由于格式化磁盤的時候可以選擇分配單元512字節~64KB,所以log block要適應文件系統的分配單元否則不能原子寫入磁盤

 

從SQL2005開始,checksum校驗被增加為頁面校驗的一個選項,最廣為人知的兩個checksum選項就是備份時候的checksum選項和頁面校驗checksum選項

 

另外一個比較少人知道的選項就是log block checksum

 


什么是log block?

Log Block在宋沄劍寫的文章里已經介紹的很清楚了

Log Block是日志寫入持久化存儲的最小單位,Log Block的大小從512字節到60K不等,這取決于事務的大小,

那些在內存還未被寫入持久化存儲的Log Block也就是所謂的In-Flight日志。以下兩個因素決定Log Block的大小:

事務提交或回滾 Log Block滿60K會強制Flush到持久化存儲,以保證WAL     因此當一個事務很大時(比如說大面積update),

每60K就會成為一個Log Block寫入持久化存儲。而對于很多小事務,提交或回滾就會成為一個Block寫入持久化存儲,因此根據事務的大小,

LOG Block的大小也會不同。

大家知道page checksum就是校驗寫入磁盤的頁面,而log block checksum其實就是校驗寫入磁盤的log block

因為當log block寫入磁盤的時候也有可能損壞的,所以也需要校驗,本人覺得log block checksum校驗的重要性不亞于頁面校驗

因為SQLSERVER靠日志來保證事務一致性,如果日志損壞了,還如何靠這些日志進行redo,undo log??


我如何打開log block checksum這個選項?

頁面checksum可以使用

1 ALTER DATABASE xx PAGE_VERIFY CHECKSUM

Log block CHECKSUM選項會在當頁面校驗選項被設置為checksum的時候自動開啟,即當執行上面那條語句的時候SQLSERVER已經

幫您自動開啟了log block checksum。注意:當開啟過頁面校驗選項被設置為checksum之后

后來又轉回頁面校驗選項“TORN_PAGE_DETECTION”時候并不會影響log block checksum


log block CHECKSUM的工作方式

當SQLSERVER提交一個事務并且發出一個事務日志寫,在log block寫入磁盤之前,SQLSERVER就是計算出這個log block的checksum值

并附加在log block的頭部,實際上這個結構跟數據頁面非常相似。當在備份和還原(還有其他的活動)期間讀取事務日志的時候,checksum值

就會被重新計算并且檢查先前寫入到log block頭部的那個checksum值

 

大家可以參考一下頁面checksum:

SQL 2005中的checksum功能
http://blogs.msdn.com/b/apgcdsd/archive/2012/04/09/sql-2005-checksum.aspx


log block CHECKSUM有什么幫助?

如果存儲在log block頭部中的checksum值跟在讀取log block時用相同的方法再計算一次的checksum值不匹配

那么說明IO子系統已經對您的數據造成一定的破壞。這個時候你應該馬上檢查IO子系統找出問題的根源


TSQL里面的checksum函數、頁面checksum、備份checksum、log block checksum是使用相同的算法嗎?

 

答案是:NO

TSQL里的 CHECKSUM 函數算法是不同于PAGE/BACKUP/Log Block CHECKSUM的,

PAGE/BACKUP/Log Block CHECKSUM使用簡單和更有效的算法相比于TSQL的checksum函數

 

如有不對的地方,歡迎大家拍磚o(∩_∩)o


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()