在群集环境下用命令行启动数据库
【介绍】
通常情况下,在群集环境下,我们用群集管理器来启动和终止数据库服务。但是在有些情况下,由于各种各样的原因,我们不能把数据库资源ONLINE。这时候,我们可以尝试用命令行方式来启动数据库。一则,可以用来调查数据库资源无法正常ONLINE的原因,二则,在紧急情况下,我们可以用命令行启动数据库,以临时提供服务。
在群集环境下,用命令行启动数据库,数据库资源用到了群集资源,如IP地址,和磁盘,但数据库本身并不是群集资源。
【启动数据库】
在群集环境下,我们需要把磁盘资源上线,IP资源上线,虚拟网络名则可以ONLINE或OFFLINE。如下图所示:
这个时候,我们就可以用命令行方式来启动SQL Server了。命令格式如下。如果是缺省实例,则把MYINSTANCE改为MSSQLSERVER。这里-s 后面加的是实例名。-c 则表明用console模式。
Sqlservr.exe –c –s MYINSTANCE
同时,我们也注意到,SQL Server 在侦听的IP地址是10.10.10.23, 这个IP地址是群集里面的SQL IP Address 1 (MYSERVER)。而SERVER NAME则是NODE1\MYINSTANCE。但是客户端,我们必须要用MYSERVER\MYINSTANCE去连接。这是因为,MYSERVER通过DNS会被转化成10.10.10.23,而SQL Server是在侦听这个IP的,所以可以连接上,NODE1则通过DNS会被转化成NODE1本身的IP地址(如10.10.10.2),但SQL Server并不侦听这个地址,所以连接不上。而我们的SQL Server从命令行启动的时候,并不是群集资源,所以会在错误日志里打印SERVERNAME为NODE1\MYINSTANCE。
在命令行方式下,SQL Network Name (MYSERVER) 是否online并不重要,因为在DNS服务器上,会把MYSERVER映射到SQL IP Address 1 (MYSERVER)。而SQL IP Address 1 (MYSERVER) 则必须上线,不然SQL Server找不到IP地址,无法从命令行启动数据库。
要停止命令行模式的SQL Server运行,我们按ctrl+c就可以了。
【启动数据库代理】
用命令行方式启动数据库服务后,我们也可以用命令行方式启动SQL Server Agent。命令格式如下:这里,-I 后面加的是实例名,如果是缺省实例,则用MSSQLSERVER,-c 指的是console模式,-v 指明打印信息是用verbose模式。
Sqlagent90.exe –I MYINSTANCE –c –v
但是我们用命令行方式启动SQL Server Agent,发现SQL Server Agent连接不上SQL Server, 我们发现,SQL Server Agent还是会去连 NODE1\MYINSTANCE,根据我们上面的分析,用这种连接方法是连不到数据库的。我们没有特别的参数指定SQL Server Agent去连接哪个服务器,SQL Server Agent会去下面的注册表找要去连接的服务器名: HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\SQLServerAgent\ServerHost
我们需要把ServerHost值改为MYSERVER\MYINSTANCE
这样,SQL Server Agent就能连接到SQL Server了。 我们在结束命令行启动数据库代理服务的时候,要把注册表HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\SQLServerAgent\ServerHost 的值恢复到正常值。
【小结】
在群集环境下,用命令行方式启动数据库服务和数据库代理服务是我们在某些特定的环境下,为了恢复业务或者调查问题,所使用的。在其他情况下,都不建议使用,我们应该用群集管理器来管理数据库服务。
Comments
- Anonymous
October 25, 2011
强调一下从SQL组的活动节点启动比较好,否则会不能访问SQL的磁盘资源造成启动失败。另外,修改注册表的时候最好把SQL资源上的checkpoint先去掉或者所有结点一起改,以避免改动被同步回来。