SQL Server 2005中的CHECKSUM功能

原文:SQL Server 2005中的CHECKSUM功能

转自此处

页面 checksum 是SQL2005的新功能,提供了一种比残缺页检测强大的机制检测IO方面的损坏。以下是详细描述:

页面 CHECKSUM:

在数据库页面从被写入磁盘到被SQL Server读取的这段时间内,有可能由于外界原因发生损坏。比如I/O设备的损坏,驱动的损坏或者由于电源不稳没有写完整。Checksum机制使SQL Server可以检测到这些损坏。需要注意的是,Checksum机制只能使我们确定是不是I/O子系统引起页面损坏,但是不能自动修复它们。作为管理员,我们可以利用这些信息来辨识出并更换损坏的I/O设备,也可以利用重建索引或者修复损坏文件等方法修复已发生的页面损坏。

Checksum功能可以由Alter Database命令在数据库上逐个开启和关闭每一个数据库上的。当开启Checksum时,SQL Server会在页面被写入和被读取的时候计算页面的Checksum。SQL Server基于页面上的位模式计算Checksum,储存在页头部,然后发一个I/O来写页面。SQL Server在读取页面时用相同的方法再计算一次checksum,并与储存在页面头的checksum值进行比较。如果结果相同则说明在读写周期内页面没有损坏。计算checksum的算法是复杂的,因为会涉及到多个页面的读写,增加CPU的负荷,可能会影响系统的吞吐量。此外,checksum不是与页面位模式一一对应的,不同页面也有可能有相同的checksum值,所以有极小的可能性事页面损坏检查不出来。

我们对以下几种情况特别做一些说明:

l  数据库创建一段时间后才开启checksum

只有在开启checksum功能后每次写页面时才会计算checksum,读取页面时才会重新计算。如果数据库创建之初没有开启Checksum,会有一些页没有记录下checksum。当读取这些页面时SQL Server不会计算checksum,因为没有可以用来比较的checksum,计算就没有意义。目前没有命令或工具强制计算数据库所有页面的checksum。这样做并??有太大的好处。试想,当数据页面已经被破坏时,我们只能计算损坏的checksum,而不知道正常情况下的checksum,损坏也无从检测。当然,如果有这样的命令或工具存在,我们就能检测到由于位损坏(如一个有效的页在被写入到磁盘后发生损坏)引起的页面损坏,或者在数据库文件被转移或者复制到其他媒介的时检测到损坏了。

l  停止checksum功能

当不希望checksum消耗CPU资源或者确信I/O系统可靠的时候,您可以停止Checksum功能。停止后,不再计算和记录checksum值。这种情况下, SQL Server就可能受到外界造成的页面损坏,一个检测不到的损坏可能导致:

o      数据丢失,除非运行全备份恢复(前提是日志备份没有被破坏)

o      潜在的应用程序异常,特别是在损坏没有改变页面结构而只是改变了某些数据时。

o      降低数据库的可用性,因为必须要执行介质恢复来修正损坏。

l  如何验证数据库所有页的checksum

使用DBCC CHECKDB命令,最好加上PHYSICAL_ONLY参数以降低资源的消耗。

l  数据库开启残缺页(torn page)检测

数据库的Checksum检测和残缺页检测不能同时开启。因为checksum机制对于页面损坏的验证比残缺页更严格,而产生checksum匹配但是页面残缺的可能性极小,所以开启checksum相当于自动获取残缺页检测。如果您关闭了页面的checksum功能,那我们建议您开启残缺页检测,用较小的代价尽可能检测I/O子系统异常。

备份 checksum

备份checksum和页面checksum算法一样,每当页面做备份时计算checksum,只不过多个页面checksum的值将合并成一个备份checksum值。备份checksum储存在备份媒介,而不是页面中。备份期间您可以选择生成备份checksum用于恢复备份时检测备份时候损坏。另外,如果页面checksum可用,可以在备份和恢复过程中用于确认。

时间: 2024-12-11 15:19:21

SQL Server 2005中的CHECKSUM功能的相关文章

SQL Server 2005 中的数据类型总结

注:转自土豆网 SQL Server 2005 中的数据类型归纳为下列类别: 精确数字 bigint decimal int numeric smallint money tinyint smallmoney bit 近似数字 float real 日期和时间 datetime smalldatetime 字符串 char text varchar Unicode字符串 nchar ntext nvarchar 二进制字符串 binary image varbinary 其他数据类型 curso

深入理解SQL Server 2005 中的 COLUMNS_UPDATED函数

