多数据库系统中的自动镜像failover设置
2008-09-20 10:05:41 来源:WEB开发网问题
随着SQL Server 2005版本的发布,数据库镜像技术已经成为了解决故障问题的非常流行的方法。但数据库镜像的一大问题就是failover(失效转移)仅仅作用在发生故障的主库上,当一个数据库失效时,系统中的备用数据库会立即接替它的位置,但是所有其他的数据库依然保持在原服务器上发挥作用。这种技术的缺点就是在多数据库系统中会不断建立越来越多的应用程序,一旦主库失效,备库虽然可以继续在原服务器上发挥作用,但是基于失效主库所建立的应用程序也会随之失效。当这种情况发生时,我们怎样才能被通知并立即failover所有的数据库呢?
专家解答
就像SQL Server的所有功能一样,当数据库镜像功能失败时,有一种方法能让我们得到警告并检测所发生的情况。遗憾的是,这种针对镜像功能的事件警报机制并不想您所想象的那么直接明了,但它仍然可以被实施。
对于数据库镜像功能来说,您可以选择使用事件追踪功能或设置SQL Server Alert(警报管理器)来检测当数据库镜像状态值改变时所发生的WMI (Windows Management Instrumentation,即windows管理规范)事件。在我们开始之前,您仍需做以下几件事情:
准备步骤
首先必须要启动备库和msdb(目录管理)数据库的service broker功能。此项功能可以通过以下代码来检测:
SELECTname,is_broker_enabled FROMsys.databases |
如果service broker的值未被设为1,您可以为每一个数据库设置如下命令来启动此项功能:
ALTERDATABASEmsdbSETENABLE_BROKER |
如果SQL Server Agent处于运行当中,这条命令将无法被执行,您需要先终止SQL Server Agent,接着运行上述命令,然后再重新启动它。
最后,如果SQL Server Agent没有处于运行状态,您需要启动此项功能。
创建警报管理器
其创建方法同其他警报管理器一样,只是我们需要选择WMI事件警报管理器(WMI event alert)类型。
首先展开SQL Server Agent的树形目录,右键点击Alerts然后选择New Alert
图1:选择New Alert
在New Alert(警报管理器)页面,我们要把类型改为WMI event alert。您要注意的另外一点就是系统还需要Namespace一栏的信息,SQL Server系统已经根据您所使用的SQL Server版本默认选择了正确的信息。
图2:New Alert页面
在Query一栏中我们要填入以下代码:
SELECT*FROMDATABASE_MIRRORING_STATE_CHANGEWHEREState=7ORState=8 |
因为此数据是从WMI中读出的,所以无论数据库镜像状态值变为7(手动failover)还是8(自动failover),此事件或警告就会被触发。
除此之外,如要针对某个特定数据库进行检测,您还可以进一步定义代码,比如:
SELECT*FROMDATABASE_MIRRORING_STATE_CHANGEWHEREState=8ANDDatabaseName='Test' |
想要了解更多信息,您可以在books online上阅读DATABASE_MIRRORING_STATE_CHANGE一书
下面是可以检测到的不同状态值意义的列表。您可以在Database Mirroring State Change Event Class了解到更多的信息。
0=NullNotification 1=SynchronizedPrincipalwithWitness 2=SynchronizedPrincipalwithoutWitness 3=SynchronizedMirrorwithWitness 4=SynchronizedMirrorwithoutWitness 5=ConnectionwithPrincipalLost 6=ConnectionwithMirrorLost 7=ManualFailover 8=AutomaticFailover 9=MirroringSuspended 10=NoQuorum 11=SynchronizingMirror 12=PrincipalRunningExposed |
在Response页面中我们可以设置事件发生时的应对措施。您可以创建一个当警告被触发时即运行的任务或者已设置好的发给操作者的通知。
图3:Response页面
最后,您可以为New Alert设置更多的选项,如下所示:
图4:Option页面
设置示例
假设您有3个数据库(Customer, Orders, Log)且为某应用程序的一部分,如果其中一个数据库发生故障自动进行failover,您希望其余两个数据库也得到同样处理。另外,这种镜像设置还应包含一个见证服务器(Witness Server),因此如果发生故障,failover会自动进行。
设置方法如下所示
首先我们把Alert设置成针对这3个数据库进行检测。
图5:General页面
然后我们规定Alert运行哪一个任务。
图6:设置运行任务
接着我们需要创建"Failover Databases"任务,该任务将会在Alert发生时被触发。
关于SQL Agent中的"Failover Databases"任务,其步骤相当于以下代码:
IFEXISTS(SELECT1FROMsys.database_mirroringWHEREdb_name(database_id)=N'Customer'ANDmirroring_role_desc='PRINCIPAL') ALTERDATABASECustomerSETPARTNERFAILOVER GO IFEXISTS(SELECT1FROMsys.database_mirroringWHEREdb_name(database_id)=N'Orders'ANDmirroring_role_desc='PRINCIPAL') ALTERDATABASEOrdersSETPARTNERFAILOVER GO IFEXISTS(SELECT1FROMsys.database_mirroringWHEREdb_name(database_id)=N'Log'ANDmirroring_role_desc='PRINCIPAL') ALTERDATABASELogSETPARTNERFAILOVER GO |
对于那些没有同步得到failover处理的数据库来说,上述的Alter Database命令可以避免这种情况发生,使得所有的数据库都自动得到备份。其作用相当于直接在用户图形界面上点击“Failover”键.
接下来请注意
现在您已经对于如何使用WMI事件来监控镜像状态值的改变有了一定的了解,它可以帮助您随时检测您的服务器,从而判断其是否可用。
每当数据库发生故障时,Alert就会被触发,所以如果有多个数据库发生故障,Alert将会多次尝试执行"Failover Databases"任务。
另外,您还需要考虑一下此任务的执行方式。您可以希望主服务器能直接自动向次服务器进行failover,同样,当故障发生在次服务器而将要向主服务器进行failover时,您也可以选择先被通知然后再决定如何处理。
尽管这并不是最理想的解决方法,它却能允许您从同一个服务器上访问所有的数据库。但由于数据库镜像技术仍然停留在数据库级别上实现,所以无论是否使用这种方法,都不能保证您在多数据库系统中的所有操作保持同步。
更多精彩
赞助商链接