澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

数据库错误检查与修补,读书笔记

2019-10-21 作者:数据库网络   |   浏览(59)
  1. 使用Upgrade Adviser评估升级前需要解决的事情。

/***********高效维护数据库的关键技巧***********/

在网上找了好长时间利用SQL Server发送邮件,都一直没有成功,最后还是自己摸索的,拿出来给大家分享一下。

 

https://msdn.microsoft.com/zh-cn/library/ms144256(v=sql.110).aspx.aspx)

1、

https://msdn.microsoft.com/zh-cn/library/ms144256(v=sql.120).aspx.aspx)

1.今天第二次看到对于自动增长的建议,由于自动增长会使SQL Server出现断裂,日志文件在内部被划分为多个称为“虚拟日志文件”(VLF) 的片段,

 澳门新萄京官方网站 1

 

 

与日志有关的操作(如为事务性复制/回滚而读取日志)、日志备份乃至 SQL Server 2000 中的触发器(触发器的实现已在 SQL Server 2005 中更改

 2、

通过执行下列操作检查指定数据库中所有对象的逻辑和物理完整性:

  1. 查看新版本的变更的内容和遗弃的功能. 如果升级后出现某些无名肿痛时,可以考虑是否因为这些改变造成。

为行版本框架,而不是事务日志)

澳门新萄京官方网站 2

  • 对数据库运行 DBCC CHECKALLOC。
  • 对数据库中的每个表和视图运行 DBCC CHECKTABLE。
  • 对数据库运行 DBCC CHECKCATALOG。
  • 验证数据库中每个索引视图的内容。
  • 使用 FILESTREAM 在文件系统中存储 varbinary(max) 数据时,验证表元数据和文件系统目录和文件之间的链接级一致性。
  • 验证数据库中的 Service Broker 数据。

SQL Server 2012 中不推荐使用的数据库引擎功能.aspx)

如果数据的初始大小为 50GB,但您知道在接下来的六个月内将再添加 50GB 的数据,那么应创建 100GB 的数据文件,而不是多次将其增大以达到该

 

这意味着不必从 DBCC CHECKDB 单独运行 DBCC CHECKALLOC、DBCC CHECKTABLE 或 DBCC CHECKCATALOG 命令。有关这些命令执行的检查的详细信息,请参阅这些命令的说明。

SQL Server 2012 中数据库引擎功能的行为更改.aspx)

大小。

3、

澳门新萄京官方网站 3Transact-SQL 语法约定

SQL Server 2012 中废止的数据库引擎功能.aspx)

应注意不要以任何方式启用缩减。缩减可用于减小数据或日志文件的大小,但它是一个干扰很大、极耗资源的过程,但是经历过日志文件增加到100多

澳门新萄京官方网站 4

语法

Breaking Changes to Database Engine Features in SQL Server 2012.aspx)

Gdown机的情况,只能定时自动收缩啊.ALTER DATABASE MyDatabase SET AUTO_SHRINK OFF;

 


 

2.碎片的问题

4、

复制

SQL Server 2014 中不推荐使用的数据库引擎功能.aspx)

逻辑扫描碎片是由称为页面分隔的操作而引发的。当必须在特定索引页(根据索引键定义)中插入记录但页面中并没有足够的空间来容纳所插入的数

澳门新萄京官方网站 5

DBCC CHECKDB 
[     [ ( database_name | database_id | 0         [ , NOINDEX         | , { REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD } ]         ) ]     [ WITH         {             [ ALL_ERRORMSGS ]             [ , EXTENDED_LOGICAL_CHECKS ]             [ , NO_INFOMSGS ]             [ , TABLOCK ]             [ , ESTIMATEONLY ]             [ , { PHYSICAL_ONLY | DATA_PURITY } ]         }     ]
]

SQL Server 2014 中废止的数据库引擎功能.aspx)

据时,便会发生这种情况。该页面会被分割一半,大约 50% 的记录被移到新分配的页面。通常,这一新页面实际上并不与旧页面相邻,因此,被称

 

参数

SQL Server 2014 中数据库引擎功能的重大更改.aspx)

为零碎的页面。扩展盘区扫描碎片在概念上与此类似。表格/索引结构内的碎片会影响 SQL Server 执行有效扫描的能力,无论是对整个表格/索引进

5、


