图书前言

致    谢

我们都已经拥有那些被认为是必备的SQL Server书籍,每一位认真的SQL Server专业人员都将其骄傲地展示在自己的书架上,但几乎从来不去翻阅。我不喜欢我已帮助撰写的图书只成为书架上的一个纪念品。得到有关本书SQL Server 2008版本的最佳反馈是在一个客户现场,当时我看到一本被翻烂的书上布满了彩色编码的书签。无意中从一个完全陌生人那儿得到的反馈意见对我来说意义重大,并且在本书撰写期间,在很大程度上使我保持情绪高涨,所以我想要感谢那些匿名的IT专业人士和其他花费时间为我们提供反馈的所有人—— 没有你们,本书将不可能顺利付梓。

特别感谢本书所有的作者和贡献者参与到这个项目中,尤其是Justin Langford和Steven Wort,因为他们完全知道将面临的困难,但无论如何他们还是参与进来了。该书上一版的创作团队相当成功,所以对于这一版,我只好全力以赴让它更成功。我从未想象过能凝聚这样一个优秀团队,你只需看一下每个人的简历就能明白我的意思。他们都是伟大的人,我很自豪我的名字能与他们联系在一起。

每个伟大的写作团队的背后,都有一个伟大的技术编辑团队,在完成这个项目期间,我一直很幸运,得到了同行业中最优秀的一些人来指点我们的工作。我非常感谢那些默默无闻的支持者,是他们使得我们的工作经得起推敲。

最后,我想感谢妻子Gemma、孩子Ava和Leighton,感谢他们对我的容忍,容忍我连续地保证是“最后一次”写作项目。我虽然不会那么天真地说:“再也不会有最后一次了”,但我能保证这次我会休息很长时间。

—— Christian Bolton

在过去12个月中,尤其是在写作期间,我体会到了合作的价值,而在此之前我通常并没有这样的合作机会。首先,我必须感谢Christian,他是我的经理和这本书的主要作者,他为我提供了编写其中两章的机会,我以自己的风格和从自己的观点精心撰写了这两章。其次,要感谢两位技术编辑Jonathan Kehayias和Robert Davis。Jonathan的虚拟化知识给我提供了第1章所需要的质量基准,同时他的关于扩展事件的社区贡献,为另一章提供了宝贵的研究资料,这一章的录入工作由Robert准确完成,在此感谢他!最后感谢Neil和Chris。

—— Gavin Payne

我要感谢我的妻子和孩子—— 他们是我所做的几乎所有事情背后的动力。此外,当Christian要求我参与时,我并不知道我之后会患病数月,所以我非常感谢我从他和Wiley与James Roland-Jones团队(他们参与了本书第1版的创作,第1版是本次版本的强大基础)那里所得到的支持。来自于微软SQLCAT团队关于闩锁的工作是非常有帮助的,尤其是Thomes Kejser,他为我仔细审查了这一章。这些都是我应该感谢的贡献者。

—— Rob Farley

前    言

如果你在排除一个很明显的SQL Server问题,那么不仅需要检查SQL Server本身,还需要能够检查底层的操作系统和存储系统。因此,本书试图把这些部分放在一起描述,并且简化对这些组件细节的描述,之后向你介绍成功的SQL Server专业人员日常使用的取得良好效果的工具和技术。

尽管现在有很多关于Windows和硬件内部原理的资料,但是这些资料几乎都没有精选出适合SQL Server专业人员使用的信息。有用的资料要么太简单,要么太深奥,都没有很好地填平SQL Server专业人员和底层原理之间的知识鸿沟。

本书满足了SQL Server专业人员对SQL Server内部原理实用信息的需求,全面介绍了来自于SQL Server社区和SQL Server自身的可用的故障排除工具,实现了以下三个目标:

● 提供了易于理解的关于SQL Server内部体系结构(以及它所依赖的环境)的深入信息。

● 展示了一些免费的和包含在SQL Server内的故障排除工具的实用介绍。

● 针对以上两个目标,使用实例来帮助SQL Server专业人员高效准确地确定运行SQL Server的系统的故障根源所在。

本书读者对象

本书的目标读者对象是那些想成为SQL Server专业人员的人士或已经涉足关系数据库领域的SQL Server专业人员。这里,SQL Server专业人员指的是那些将SQL Server作为主要产品技能,并且愿意持续深入了解这个产品及其使用的人们。

本书并不面向初学者,因此假定你已经具备关于SQL Server的一些基础知识,例如,知道如何安装、使用及配置SQL Server,并且能够意识到仅使用SQL Server提供的原生工具进行SQL Server故障排除是有一定挑战性的这个事实。然而,本书为了那些对本书所提及的一些主题信心不足的读者,竭尽全力地使用很轻松的方式描述了SQL Server的各个方面。

