SQLSERVER中的log block校验(译)
SQLSERVER中的log block校验(译)
来自:http://sankarreddy.com/2010/03/transaction-log-block-checksum/
阅读下文之前可以先看这篇文章:再谈SQL Server中日志的的作用

从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可以使用
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
SQLSERVER中的log block校验(译)的更多相关文章
- sqlserver 中数据导入到mysql中的方法以及注意事项
数据导入从sql server 到mysql (将数据以文本格式从sqlserver中导出,注意编码格式,再将文本文件导入mysql中): 1.若从slqserver中导出的表中不包含中文采用: bc ...
- SQLServer中的数据库备份和还原
更多资源:http://denghejun.github.io 备份 SQLServer中的备份,这里是T-SQL的用法,具体示例代码如下,使用也相对简单,其中TestDatabase 是指所需备份的 ...
- SQLSERVER中的假脱机spool
SQLSERVER中的假脱机spool 我发现网上对于假脱机的解释都非常零散,究竟假脱机是什么? 这几天在家里研究了一下,收集了很多网上的资料 假脱机是中文的翻译,而英文的名字叫做 spool 在徐老 ...
- SQLSERVER中如何快速比较两张表的不一样
SQLSERVER中如何快速比较两张表的不一样 不知不觉要写2014年的最后一篇博文了~ 一般来说,如何检测两张表的内容是否一致,体现在复制的时候发布端和订阅端的两端的数据上面 我这里罗列了一些如何从 ...
- Andoid java文件中的Log检查工具
AndroidLogChecker 由于发布软件版本的时候我们需要把Log注释掉,此工具可以检查java类中的Log所在行以及是否已经注释. Github: https://github.com/cu ...
- Sqlserver中存储过程,触发器,自定义函数
Sqlserver中存储过程,触发器,自定义函数: 1. 触发器:是针对数据库表或数据库的特殊存储过程,在某些行为发生的时候就会被激活 触发器的分类: DML触发器:发生在数据操作语言执行时触发执行的 ...
- 一旦rhel5.8造成只读文件系统ORA-00354: corrupt redo log block header
一旦rhel5.8造成只读文件系统ORA-00354: corrupt redo log block header Wed Jun 03 03:31:24 CST 2015 Thread 1 adva ...
- SQLServer中间接实现函数索引或者Hash索引
本文出处:http://www.cnblogs.com/wy123/p/6617700.html SQLServer中没有函数索引,在某些场景下查询的时候要根据字段的某一部分做查询或者经过某种计算之后 ...
- 如何使用T-SQL备份还原数据库及c#如何调用执行? C#中索引器的作用和实现。 jquery控制元素的隐藏和显示的几种方法。 localStorage、sessionStorage用法总结 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一) span<T>之高性能字符串操作实测
如何使用T-SQL备份还原数据库及c#如何调用执行? 准备材料:Microsoft SQL Server一部.需要还原的bak文件一只 一.备份 数据库备份语句:user master backup ...
随机推荐
- SE 2014年4月18日
实验需求: R1 R2 R3用环回口建立IBGP对等体(使用对等体组),AS号为100 R4 R5 R6用环回口建立IBGP对等体(使用对等体组),AS号为 ...
- Python数据结构-元祖
print()) print() #等价于: print('Tom is %d'%(5))
- Spring IOC及AOP学习总结
一.Spring IOC体系学习总结: Spring中有两个容器体系,一类是BeanFactory.还有一类是ApplicationContext.BeanFactory提供了基础的容器功能.Appl ...
- A Game of Thrones(1) - Bran
The morning had dawned clear and cold, with a crispness(易碎:清新) that hinted(暗示:示意) at the end of summ ...
- pthread_once()使用(某个时间在整个程序中仅执行一次,不确定是那个线程)
在多线程环境中,有些事仅需要执行一次.通常当初始化应用程序时,可以比较容易地将其放在main函数中.但当你写一个库时,就不能在main里面初始化了,你可以用静态初始化,但使用一次初始化(pthread ...
- python手记(52)
python将信息加密进图片 从图片中解密信息 >>> runfile(r'K:\testpro\test1.py', wdir=r'K:\testpro') http://blog ...
- 怎样在屏幕上显示多个alv
本文解说怎样在屏幕上显示多个alv. 实现这种需求关键是下面几点(举例:在屏幕上显示4个alv): 1.须要定义4个alv control 2.由于有4个alv control,于是就须要定义4个容器 ...
- 配置JVM内存 查看内存工具
一.配置JVM内存 1.配置JVM内存的參数有四个: -XmxJavaHeap最大值.默认值为物理内存的1/4.最佳设值应该视物理内存大小及计算机内其它内存开销而定. -XmsJavaHeap初始值, ...
- 该Tiled地图制作拿到项目~~这是偷懒,为了直接复制后写来
1.现在,.h声明private: cocos2d::CCSprite* ninja; cocos2d::CCTMXTiledMap* tileMap; 然后.cpp中增加tileMap = CCT ...
- 为Linux用ISO制作U盘启动及基本原理
制作成功后的基本最简文件夹文件图 一.系统的基本引导流程: 首先系统要引导isolinux.bin可执行程序,此程序是移动介质上引导用的,isolinux.bin执行成功后会载入其配置文件syslin ...