原文:深入理解SQL Server 2005 中的 COLUMNS_UPDATED函数 概述 COLUMNS_UPDATED函数能够出现在INSERT或UPDATE触发器中AS关键字后的任何位置,用来指示表或视图中有哪些列已被插入或者更新.它通常和IF语句一起使用,从而可以根据不同的结果,促使触发器执行不同的操作.因此在DML触发器中,COLUMNS_UPDATED函数是一个非常重要且有用的函数. 不同于UPDATE函数,COLUMNS_UPDATED函数可以工作在多个列中,它使用字节中的位(B

SQL Server 2005中的分区表(六):将已分区表转换成普通表

在前面,我们介绍过怎么样直接创建一个分区表,也介绍过怎么将一个普通表转换成一个分区表.那么,这两种方式创建的表有什么区别呢?现在,我又最新地创建了两个表: 第一个表名为Sale,这个表使用的是<SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?>中的方法创建的,在创建完之后,还为该表添加了一个主键. 第二个表名Sale1,这个表使用的是<SQL Server 2005中的分区表(三):将普通表转换成分区表>中的方法创建的,也就是先创建了

SQL Server 2005中更改sa的用户名和密码

修改数据库SA账号名称的代码如下: 代码如下: Alter LOGIN sa DISABLE Alter LOGIN sa WITH NAME = [systemAccount] "systemAccount" 为SA的新名称,执行完成后刷新一下右侧登录名即可看到修改成功的账号名称. SQL Server 2005修改sa用户密码的方法图文版 一.修改SQL Server 2005中sa用户密码的方法 1. 点击"开始 - 所有程序 - Microsoft SQL Serve

SQL Server 2005中的分区表(四):删除(合并)一个分区

在前面我们介绍过如何创建和使用一个分区表,并举了一个例子,将不 同年份的数据放在不同的物理分区表里.具体的分区方式为: 第1个小表:2010-1-1以前的数据(不包含2010-1-1). 第2个小表:2010-1-1(包含2010-1-1)到2010-12-31之间的数据. 第3个小表:2011-1-1(包含2011-1-1)到2011-12-31之间的数据. 第4个小表:2012-1-1(包含2012-1-1)到2012-12-31之间的数据. 第5个小表:2013-1-1(包含2013-1-

SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?(转)

如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了. 1.数据库中某个表中的数据很多.很多是什么概念?一万条?两万条?还是十万条.一百万条?这个,我觉得是仁者见仁.智者见智的问题.当然数据表中的数据多到查询时明显感觉到数据很慢了,那么,你就可以考虑使用分区表了.如果非要我说一个数值的话,我认为是100万条. 2.但是,数据多了并不是创建分区表的惟一条件,哪怕你有一千万条记录,但是这一千万条记录都是常用的记录,那么最好也不要使用分区表,说不定会得不偿失.只有你的数据是分段

SQL Server 2005中的分区表(五):添加一个分区(转)

所谓天下大事,分久必合,合久必分,对于分区表而言也一样.前面我们介绍过如何删除(合并)分区表中的一个分区,下面我们介绍一下如何为分区表添加一个分区. 为分区表添加一个分区,这种情况是时常会 发生的.比如,最初在数据库设计时,只预计了存放3年的数据,可是到了第4天怎么办?这样的话,我们就可以为分区表添加一个分区,让它把新的数据放在新的分区里.再比如,最初设计时,一个分区用于存放一年的数据,结果在使用的时候才发现,一年的数据太多,想将一个分区中的数据分为两个分区来存放. 遇到这种情况,就必须要为分区

SQL Server 2005中的分区表(三):将普通表转换成分区表(转)

在设计数据库时,经常没有考虑到表分区的问题,往往在数据表承重的负担越来越重时,才会考虑到分区方式,这时,就涉及到如何将普通表转换成分区表的问题了. 那么,如何将一个普通表转换成一个分区表 呢?说到底,只要将该表创建一个聚集索引,并在聚集索引上使用分区方案即可. 不过,这回说起来简单,做起来就复杂了一点.还是接着上面的例子,我们先使用以下SQL语句将原有的Sale表删除. --删除原来的数据表 drop table Sale 然后使用以下SQL语句创建一个新的普通表,并在这个表里插入一些数据. -

SQL Server 2005中的分区表(四):删除(合并)一个分区(转)

在前面我们介绍过如何创建和使用一个分区表,并举了一个例子,将不 同年份的数据放在不同的物理分区表里.具体的分区方式为: 第1个小表:2010-1-1以前的数据(不包含2010-1-1). 第2个小表:2010-1-1(包含2010-1-1)到2010-12-31之间的数据. 第3个小表:2011-1-1(包含2011-1-1)到2011-12-31之间的数据. 第4个小表:2012-1-1(包含2012-1-1)到2012-12-31之间的数据. 第5个小表:2013-1-1(包含2013-1-