本书主要分为两大部分。第Ⅰ部分描述了底层的内部原理,帮助读者建立理解核心概念的扎实基础,并描述了帮助理解本书第Ⅱ部分介绍的那些工具的输出和配置所需的知识。如果你对底层内部原理的知识掌握得很扎实,那么可以直接跳过这部分内容从第Ⅱ部分开始阅读本书,在需要澄清一些概念时再返回第Ⅰ部分查阅相关内容。

本书主要内容

在描述本书结构和每章内容之前,要先了解一下本书讨论的主题最初是由哪些关键驱动因素和假设确定的。

内部工作原理

在很多与SQL Server相关的工作中,并不需要对SQL Server内部工作原理十分了解。你可以找到很多完善的规范指南和一个非常活跃且很有帮助的社区。可总有一天,你会发现这些帮助都不够用了(通常都是在发生十分严重的问题时)。

例如,在发生意外服务中断的时候,有两种选择,即尽快还原服务还是为了防止这种故障再次发生而收集足够多的数据以检测问题所在。在这两种选择之间,你需要快速决策以达到两种需求的平衡。这种情况下,不可能寻求外部帮助,因为外援可能不太及时。这时如果对SQL Server的内部工作原理有足够的了解,就能快速地独立做出决策。

几年前,一个微软客户在SQL Server上运行的大型关键业务数据库崩溃了。公司决定必须将这个数据库下线直到修复为止,因为这个数据库保存了金融交易数据,任何错误都会导致灾难的发生。

SQL Server中有一个DBCC CHECKDB命令可用来帮助检测和解决数据库崩溃的问题,客户首先运行了这个命令,但在8个小时之后将这个命令终止了,他们决定进行数据库还原。而备份已经损坏,所以他们不得不再次运行CHECKDB命令,这次又花了12个小时的时间才把问题解决。这是个非常耗时的灾难,由于这次故障导致这个客户在故障期间无法向金融市场提供服务,因此这名客户为此支付了巨额罚金。

从这个例子中得到的直观教训就是,在检测到崩溃时,首先要测试备份是否可用,还要了解CHECKDB命令会运行多长时间(CHECKDB在检测到崩溃时会运行更长的时间,因为需要进行另一轮更深入的检查)。当然,如果对SQL Server内部工作原理有一点点的了解,就会得到这种所谓的“最佳实践”。

事实是,这里讲述这个例子是为了讲解这个故障应该如何解决。检测到这个问题的最初错误消息包含了一个损坏页面的详细信息。有了这个数据页的页码,故障排除小组就可以使用DBCC PAGE命令来检查这个页面的头信息,从中找到这个页面对应的数据库对象。这里,这个页面属于非聚集索引(non-clustered index),因此只要重建这个索引就可以了,而不需要将整个数据库下线并且运行CHECKDB或还原整个数据库。这就是为什么知道“内部工作原理”十分重要的原因,只有理解了内部原理,才能独立地找到最佳解决方案。

本书讲述了Windows和SQL Server的内部工作原理,通过这些,你就可以了解你的应用程序的工作环境了。本书还讲述了如何配置服务器以达到不同需求下的最优化配置,以及在出现重大问题但尚未理清头绪的情况下如何避免盲目做决策。

故障排除以及实战经验

本书第Ⅱ部分讲解了一系列免费的故障排除工具,利用这些工具,可以帮助你构建结构化且高效的故障排除策略。因为对于初学者来说,这些工具过于复杂且难学,这些章节里的一些简明实用的指南可大大简化你的工作——无论是日常问题还是严重的问题。

本书这部分基于真实世界的操作经验,提供坚实的案例经验而不是泛泛的“如何操作”之类的建议。这种方法在本书此前的一些版本中,包括SQL Server 2008,得到不少正面反馈,所以我们沿用并进一步扩展了这种理念。

本书结构

本书第I部分首先对SQL Server的体系结构进行一个高层次的概述,其中有部分章节讲述了对于SQL Server非常重要的三个核心资源:内存、存储器和CPU。在这些章节之间的策略部分穿插了其他一些章节的内容,这些章节讲述了对于理解高效故障排除非常重要的一些概念,包括查询处理、查询执行、锁、并发、闩锁、自旋锁以及tempdb数据库。

第Ⅱ部分以人性化和过程驱动方式考虑如何排除故障。然后开始介绍一些工具和技术,这些工具和技术能够很好地独立工作,但使用SQL Nexus可以汇集成一种简单的用于分析的解决方案。