SQL Server 2014 中数据库引擎功能的行为更改.aspx)

行扫描还是按查询 WHERE 子句(例如,SELECT * FROM MyTable WHERE Column1 > 100 AND Column1 < 4000)进行扫描都会受到影响。看图

澳门新萄京官方网站 6

database_name | database_id | 0
要为其运行完整性检查的数据库的名称或 ID。如果未指定,或者指定为 0,则使用当前数据库。数据库名称必须符合有关标识符的规则。

 

 SQL Server 2005 Enterprise Edition 中,索引重新生成可以联机进行,但有几个限制。而重新组织使用原位算法对索引进行压缩并整理碎片;它

 

  1. 使用DBCC CHECKDB WITH DATA_PURITY 检查数据库。

运行只需要 8KB 的额外空间,而且始终是联机运行的。在 SQL Server 2005 中,用于调查的命令为 ALTER INDEX …… REBUILD 用于重新生成索引

 6、

NOINDEX
指定不应对用户表的非聚集索引执行会占用很大系统开销的检查。这将减少总执行时间。NOINDEX 不影响系统表,因为总是对系统表索引执行完整性检查。

DBCC CHECKDB (Transact-SQL).aspx)

,ALTER INDEX … REORGANIZE 用于重新组织索引。此语法分别取代了 SQL Server 2000 中的命令 DBCC DBREINDEX 和 DBCC INDEXDEFRAG。实际上

澳门新萄京官方网站 7

对于在 SQL Server 2005 及更高版本中创建的数据库,默认情况下将启用列值完整性检查,并且不需要使用 DATA_PURITY 选项。  对于从 SQL Server 的早期版本升级的数据库,默认情况下不启用列值检查,直到 DBCC CHECKDB WITH DATA_PURITY 已在数据库中正确运行为止。 然后,DBCC CHECKDB 将默认检查列值完整性。

,在 SQL Server 2000 中,我专门编写了索引重新组织代码,用于替代重新生成索引,它的优点是联机且节省空间。

 

REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD
指定 DBCC CHECKDB 修复发现的错误。指定的数据库必须处于单用户模式,才能使用以下修复选项之一。

如果指定了 PHYSICAL_ONLY,则不执行列完整性检查。

不要只是选择每晚或每周重新生成或重新组织所有索引,如使用维护计划选项,应该找出哪些索引被分割为碎片以及删除碎片是否会带来任何好处.

 7、

REPAIR_ALLOW_DATA_LOSS
尝试修复报告的所有错误。这些修复可能会导致一些数据丢失。

 

使用 DMV sys.dm_db_index_physical_stats(或 SQL Server 2000 中的 DBCC SHOWCONTIG)来定期确定哪些索引被分割为碎片,然后选择是否以及

澳门新萄京官方网站 8

REPAIR_FAST
保留该语法只是为了向后兼容。未执行修复操作。

当不确定数据是否是从SQL 2005之前的版本逐步升级而来,则最好使用DATA_PURITY。

如何对其进行操作。

 

REPAIR_REBUILD
执行不会丢失数据的修复。这包括快速修复(如修复非聚集索引中缺少的行)以及更耗时的修复(如重新生成索引)。

 

***sys.dm_db_index_physical_stats

 8、

REPAIR_REBUILD 不修复涉及 FILESTREAM 数据的错误。

  1. 使用DBCC UPDATEUSAGE。它能找出并修改目录视图中不准确的页和行计数,从而确保sp_spaceused的结果是较准确的。

函数的执行模式将确定为了获取此函数所使用的统计信息数据而执行的扫描级别。mode 被指定为 LIMITED、SAMPLED 或 DETAILED。

澳门新萄京官方网站 9

澳门新萄京官方网站 10重要提示:

DBCC UPDATEUSAGE (Transact-SQL)

LIMITED 模式运行最快,扫描的页数最少。对于索引,只扫描 B 树的父级别页(即叶级别以上的页)。对于堆,只检查关联的 PFS 和 IAM 页;不

 

仅将 REPAIR 选项作为最后手段使用。若要修复错误,建议您通过备份进行还原。修复操作不会考虑表本身或表之间可能存在的任何约束。如果指定的表与一个或多个约束有关,建议您在修复操作后运行 DBCC CHECKCONSTRAINTS。如果必须使用 REPAIR,则运行不带有修复选项的 DBCC CHECKDB 来查找要使用的修复级别。如果使用 REPAIR_ALLOW_DATA_LOSS 级别,则建议您在运行带有此选项的 DBCC CHECKDB 之前备份数据库。

 

