【IT168专稿】我们在SQL Server 2008 R2数据管理新纪元一文中介绍了SQL Server 2008 R2的管理利器——SQL Server Utility。这一次我们将深入剖析这一管理工具。
SQL Server Utility的架构

从SQL Server Utility的架构图中可以看出SQL Server Utility的基础是Utility Control Point。DBA可以在企业内创建多个SQL Server Utility,一个SQL Server Utility可以用于管理多个SQL Server实例。一个SQL Server实例仅能创建一个UCP,每个SQL Server Utility都必须而且仅能依赖于一个UCP。

DBA使用SQL Server Utility的大致工作流程是:
• 在某个SQL Server实例上创建UCP,用于宿主UCP的实例上会创建一个UCP用于存储各类信息的数据仓库(sysutility_mdw),同时该实例会创建三个作业用于处理改数据仓库中的数据:
o sysutility_get_views_data_into_cache_tables
o sysutility_get_cache_tables_data_into_aggregate_tables_hourly
o sysutility_get_cache_tables_data_into_aggregate_tables_daily
• 将需要被托管的SQL Server实例添加到UCP中,被托管实例上会创建一个作业用于收集并上载该被托管实例的配置及性能信息并在该实例的msdb数据库中创建若干表及代码对象:
o sysutility_mi_collect_and_upload
o sysutility_mi_collect_performance
• 被托管实例上的两个作业每个15分钟运行一次并将收集到的数据上载到UCP数据仓库 (sysutility_mdw)。
• DBA通过Utility Explorer查看各项信息。
SQL Server Utility作业剖析
sysutility_mi_collect_performance
该作业在被托管实例上每隔15秒就会运行一次,这个作业调用的是位于MSDB数据库中的sp_sysutility_mi_collect_dac_execution_statistics_internal存储过程,该存储过程会收集被托管DAC的性能数据,并上载到被托管实例的msdb数据库中。
sysutility_mi_collect_and_upload
该作业每隔15分钟才运行一次,这个作业调用的是一段PowerShell脚本,主要用于收集处理器性能统计数据及逻辑卷的容量信息,同样这个作业收集到的数据都是传向被托管实例的msdb数据库。
该作业同时还负责调用msdb数据库中的存储过程sp_sysutility_mi_upload,该存储过程会进一步调用msdb数据库中的另一个系统存储过程sp_syscollector_run_collection_set,而这个存储过程一看便知道属于SQL Server 2008 Data Collection功能所使用的(关于这个我们后面会有详细的介绍)。
sysutility_get_views_data_into_cache_tables
该作业每隔15分钟运行一次,主要任务是将数据从相关的性能数据从sysutility_ucp_staging架构复制到sysutility_ucp_core架构下,然后调用一段PowerShell脚本对性能数据进行评估,最后计算评估结果。
sysutility_get_cache_tables_data_into_aggregate_tables_hourly
该作业每个1小时运行一次,主要任务是对sysutility_ucp_core架构下的处理器及存储空间利用数据进行聚合并存储聚合结果。
sysutility_get_cache_tables_data_into_aggregate_tables_daily
该作业每天运行一次,其主要任务同上面一个任务相似,也是执行聚合,不过这次聚合的粒度不是小时,而是天,另外这个任务在聚合完成后还会清除过期的缓存数据及健康度评估数据(包括前一天的详细数据、小时粒度的聚合数据以及一月前的天粒度聚合数据)。
SQL Server Utility与Data Collection
经过进一步的探索,我们会发现SQL Server Utility其实依赖于SQL Server 2008的一项功能——Data Collection。Data Collection对于已经接触SQL Server 2008的DBA来说应该不陌生,因为微软已经在SQL Server 2008发布的时候大肆宣传过。不过当时仅有三个Collection Set,Disk Usage、Query Statistics及Server Activity。
不过在SQL Server 2008 R2中我们会发现一个新的Collection Set——Utility Information。没错,某些读者可能已经猜到这个新的Collection Set与我们正在介绍的SQL Server Utility有着千丝万缕的关系。
打开这个Collection Set我们就可以清楚地看到其中定义了一项Generic T-SQL类型的收集项目,主要是调用msdb中的若干存储过程和数据表,例如sp_sysutility_mi_get_dac_execution_statistics_internal存储过程。