接下来的章节让你开始熟悉扩展事件和SQL Server 2012中引入的新用户界面,逐渐让你适应使用PowerShell进行故障排除,使用动态管理视图(DMV)建立自己的健康检查,以及满足管理大型SQL Server资产的挑战。

最后,你将了解服务器虚拟化对于SQL Server的意义,以及如何确定迁移到虚拟环境的最佳候选者。

下面列出每章的概述,使你在本书的上下文环境中了解各章内容,以便决定从哪里开始阅读。

第1章:SQL Server体系结构

该章简述了一个查询的整个生命周期,对这个生命周期的描述既能足够深入地讲解SQL Server的一些基础概念和体系结构,又不会陷于单独组件复杂的细节中(其中一些组件会在后续章节中详细描述)。

不论你是开发人员,还是数据库管理员或是经验丰富的SQL Server老手,该章的内容对于每一个技能层次的读者都很有价值。

第2章:硬件揭秘

经过筛选、大小合适的现代硬件和存储空间是决定数据库良好的性能和可扩展性的必要基础。遗憾的是,许多数据库业内人士跟上服务器的硬件和I/O子系统的最新发展并不容易,经常依赖于其他人(可能是不熟悉SQL Server的人)去选择硬件和I/O子系统。这样可能会造成大小不恰当和不合适的硬件,从而不能很好地支持不同类型的SQL Server工作负荷。该章介绍了一些工具和技术,帮你在数据库服务器的硬件和容量的选择上进行明智决定。

第3章:理解内存

内存是对SQL Server进行故障排除的一个重要方面,因为内存出问题会导致其他任何的地方出现故障。想成为SQL Server专业人员,理解内存应该是你需要掌握的第一个领域。

该章介绍在Windows上运行的所有应用程序所共用的内存的基础概念,SQL Server如何通过Windows与内存相互作用,以及SQL Server如何管理内部存储。

第4章:存储系统

理解I/O一直是DBA的主要任务之一。不过职责分离在许多环境中是很常见的。很多情况下,负责确保I/O性能和高可用性的职责分配给了SAN管理员。DBA和SAN逐渐会使用不同的语言去描述他们不同的需求和解决方案,这就导致了两个群体之间令人沮丧的隔阂。

不过,在存储世界中如今还是一片混战。直连式存储(DAS)依然十分流行——这主要归功于固态硬盘(SSD)的出现。SSD在显著减少设备数量、能源成本和数据中心占地面积的同时,提供了指数级的性能提升,从而给存储界带来了一股清新空气。

DAS的应对措施也很有趣,因为他们也将权力和职责返回给服务器的主人——对于数据库平台来说就意味着是DBA,让他们进行选择。SQL Server 2012提供了一些非常引人注目的以应用为中心的可用性选择,再一次给用户提供了评估DAS作为他们平台选择的一个机会。

该章帮助读者更好地理解SAN管理员和DBA的需求,还探究了一些SAN管理员所面临的设计层面的选择以及在企业内部提供存储所需的一些平衡。你将会读到一些SAN所能够提供的优势,以及典型的功能和特点,使你能够连接DBA和SAN管理员之间的技术鸿沟。该章还包括了当准备存储时,为了正确决策,SAN管理员需要从DBA那里得到的信息的综述。

第5章:查询处理和执行

SQL Server内部的查询处理涉及很多组成部分,在该章你将了解到查询优化的框架,以及如何利用统计信息和成本找到执行代码的较好途径。该章也介绍了如何阅读执行计划,以及让SQL Server有更多机会建立一个良好的执行计划的代码优化技术。

第6章:锁和并发

“事务”是关系型数据库管理系统(RDBMS)的核心。如果一个数据库每秒不能处理上千条事务,就会被无情地淘汰。不过,缺少数据完整性保证的处理能力是没有意义的。一些高端的数据库平台,比如SQL Server,都具有复杂的机制用于提供极好的处理能力和管理数据的完整性,从而能提供可预计的输出结果。

该章展示了数据库的性能是由“处理事务”的能力决定的。因为糟糕的设计或者繁重的事务负担会严重影响SQL Server的性能,该章从SQL Server机制中的最底层进行讲解,通过事务、锁架构以及通过利用乐观并发模型增强性能来管理数据的完整性。

第7章:闩锁和自旋锁

随着数据量的持续增长,DBA面临着更大、需求更多的系统。如今的工作负荷可以引发SQL Server内部巨大的处理压力,尤其是在默认设置的情况下。其中一个能明显感觉的这种压力的内部区域是闩锁。理想情况下,DBA从来不必担心闩锁问题。闩锁只在保证数据在内存中的完整性时才存在。不过,数据库资源经常等待闩锁,从而导致整个系统速度降低。