扫描堆的数据页。在 SQL Server 2005 中,在 LIMITED 模式下扫描堆的所有页。

 9、

  1. 更新数据库的统计信息

在 LIMITED 模式下,compressed_page_count 为 NULL,这是因为数据库引擎只能扫描 B 树的非叶页和堆的 IAM 和 PFS 页。使用 SAMPLED 模式可

澳门新萄京官方网站 11

ALL_ERRORMSGS
显示针对每个对象报告的所有错误。在 SQL Server 2008 Service Pack 1 (SP1) 中,默认情况下显示所有错误消息。指定或省略此选项都不起作用。在 SQL Server 的早期版本(SQL Server 2005 SP3 除外)中,如果未指定 ALL_ERRORMSGS,则只为每个对象显示前 200 条错误消息。按对象 ID 对错误消息排序,从 tempdb 数据库生成的那些消息除外。

SP_UPDATESTATS更新库中所有的用户表和内部表的统计信息。

以获取 compressed_page_count 的估计值,使用 DETAILED 模式可以获取 compressed_page_count 的实际值。SAMPLED 模式将返回基于索引或堆中

 

在 SQL Server Management Studio 中,返回的最大错误消息数为 1000。使用 Management Studio 时,如果指定了 ALL_ERRORMSGS,则可能需要多次执行 DBCC CHECKDB 才能得到完整的错误列表。当您指定 ALL_ERRORMSGS 时,我们建议您使用 sqlcmd 实用工具来执行 DBCC 命令,或计划 SQL Server 代理作业来执行该命令并将输出定向到文件。这两种方法中的任一种都可以确保执行该命令一次即可报告所有错误消息。

UPDATE STATISTICS (Transact-SQL),提供了更新操作控制选项,对更新和迁移的库,使用fullscan会生成更准确的统计信息。

所有页的 1% 样本的统计信息。如果索引或堆少于 10,000 页,则使用 DETAILED 模式代替 SAMPLED。

 10、

EXEC sp_MSforeachtable @command1='UPDATE STATISTICS ? WITH FULLSCAN';

DETAILED 模式将扫描所有页并返回所有统计信息。

澳门新萄京官方网站 12

EXTENDED_LOGICAL_CHECKS
如果兼容级别为 100 (SQL Server 2008) 或更高,则对索引视图、XML 索引和空间索引(如果存在)执行逻辑一致性检查。

 

从 LIMITED 到 DETAILED 模式,速度将越来越慢,因为在每个模式中执行的任务越来越多。若要快速测量表或索引的大小或碎片级别,请使用 

 

有关详细信息,请参阅本主题后面“备注”部分中的“对索引执行逻辑一致性检查”。

  1. 如果有必要更新视图的元数据

LIMITED 模式。它的速度最快,并且对于索引的 IN_ROW_DATA 分配单元中的每个非叶级别,不返回与其对应的一行。

 11、

sp_refreshview (Transact-SQL).aspx)

CREATE DATABASE Test;

澳门新萄京官方网站 13

NO_INFOMSGS
取消显示所有信息性消息。

 

GO

 

  1. SQL 2012开始不支持AWE,避免使用32位的操作系统

USE Test;

 12、

TABLOCK
使 DBCC CHECKDB 获取锁,而不使用内部数据库快照。这包括一个短期数据库排他 (X) 锁。TABLOCK 可使 DBCC CHECKDB 在负荷较重的数据库上运行得更快,但 DBCC CHECKDB 运行时会减少数据库上可获得的并发性。有关锁的详细信息,请参阅锁模式。

 

GO

澳门新萄京官方网站 14

TABLOCK 限制执行的检查;DBCC CHECKCATALOG 未对数据库运行并且 Service Broker 数据未进行验证。

  1. 对于原地升级的数据库,注意最多只能跨三个版本限制。

CREATE SCHEMA Person;

 

也就是说SQL2000是无法直接升级到SQL2012/2014,而需要升级到2005或2008或者2008R2再升级到2012/2014.

