SQL Server數據庫鏡像基於可用性組故障轉移sql
微軟從SQL Server 2005開始引入數據庫鏡像,很快成爲一個流行的故障轉移解決方案。數據庫鏡像的一個大的問題是故障轉移是基於數據庫級別的,所以,若是某個數據庫故障,鏡像只會針對這個數據庫切換,可是,其餘數據庫都仍然在主服務器上。缺點是愈來愈多的應用程序是基於多個數據庫來構建,因此,若是某一個數據庫故障轉移而其餘數據庫仍然在主服務器上,那應用程序將沒法工做。當這種狀況發生的時候,我如何知曉?並執行該應用程序調用的全部數據庫一塊兒故障轉移呢?數據庫
在SQL Server的全部功能中,有一種方式能夠在數據庫鏡像故障發生時獲得告警或者檢查發生的事件。用於數據庫鏡像的事件提醒並不如你想象的那樣直接,但它能夠實現該功能。服務器
對於數據庫鏡像,你能夠選擇使用跟蹤事件,或者配置SQL Server告警來檢查對於數據庫鏡像狀態的改變的WMI(Windows Management Instrumentation)事件。ide
在開始以前,咱們須要一些準備工做:spa
鏡像數據庫和msdb數據庫必需啓用service broker。可使用以下查詢來檢查:代理
SELECT name, is_broker_enabled FROM sys.databases
若是service broker的值不爲1,你能夠對每一個數據庫使用如下命令開啓。blog
ALTER DATABASE msdb SET ENABLE_BROKER
若是SQL Server代理正在運行,那麼這個命令將不會完成。你須要先中止SQL Server代理,運行以上命令,而後再次啓動SQL Server代理。事件
最後,若是SQL Server代理沒有運行,你須要啓動它。ip
建立告警ci
首先,咱們來建立告警,與其餘告警不一樣的是,咱們會選擇」WMI event alert「類型。
使用SSMS鏈接到實例,展開SQL Server Agent,在Alerts上點擊右鍵,選擇「New Alert「。
彈出」New Alert「界面,選擇「WMI event alert」。須要注意一下查詢的Namespace。默認,SQL Server會根據你操做的實例選擇正確的名稱空間。
對於Query,使用如下查詢:
SELECT * FROM DATABASE_MIRRORING_STATE_CHANGE WHERE State = 7 OR State = 8
該數據從WMI獲取,當數據庫鏡像狀態變爲7(手動故障轉移)或8(自動故障轉移)時,將會觸發做業或者提醒。
此外,你能夠進一步對於每個特定的數據庫定義查詢:
SELECT * FROM DATABASE_MIRRORING_STATE_CHANGE WHERE State = 8 AND DatabaseName = 'Test'
能夠閱讀下聯機幫助中DATABASE_MIRRORING_STATE_CHANGE的內容。
如下是能夠被監控到的不一樣狀態改變的列表。更多內容,能夠從Database Mirroring State Change Event Class裏找到。
0 = Null Notification
1 = Synchronized Principal with Witness
2 = Synchronized Principal without Witness
3 = Synchronized Mirror with Witness
4 = Synchronized Mirror without Witness
5 = Connection with Principal Lost
6 = Connection with Mirror Lost
7 = Manual Failover
8 = Automatic Failover
9 = Mirroring Suspended
10 = No Quorum
11 = Synchronizing Mirror
12 = Principal Running Exposed
13 = Synchronizing Principal
在Response界面,能夠配置當事件發生時如何處理。你能夠配置當告警觸發時執行一個做業,或者給操做者發送一個提醒。
最後,以下所示能夠配置額外的選項。
配置示例
例如,一個應用程序有調用3個數據庫(Customer、Orders和Log),若是其中一個數據庫自動切換,你也想要兩外兩個數據庫也一塊兒故障轉移。此外,這個鏡像配置了一個見證服務器,若是發生故障,會自動故障轉移。
如下展現瞭如何配置。
首先,咱們只針對這3個數據庫配置告警。
而後配置告警觸發後運行哪一個做業。
咱們須要建立「Failover Databases」做業,用於當告警觸發的時候運行。
對於SQL Server代理的「Failover Databases」做業,做業步驟以下:
IF EXISTS (SELECT 1 FROM sys.database_mirroring WHERE db_name(database_id) = N'Customer' AND mirroring_role_desc = 'PRINCIPAL') ALTER DATABASE Customer SET PARTNER FAILOVER GO IF EXISTS (SELECT 1 FROM sys.database_mirroring WHERE db_name(database_id) = N'Orders' AND mirroring_role_desc = 'PRINCIPAL') ALTER DATABASE Orders SET PARTNER FAILOVER GO IF EXISTS (SELECT 1 FROM sys.database_mirroring WHERE db_name(database_id) = N'Log' AND mirroring_role_desc = 'PRINCIPAL') ALTER DATABASE Log SET PARTNER FAILOVER GO
以上的ALTER DATABASE命令對其餘沒有自動轉移的數據庫強制故障轉移。這跟你再GUI界面上點擊「Failover」是同樣的。
參考: