1.4 群集环境下数据库的安装和升级
群集环境下的数据库安装升级比单机版本的数据库安装复杂,更容易出问题。因为群集环境下的数据库安装会牵涉到更多的组件。任何一个条件不满足,安装就可能进行不下去。对于SQL Server 2005版本,数据库群集的安装可以在所有的结点上同时进行安装;对于SQL Server 2008和2012版本,数据库群集安装是以结点为单位。在主结点上装好后,需要在其他结点逐个进行安装,这是一个改进。SQL Server 2005同时安装的方式对环境依赖性很高,很容易出错。
在群集环境下安装数据库服务除了要满足单机环境下的安装条件以外,还要注意以下几点。
1.一些重要的服务是要求开启的
这些服务主要有如下几个。如果这些服务没有开启,则安装的时候会碰到各种各样奇怪的错误。
● Remote Registy服务
● Task Scheduler服务
● Cryptographic服务
● Server服务
● Cluster服务
2.群集环境下的所有磁盘,必须是上线的
这些磁盘不管是否被数据库安装程序所用到,或者是否属于其他应用组,都必须上线,因为在安装过程中,安装程序会通过Cluster API去列举所有的磁盘资源以及这些资源所属的组。如果磁盘资源是下线的,那么这个调用就找不到其所在的应用组,安装程序就不能继续进行下去。我们可以用命令“cluster res”,该命令会显示当前群集下的所有资源及它们的状态,如图1-12所示。
图1-12 列举群集下的所有资源及其状态
3.网络检查
在群集环境下,两个结点是要能够互通的。不仅NETBIOS名字(短名)能够ping的通,FQDN名字(长名)也要求能够ping通,而且要求安装账号能够远程桌面登录到其他结点。在安装之前,我们可以先进行一下测试以确保结点互联性。对于SQL Server 2005的群集安装,还要求第二个结点没有任何Console模式远程桌面登录。
4.文件共享检查
在群集环境下,要求两个结点能够互相访问文件共享。即在第一个结点上能访问到第二个结点:\\node2\c㊣、\\node2\admin㊣,第二个结点也能够访问第一个结点。
5.域控上要有足够的权限
在Windows Server 2008或Windows Server 2008 R2群集环境下,群集名(Cluster Network Name)要有权限创建计算机对象。这是因为在安装过程中,需要在群集环境里创建SQL Server网络名(SQL Network Name)。如果群集名没有足够权限,则无法建立SQL Server网络名,导致安装失败。我们在下面的例子中,会提到如何赋予足够的权限。
如果上面的条件不满足,则在安装的时候会碰到各种各样的错误。下面是一些常见的在安装数据库群集服务时可能碰到的错误。
常见问题1:其他组的磁盘资源没有上线。
以SQL Server 2005为例,我们在给SQL Server打补丁时失败。查看安装日志,下面是错误信息:
11/13/2011 21:43:06.834 MSP Error: 29527 The setup has encountered an unexpected error in datastore. The action is RestoreSetupParams. The error is : Source File Name: datastore\cachedpropertycollection.cpp Compiler Timestamp: Tue Sep 21 15:48:22 2010 Function Name: CachedPropertyCollection::findProperty Source Line Number: 130 ---------------------------------------------------------- Failed to find property "OwningGroup" {"VirtualServerInfo", "", "xxxxxx02"} in cache Source File Name: datastore\clusterinfocollector.cpp Compiler Timestamp: Tue Sep 21 15:48:22 2010 Function Name: ClusterInfoCollector::collectClusterVSInfo Source Line Number: 888 ---------------------------------------------------------- Failed to detect VS info due to datastore exception. Source File Name: datastore\clustergroupsproperties.cpp Compiler Timestamp: Tue Sep 21 15:48:22 2010 Function Name: ClusterGroupScope.SharedDisks Source Line Number: 56 ---------------------------------------------------------- Failed to f 11/13/2011 21:43:07.009 Attempting to continue the 32 bit ngen queue 11/13/2011 21:43:07.041 Attempting to continue the 64 bit ngen queue 11/13/2011 21:43:07.105 The patch ####################installation could not #######proceed due to unexpected errors
上面的错误信息提示我们,在对函数ClusterGroupScope.SharedDisks做检查的时候碰到错误。但是错误信息不全,由于长度关系,被截断了。这时,我们可以查看Windows的应用程序日志,里面会记录错误信息:Failed to find a cluster group that owned shared disk: I。经过确认,在打补丁的时候,I:盘处于Offline状态。虽然I:盘并没有被这个数据库所用到,但是在打补丁的时候也是会对其进行检查的。解决办法就是把群集下的所有磁盘上线,然后再打补丁。
常见问题2:在域控制器上CNO(Cluster Name Object)没有足够的权限。
这个问题只有在安装的时候会发生。安装数据库群集时,会发现如下错误:
2012-03-03 11:22:44 Slp: The cluster resource 'SQL Server (xxxx)' could not be brought online. Error:The resource failed to come online due to the failure of one or more provider resources. (Exception from HRESULT: 0x80071736) 2012-03-03 11:22:44 Slp: Configuration action failed for feature SQL_Engine_Core_Inst during timing Startup and scenario Startup. 2012-03-03 11:22:44 Slp: Microsoft.SqlServer.Configuration.Cluster.ClusterException: The cluster resource 'SQL Server (xxxx)' could not be brought online. Error: The resource failed to come online due to the failure of one or more provider resources. (Exception from HRESULT: 0x80071736) --->
通过进一步查看Windows的应用程序日志,会得知由于权限不够导致SQL Network Name(xxxx)无法被创建:
SQL Network Name (xxxx): Unable to create computer account: Access is denied
这是由于在域控制器上,Cluster Name没有权限去创建Computer Object所导致的。我们可以采用以下步骤来赋予足够的权限(假定我们的群集名为MYCLUSTER)。
① 在域控制器上打开Active Directory Users and Computers管理界面,如图1-13所示。
图1-13 域控制器上的用户和计算机管理
② 右键单击Computers(注意,不是右键单击群集名MYCLUSTER),到Security选项卡页面,如图1-14所示。
图1-14 计算机属性
③ 单击Advanced,如图1-15所示。
图1-15 高级属性
④ 单击Add…,打开如图1-16所示的对话框。
图1-16 添加群集名
⑤ 选择Object Types…,把Computers也选中,如图1-17所示。
图1-17 选中Computers
⑥ 输入群集名MYCLUSTER,并单击OK按钮,如图1-18所示。
图1-18 输入群集名MYCLUSTER
⑦ 在权限列表里选择“Create Computer objects”和“Read all properties”权限,如图1-19所示。
图1-19 赋予足够的权限
设定好权限后,安装时就不会碰到由于权限不够导致SQL网络名无法创建的错误了。
常见问题3:添加结点时,无法添加成功。
一般来讲,添加结点的动作不会有太多的问题。但是有一个例外,那就是主结点的安装并不是完全顺利安装成功的。如在安装第一个结点的时候碰到SQL网络名Online失败,我们解决了权限问题,把资源上线。但是由于第一个结点的安装并不是顺利自动安装完成,所以有一些额外的动作没有完成(如SQL Server Agent资源没有创建出来),在这种情况下,添加结点的时候会失败。其出错的信息如下:
Failover instance 'xxxx' cluster group not found.
这时候,读者需要在主结点上手工完成额外的动作。
① 手工创建SQL Server Agent资源类型。
cluster restype "SQL Server Agent" /create /DLL:sqagtres.dll
② 创建一个SQL Server Agent资源,在依赖关系里,加上它对SQL Server的依赖,并且在属性里输入VirtualServerName和InstanceName,这两个属性值和SQL Server资源的属性值相同,如图1-20所示。
图1-20 手工创建SQL Server Agent资源
③在注册表的ConfigurationState里,把相应的所有值为2的均改为1(意味着配置成功)。其注册表位置如下:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL11.INSTANCE> \Configuration
State
如果觉得步骤麻烦,也可以在主结点上重新安装SQL Server实例。在主结点做完上述操作后,就可以正常在其他结点上添加结点了。
常见问题4:SQL Server 2005两个结点的数据库服务版本不同。
SQL Server 2008及以后,打补丁是以结点为单位的,所以如果两个结点的数据库服务版本不同,我们在低版本的结点上直接打补丁即可。但是对于SQL Server 2005,由于打补丁是两个结点一起打的,所以通常情况下,在两个结点上的版本应该是一致的。如果由于某种意外情况,导致两个结点数据库服务版本不一致,我们可以采取如下办法:
① 把SQL Server服务切换到低版本的结点上。
② 打开群集管理器,修改所有资源的Possible owners,把高版本结点去掉,只留下低版本结点,如图1-21所示。
图1-21 修改群集资源的可能所有者
③ 开始打补丁。由于我们去掉了高版本的Possible owners,所以补丁只会在当前低版本的结点上进行。
④ 打完补丁后,再次修改资源的Possible owners属性,把另外一个结点再加入回来。
常见问题5:安装或添加结点时,群集验证报告通不过。
在对SQL Server 2008或以上的版本进行数据库群集安装过程中,需要检查群集验证报告,如果群集验证报告中有错误,那么安装是进行不下去的。通常情况下,如果群集验证不通过,则说明SQL Server运行在不稳定的群集环境里,是不建议在这上面继续进行SQL Server安装的。但是也有例外:
① 群集是地域分散的群集(Geographically dispersed),没有共享磁盘,或共享磁盘是无法通过普通群集验证的。
② 手工群集验证通过,但是安装的时候,还是报告群集验证通不过。通常这种情况是由于Windows产生的群集报告和SQL Server安装程序期望的群集报告位置不符合所导致的,所以不会是大问题。
在这种情况下,我们可以把群集验证的步骤忽略。
在安装时,用如下命令:
Setup.exe /SkipRules=Cluster_VerifyForErrors /Action=InstallFailoverCluster
在添加结点时,用如下命令:
Setup.exe /SkipRules=Cluster_VerifyForErrors /Action=AddNode
在群集环境下,对数据库进行安装和升级会比单机环境复杂的多。除了上述的常见问题,读者有可能会碰到一些其他的问题。读者需要:
① 在所有结点上收集安装日志。
② 分析错误是发生在哪个结点上。
③ 到该结点的安装日志,查看具体出错信息。
④ 根据出错信息,做出判断是什么原因。
⑤ 如果出错信息比较模糊,无法做出判断,则根据出错信息,在网上搜索一下,看别人是否有碰到过类似问题,以及是如何解决的。