GO

 到这里,邮件应该是已经能发送成功了。大家可以试一下。。

ESTIMATEONLY
显示运行包含所有其他指定选项的 DBCC CHECKDB 时所需的 tempdb 空间估计数量。不执行实际数据库检查。

 

CREATE Table Person.Address(c1 int);

 MSSQL 2008也是可以的哦。。

9.对于SQL 2014,还需要考虑是需要将兼容改成120。

GO

 下面介绍2个语句,是用来查询发送邮件状态的

PHYSICAL_ONLY
将检查限制为页和记录标头的物理结构完整性、B 树的物理结构以及数据库的分配一致性。设计该检查是为了以较小的开销检查数据库的物理一致性,但它还可以检测会危及用户数据安全的残缺页、校验和错误以及常见的硬件故障。

改成120则会使用新基数估计(Cardinality Estimator)方式:https://msdn.microsoft.com/zh-cn/library/dn600374.aspx

SELECT * FROM sys.dm_db_index_physical_stats

select * from msdb.dbo.sysmail_allitems
select * from msdb.dbo.sysmail_event_log

DBCC CHECKDB 完成运行所需的时间可能比早期版本要长得多。出现此现象的原因是:

对于数据库是否需要新的CE,需要经过测试。参考:https://msdn.microsoft.com/en-us/library/dn673537.aspx

    (DB_ID(N'Test'), OBJECT_ID(N'Person.Address'), NULL, NULL , 'DETAILED');

第一条语句里有一个sent_status字段,就可以清楚的看到发送邮件是否功能,第二条语句可以查看邮件发送的日志** **

  • 逻辑检查更加全面。
  • 要检查的某些基础结构更为复杂。
  • 引入了许多新的检查以包含新增功能。

 

GO

最后再说一下如何用sql语句来发送邮件

因此,使用 PHYSICAL_ONLY 选项可能会大幅减少对较大数据库运行 DBCC CHECKDB 所需的时间,所以对需要频繁检查的生产系统,建议使用此选项。我们仍然建议完整地定期执行 DBCC CHECKDB。这些运行的执行频率取决于各业务和生产环境特定的因素。

  1. 如果有必要,还可以了解一下产品的发行说明,知道一些产品已知的问题。

USE AdventureWorks;

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'TestProfile',--图3里的“配置文件名”
@recipients = '123@qq.com;456@qq.com',--收件人的邮箱,多个邮箱用分号“;”分开
@subject = '查询结果',--邮件主题
@body='查询结果在附件中',--邮件内容
@query = 'select * from China.dbo.s_province',--查询语句
@attach_query_result_as_file = 1,--查询在邮件中体现形式,0为邮件内容,1为邮件附件,默认0
@query_attachment_filename='aaa.txt'--邮件附件文件名

PHYSICAL_ONLY 始终表示 NO_INFOMSGS,不能与任何一个修复选项一同使用。

https://msdn.microsoft.com/zh-cn/library/dn169381(v=sql.14).aspx.aspx)

GO

 

澳门新萄京官方网站 15注意:

 

DROP DATABASE Test;

 用sp_send_dbmail来发送邮件还可以有很多参数,比如说邮件格式可以是text或html等等,具体参数可以参考MSDN对对sp_send_dbmail的详细解释

指定 PHYSICAL_ONLY 会使 DBCC CHECKDB 跳过对 FILESTREAM 数据的所有检查。

  1. 升级后的数据库在正式投入服务前,最好做一次完整备份,以防万一。

GO

 http://msdn.microsoft.com/zh-cn/library/ms190307(v=sql.90).aspx.aspx)

 

SQL Server 2008 中的碎片计算算法比 SQL Server 2000 中的更精确。因此,碎片值显得更高。例如,在 SQL Server 2000 中,如果一个表的第 

 

DATA_PURITY
使 DBCC CHECKDB 检查数据库中是否存在无效或越界的列值。例如,DBCC CHECKDB 检测日期和时间值大于或小于 datetime 数据类型的可接受范围的列,或者小数位数或精度值无效的 decimal 或近似 numeric 数据类型列。

11 页和第 13 页在同一区中,而第 12 页不在该区中,该表不被视为含有碎片。但是访问这些页需要两次物理 I/O 操作,因此,在 SQL Server 

 

