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
文章列表