继续翻到这个Data Collection Set的Upload设置页我们甚至还能发现sysutility_mdw数据仓库在整个流程中的位置(怪不得我一直没有在作业和存储过程定义中找到UCP是如何将数据载入这个最终的数据仓库中)。

了解了这些,DBA应该大致了解SQL Server Utility的工作流程了吧。当然,对于新接触SQL Server 2008的DBA来说就应该去看看有关Data Collection Set的介绍了,相信对于理解SQL Server Utility的工作原理是非常有帮助的。

SQL Server Utility配置
SQL Server Utility的需求
DBA们也许已经注意到了,创建UCP需要一个SQL Server实例,而UCP又可以用于管理多个SQL Server实例。我们暂将用于创建UCP的实例成为UCP宿主实例,而将UCP管理的实例成为托管实例。
SQL Server Utility对UCP宿主实例以及UCP托管实例都是有一些限制条件的,分别是:
• UCP宿主实例以及UCP托管实例的SQL Server的版本必须在10.5以上。
• UCP宿主实例以及UCP托管实例都必须是数据库引擎实例。
• UCP宿主实例以及UCP托管实例必须工作在同一个域或具备双向信任关系的域内。
• UCP宿主实例以及UCP托管实例的SQL Server服务帐号都必须拥有对活动目录中用户对象的读权限。
• 在Windows Server 2003中,SQL Server Agent服务帐号必须是Performance Monitor User组成员。
以上这些限制除第一条有些苛刻,第二条有些遗憾外,其他尚属合理。
第一条限制明显会限制SQL Server Utility的应用,10.5的版本号就意味着SQL Server Utility将完全无法支持SQL Server 2008 R2之外的版本,甚至是发布没有多久的SQL Server 2008。
SQL Server Utility存储消耗
正如许多管理工具一样,UCP将收集到的数据存储在一个数据仓库中,这就会带来存储的问题。为了避免存储空间耗尽导致SQL Server Utility停止工作甚至影响同一存储设备上其他数据库的情况发生,DBA需要考虑一下SQL Server Utility存储消耗的问题。
在通常情况下,每个托管实例每年会在数据仓库sysutility_mdw中消耗将近2GB的数据空间,同时每个托管实例还会在msdb中消耗将近20MB的数据空间。托管实例上的数据库数量、DBA设置的资源利用评估策略会对这个数据产生明显的影响。因此建议DBA需要在SQL Server Utility上限后的一至两周观察一下实际的存储消耗速率。
创建UCP
说了这么多,我们简单展示下创建UCP的过程。
首先需要在SQL Server Management Studio中找到Utility Explorer,在Utility Explorer的工具栏中找到一个名为“Create Utility Control Point”的按钮。

点击这个按钮后,SQL Server Management Studio就会启动创建UCP的向导

点击“Next”略过介绍页,接着就需要选择用于宿主UCP的SQL Server实例了,同时还需要提供一个UCP的名字,输入这两项内容后又可以点击“Next”了。

接着就是选帐户了,DBA有两个选择,使用一个Domain Account或者利用现有的SQL Server Agent服务帐户,如果是Domain Account那么SQL Server会自动创建一个SQL Server Agent代理帐户。

接着SQL Server会检查创建UCP的各项条件,如果没有问题的话,继续点击“Next”两次就可以结束整个配置向导了。
令笔者汗的一个小问题是,笔者尚未发现有如何图形化工具在某个UCP宿主实例上删除UCP的注册,因此大家体验这一过程的时候注意一下吧。
将一个SQL Server实例加入为托管实例的向导与创建UCP的向导步骤类似,只是启动加入托管实例的向导需要在“Managed Instance”节点上右击。

结束语
如前一篇介绍SQL Serve Utility的文章一样,要想更好的体验SQL Server Utility,还是赶紧下载一个评估版自己偷着乐吧。