对于在 SQL Server 2005 及更高版本中创建的数据库,默认情况下将启用列值完整性检查,并且不需要使用 DATA_PURITY 选项。对于从 SQL Server 的早期版本升级的数据库,默认情况下不启用列值检查,直到 DBCC CHECKDB WITH DATA_PURITY 已在数据库中正确运行为止。然后,DBCC CHECKDB 将默认检查列值完整性。有关从 SQL Server 的早期版本升级数据库会对 CHECKDB 有何影响的详细信息,请参阅本主题的“备注”部分。

2008 中,这将算作碎片。

MSSQL2005发送邮件SQL代码

 

 

如果指定了 PHYSICAL_ONLY,则不执行列完整性检查。

索引或堆的碎片级别显示在 avg_fragmentation_in_percent 列中。对于堆,此值表示堆的区碎片。对于索引,此值表示索引的逻辑碎片。与 DBCC 

无法使用 DBCC 修复选项来纠正该选项所报告的验证错误。

SHOWCONTIG 不同,这两种情况下的碎片计算算法都会考虑跨越多个文件的存储,因而结果是精确的。

***DBCC SHOWCONTIG msdn.microsoft.com/library/aa258803

****SQL Server的信息统计 图4

请注意,可通过打开 AUTO_CREATE_STATISTICS 和 AUTO_UPDATE_STATISTICS 数据库选项自动创建和维护统计数据,如图 4 所示。这些选项默认情

况下是打开的,但如果您只是继承了数据库,请进行检查加以确认。有时统计数据可能已过时,在这种情况下可以通过对特定的统计数据集使用 

UPDATE STATISTICS 操作手动更新它们。或者,可以使用 sp_updatestats 存储过程,该过程会更新所有过时的统计数据(在 SQL Server 2000 中

,sp_updatestats 更新所有统计数据,无论期限为何)。

有关统计数据的详细信息,请参阅白皮书“SQL Server 2005 中的查询优化器所使用的统计信

息”microsoft.com/technet/prodtechnol/sql/2005/qrystats.mspx

3.损坏检测

一个最常见的问题是当发生电源故障时磁盘驱动器正在写出数据库页。如果驱动器无法在电源耗尽之前完成写操作(或者写操作已缓存,但没有足够

的备用电池来刷新驱动器的缓存),就可能在磁盘上产生不完整的页面映像。因为 8KB 数据库页实际上由 16 个连续的 512 字节扇区组成,所以这

种情况可能会发生。不完整的写操作可能写出新页面中的一些扇区,但也会留下上一页面映像中的一些扇区。这种情况称为破损页。如果发生了这一

情况,应如何检测呢?

在 SQL Server 2005 及后续版本中,提供了一种更加全面的机制,称为页面校验和,可以检查页中的任何损坏。这包括在写出页面之前编写整页校

验和,然后在重新读取该页时对其进行检测,就象检测破损页一样。在启用页面校验和之后,必须将页读入缓冲池,以某种方式进行更改,然后在其

受页面校验和保护之前将其重新写出到磁盘。

因此,最好的做法是为 SQL Server 2005 之后的版本启用页面校验和,为 SQL Server 2000 启用破损页检测。要启用页面校验和,请使用:

 ALTER DATABASE MyDatabase SET PAGE_澳门新萄京官方网站,VERIFY CHECKSUM;

要为 SQL Server 2000 启用破损页检测,请使用:

 ALTER DATABASE MyDatabase SET TORN_PAGE_DETECTION ON;

通过这些机制,您可以在某个页面出现损坏时进行检测,但只能在读取页面时进行。如何能够便于强制读取所有分配的页面?执行此操作(以及查找

其他任何类型的损坏)的最好方法是使用 DBCC CHECKDB 命令。这里有一篇作者博客里的文章"CHECKDB From Every Angle" 

(sqlskills.com/blogs/paul)

 DBCC CHECKDB ('MyDatabase') WITH NO_INFOMSGS, ALL_ERRORMSGS;