该章从闩锁结构的基础开始引导,解释了如何故障排除闩锁争用的问题,最后以最小化和减缓任何风险为原则介绍了一些最佳实践的指导。

第8章:了解tempdb数据库

应用程序使用tempdb来存储临时对象,SQL Server用它来存储处理内部查询的临时结果。一个SQL Server数据库实例只有一个tempdb。自从SQL Server 2005引进一些频繁使用tempdb的新功能以来,比如在线索引和快照隔离级别,tempdb变得越来越重要了。

该章还将介绍哪些功能会用到tempdb,启用这些功能会对性能有哪些影响,以及如何监视和调整数据库以获得最佳性能和可用性。

第9章:故障排除方法论和实践

该章提供了对复杂问题有效的进行故障排除的框架。内容包括如何确定SQL Server问题,何时使用书中讨论的工具,以及如何诊断复杂问题。该章列举了一些实例来概述解决SQL Server问题的方法,还提供了使你能快速找到问题根源的指导。

第10章:通过PerfMon和PAL工具查看服务器性能

自Windows NT4以来,性能监视器(Performance Monitor)就是一个主要的数据收集和报表工具,随着时间的推移,性能监视器越来越大,作用范围也越来越广。

该章演示了如何使用性能监视器来优化数据收集以降低监视对被监视系统的影响,还演示了如何将数据直接导入SQL Server,对结果运行自己的T-SQL查询。该章还介绍了日志性能分析(Performance Analysis of Logs,PAL)工具,使用PAL极大简化了对捕获的大量数据进行的分析。

第11章:通过SQLdiag整合数据收集

SQLdiag是SQL Server 2005中首次引入的一个用于协调性能监视器日志数据收集和SQL跟踪数据收集的强大工具,此外,SQLdiag还能收集其他系统数据。

该章将讲解如何配置、定制及运行SQLdiag,还讲解了Microsoft的性能统计(Performance Statistics,PerfStats)脚本,利用PerfStats可以向SQLdiag协调的数据收集器列表中添加锁、阻塞和等待统计数据。

SQLdiag是高效数据收集的原因所在,任何还没有大量使用过这个工具的用户都必须阅读该章。

第12章:通过SQL Nexus整合一切

SQL Nexus是Microsoft的SQL Server升级工程师开发的一套免费软件工具,它整合了前面章节所描述的其他所有工具的分析和报表功能,因此SQL Nexus可以说是排除SQL Server故障的瑰宝。

利用从PerfStats脚本获得的整合数据集合,SQL Nexus将载入数据库并分析性能监控日志数据、使用ReadTrace(已内嵌在工具中)的SQL 跟踪文件、锁以及阻塞信息(包括实际语句的阻塞链和执行计划的细节)以及聚合的SQL Server等待数据。

该章讲述了如何配置和运行SQL Nexus,以及如何从SQL Nexus生成的报表中得到结论。到目前为止,SQL Nexus是所有花时间学过这个工具的人士的故障排除工具箱中最有用的工具。

第13章:使用扩展事件诊断SQL Server 2012

该章介绍了扩展事件的结构,以及如何利用它来使你的故障排除能力提高一个等级。扩展事件提供了一个低影响、高度灵活且功能强大的捕捉故障排除信息的方法——可让你了解困难和间歇性的问题,这些问题使用传统方法是无法诊断出来的。

第14章:使用PowerShell增强故障排除工具集

Windows平台上的管理活动一般在GUI应用程序中实现,比如SQL Server Management Studio。PowerShell改变了管理方式,尤其是对于故障排除和性能调优等活动。

该章展示了Powershell是如何整合到Windows、WMI、注册表和文件系统中,尤其是如何与SQL Server深度整合。之后你可以探寻使用PowerShell如何进行SQL Server的故障排除,集中于确定哪些关键资源在哪里被使用,以及PowerShell如何帮助解决发现的问题。

该章还包含了一些主动的性能调优脚本,可用来监控和调整SQL Server环境。

第15章:提供SQL Server健康检查

自从动态管理视图(DMV)加入到SQL Server 2005中后,在每个版本的SQL Server中都得到了增强。动态管理视图提供了极其宝贵的丰富信息资源,不仅包括SQL Server的配置、健康状况和性能等指标,还包括数据库个人用户的有用指标。

该章涵盖了大量的动态管理视图查询,你可以把它用作评估SQL Server实例和数据库的健康状况和性能的一个诊断工具。此外,还提供了一些有价值的背景知识,以及可用来正确地解释每个查询的结果的具体秘诀。

第16章:提供可管理性和性能

该章介绍了管理一个SQL Server实体的一些挑战。该章涵盖了各个角度的可管理性,比如配置管理、性能、容量计划和自动化管理。SQL Server内的一些功能也有所介绍,包括基于策略的管理和多服务器管理等。该章提供了关于开箱即用工具、社区解决方案(如企业策略管理框架)和监控工具(如系统中心操作管理器)的好处和限制的实际建议。

第17章:在虚拟环境中运行SQL Server

该章首先介绍了虚拟化概念以及良性争用和恶性争用之间的差异,之后介绍在构建成功的虚拟化数据库平台之前,如何确定对于好的虚拟化候选者。这个过程聚焦于内存、存储、CPU和高可用性。该章最后讨论如何监控实施后的虚拟系统的性能。

阅读此书你还需要什么

本书中的示例已在SQL Server 2012 Standard版、Enterprise版和Developer版中编写并测试。SQL Server 2012的Developer版和Evaluation版易于获得,并与Enterprise版以同样的方式运行。

书中例子的源代码可以从Wrox网站www.wrox.com/retitle.cgi?isbn=1118177657上获得。

一些约定

本书使用两种方式显示源代码:

● 大部分的源代码例子使用等宽字体显示,没有突出显示

● 当前上下文中特别重要的例子或与此前代码有所不同之处会用粗体显示

源代码

在读者学习本书中的示例时,可以手动输入所有代码,也可以使用本书附带的源代码文件。本书使用的所有源代码都可以从本书合作站点http://www.wrox.com/或http://www. tupwk.com.cn/downpage上下载。登录到站点http://www.wrox.com/,使用Search工具或使用书名列表就可以找到本书。接着单击Download Code链接,就可以获得所有的源代码。既可以选择下载一个大的包含本书所有代码的ZIP文件,也可以只下载某个章节中的代码。

在下载代码后,只需用解压缩软件对它进行解压缩即可。另外,也可以进入http://www. wrox.com/dynamic/books/download.aspx上的Wrox代码下载主页,查看本书和其他Wrox图书的所有代码。

勘误表

尽管我们已经尽了各种努力来保证文章或代码中不出现错误,但是错误总是难免的,如果你在本书中找到了错误,例如拼写错误或代码错误,请告诉我们,我们将非常感激。通过勘误表,可以让其他读者避免受挫,当然,这还有助于提供更高质量的信息。

要在网站上找到本书英文版的勘误表,可以登录http://www.wrox.com,通过Search工具或书名列表查找本书,然后在本书的细目页面上,单击Book Errata链接。在这个页面上可以查看到Wrox编辑已提交和粘贴的所有勘误项。完整的图书列表还包括每本书的勘误表,网址是www.wrox.com/misc-pages/booklist.shtml。

如果你发现的错误在我们的勘误表里还没有出现的话,请登录www.wrox.com/contact/ techsupport.shtml并完成那里的表格,把你发现的错误发送给我们。我们会检查你的反馈信息,如果正确,我们将在本书的勘误表页面张贴该错误消息,并在本书的后续版本加以修订。

p2p. wrox.com

要与作者和同行讨论,请加入p2p.wrox.com上的P2P论坛。这个论坛是一个基于Web的系统,便于你张贴与Wrox图书相关的消息和相关技术,与其他读者和技术用户交流心得。该论坛提供了订阅功能,当论坛上有新的消息时,它可以给你传送感兴趣的论题。Wrox作者、编辑和其他业界专家和读者都会到这个论坛上来探讨问题。

在http://p2p.wrox.com上,有许多不同的论坛,它们不仅有助于阅读本书,还有助于开发自己的应用程序。要加入论坛,可以遵循下面的步骤:

(1) 进入p2p.wrox.com,单击Register链接。

(2) 阅读使用协议,并单击Agree按钮。

(3) 填写加入该论坛所需要的信息和自己希望提供的其他可选信息,单击Submit按钮。

你会收到一封电子邮件,其中的信息描述了如何验证账户,完成加入过程。

加入论坛后,就可以张贴新消息,响应其他用户张贴的消息。可以随时在Web上阅读消息。如果要让该网站给自己发送特定论坛中的消息,可以单击论坛列表中该论坛名旁边的Subscribe to this Forum图标。

要想了解更多的有关论坛软件的工作情况,以及P2P和Wrox图书的许多常见问题的解答,就一定要阅读FAQ,只需在任意P2P页面上单击FAQ链接即可。