这篇文章解答了我的几个问题,笔记如下. 文章:  作者博客 

  1. 数据库错误检查与修补,读书笔记。自动增长 今天第二次看到对于自动增长的建议,由于自动增长会使SQL Server出现断裂,日志文件在内部被划分为多个称为“虚拟日志文件”(VLF) 的片段,与日志有关的操作(如为事务性复制/回滚而读取日志)、日志备份乃至 SQL Server 2000 中的触发器(触发器的实现已在 SQL Server 2005 中更改为行版本框架,而不是事务日志)
    如果数据的初始大小为 50GB,但您知道在接下来的六个月内将再添加 50GB 的数据,那么应创建 100GB 的数据文件,而不是多次将其增大以达到该大小。
    应注意不要以任何方式启用缩减。缩减可用于减小数据或日志文件的大小,但它是一个干扰很大、极耗资源的过程,但是经历过日志文件增加到100多Gdown机的情况,只能定时自动收缩啊.ALTER DATABASE MyDatabase SET AUTO_SHRINK OFF;
  2. 碎片的问题: 逻辑扫描碎片是由称为页面分隔的操作而引发的。当必须在特定索引页(根据索引键定义)中插入记录但页面中并没有足够的空间来容纳所插入的数据时,便会发生这种情况。该页面会被分割一半,大约 50% 的记录被移到新分配的页面。通常,这一新页面实际上并不与旧页面相邻,因此,被称为零碎的页面。扩展盘区扫描碎片在概念上与此类似。表格/索引结构内的碎片会影响 SQL Server 执行有效扫描的能力,无论是对整个表格/索引进行扫描还是按查询 WHERE 子句(例如,SELECT * FROM MyTable WHERE Column1 > 100 AND Column1 < 4000)进行扫描都会受到影响。看图

    SQL Server 2005 Enterprise Edition 中,索引重新生成可以联机进行,但有几个限制。而重新组织使用原位算法对索引进行压缩并整理碎片;它运行只需要 8KB 的额外空间,而且始终是联机运行的。在 SQL Server 2005 中,用于调查的命令为 ALTER INDEX …… REBUILD 用于重新生成索引,ALTER INDEX … REORGANIZE 用于重新组织索引。此语法分别取代了 SQL Server 2000 中的命令 DBCC DBREINDEX 和 DBCC INDEXDEFRAG,或者重建索引Create Index With Drop_Existing 参看 [DBA].[IndexMaintaine].[IndexDrag_2000]。实际上,在 SQL Server 2000 中,我专门编写了索引重新组织代码,用于替代重新生成索引,它的优点是联机且节省空间。
    不要只是选择每晚或每周重新生成或重新组织所有索引,如使用维护计划选项,应该找出哪些索引被分割为碎片以及删除碎片是否会带来任何好处.使用 DMV sys.dm_db_index_physical_stats (或 SQL Server 2000 中的 DBCC SHOWCONTIG)来定期确定哪些索引被分割为碎片,然后选择是否以及如何对其进行操作。mode 被指定为 LIMITED、SAMPLED 或 DETAILED。
    LIMITED 模式运行最快,扫描的页数最少。对于索引,只扫描 B 树的父级别页(即叶级别以上的页)。对于堆,只检查关联的 PFS 和 IAM 页;不扫描堆的数据页。在 SQL Server 2005 中,在 LIMITED 模式下扫描堆的所有页。在 LIMITED 模式下,compressed_page_count 为 NULL,这是因为数据库引擎只能扫描 B 树的非叶页和堆的 IAM 和 PFS 页。使用 SAMPLED 模式可以获取 compressed_数据库错误检查与修补,读书笔记。page_count 的估计值,使用 DETAILED 模式可以获取 compressed_page_count 的实际值。
    SAMPLED 模式将返回基于索引或堆中所有页的 1% 样本的统计信息。如果索引或堆少于 10,000 页,则使用 DETAILED 模式代替 SAMPLED。
    DETAILED 模式将扫描所有页并返回所有统计信息。
    从 LIMITED 到 DETAILED 模式,速度将越来越慢,因为在每个模式中执行的任务越来越多。若要快速测量表或索引的大小或碎片级别,请使用 LIMITED 模式。它的速度最快,并且对于索引的 IN_ROW_DATA 分配单元中的每个非叶级别,不返回与其对应的一行。

    1. CREATE DATABASE Test;
      GO
      USE Test;
      GO
      CREATE SCHEMA Person;
      GO
      CREATE Table Person.Address(c1 int);
      GO
      SELECT * FROM sys.dm_db_index_physical_stats
          (DB_ID(N'Test'), OBJECT_ID(N'Person.Address'), NULL, NULL , 'DETAILED');
      GO
      USE AdventureWorks;
      GO
      DROP DATABASE Test;
      GO
      

    SQL Server 2008 中的碎片计算算法比 SQL Server 2000 中的更精确。因此,碎片值显得更高。例如,在 SQL Server 2000 中,如果一个表的第 11 页和第 13 页在同一区中,而第 12 页不在该区中,该表不被视为含有碎片。但是访问这些页需要两次物理 I/O 操作,因此,在 SQL Server 2008 中,这将算作碎片。索引或堆的碎片级别显示在 avg_fragmentation_in_percent 列中。对于堆,此值表示堆的区碎片。对于索引,此值表示索引的逻辑碎片。与 DBCC SHOWCONTIG  不同,这两种情况下的碎片计算算法都会考虑跨越多个文件的存储,因而结果是精确的。

    create index idx_charge_no on charge(charge_no)
    dbcc showcontig(charge,idx_charge_no)
    - 扫描页数................................: 186 --这个索引占了186个数据页
    - 扫描区数..............................: 24 --这些数据页分布在24个extent中
    - 区切换次数..............................: 23 --由于一个extent是连续的8个页所以186/8与等于24
    - 每个区的平均页数........................: 7.8
    - 扫描密度 [最佳计数:实际计数].......: 100.00% [24:24]
    - 逻辑扫描碎片 ..................: 0.54%
    - 区扫描碎片 ..................: 33.33%
    - 每页的平均可用字节数........................: 31.5
    - 平均页密度(满).....................: 99.61%
    

     

  1. SQL Server的信息统计 图4请注意,可通过打开 AUTO_CREATE_STATISTICS 和 AUTO_UPDATE_STATISTICS 数据库选项自动创建和维护统计数据,如图 4 所示。这些选项默认情况下是打开的,但如果您只是继承了数据库,请进行检查加以确认。有时统计数据可能已过时,在这种情况下可以通过对特定的统计数据集使用 UPDATE STATISTICS 操作手动更新它们。或者,可以使用 sp_updatestats 存储过程,该过程会更新所有过时的统计数据(在 SQL Server 2000 中,sp_updatestats 更新所有统计数据,无论期限为何)。有关统计数据的详细信息,请参阅白皮书“SQL Server 2005 中的查询优化器所使用的统计信息”
  1. 损坏检测 一个最常见的问题是当发生电源故障时磁盘驱动器正在写出数据库页。如果驱动器无法在电源耗尽之前完成写操作(或者写操作已缓存,但没有足够的备用电池来刷新驱动器的缓存),就可能在磁盘上产生不完整的页面映像。因为 8KB 数据库页实际上由 16 个连续的 512 字节扇区组成,所以这种情况可能会发生。不完整的写操作可能写出新页面中的一些扇区,但也会留下上一页面映像中的一些扇区。这种情况称为破损页。如果发生了这一情况,应如何检测呢?在 SQL Server 2005 及后续版本中,提供了一种更加全面的机制,称为页面校验和,可以检查页中的任何损坏。这包括在写出页面之前编写整页校验和,然后在重新读取该页时对其进行检测,就象检测破损页一样。在启用页面校验和之后,必须将页读入缓冲池,以某种方式进行更改,然后在其受页面校验和保护之前将其重新写出到磁盘。因此,最好的做法是为 SQL Server 2005 之后的版本启用页面校验和,为 SQL Server 2000 启用破损页检测。要启用页面校验和,请使用: ALTER DATABASE MyDatabase SET PAGE_VERIFY CHECKSUM;要为 SQL Server 2000 启用破损页检测,请使用: ALTER DATABASE MyDatabase SET TORN_PAGE_DETECTION ON;通过这些机制,您可以在某个页面出现损坏时进行检测,但只能在读取页面时进行。如何能够便于强制读取所有分配的页面?执行此操作(以及查找其他任何类型的损坏)的最好方法是使用 DBCC CHECKDB 命令。这里有一篇作者博客里的文章"CHECKDB From Every Angle" DBCC CHECKDB ('MyDatabase') WITH NO_INFOMSGS, ALL_ERRORMSGS;

本文由澳门新萄京官方网站发布于数据库网络,转载请注明出处:数据库错误检查与修补,读书笔记

关键词: