您好,登錄后才能下訂單哦!
SQL Server數據庫鏡像基于可用性組故障轉移
微軟從SQL Server 2005開始引入數據庫鏡像,很快成為一個流行的故障轉移解決方案。數據庫鏡像的一個大的問題是故障轉移是基于數據庫級別的,因此,如果某個數據庫故障,鏡像只會針對這個數據庫切換,但是,其他數據庫都仍然在主服務器上。缺點是越來越多的應用程序是基于多個數據庫來構建,所以,如果某一個數據庫故障轉移而其他數據庫仍然在主服務器上,那應用程序將無法工作。當這種情況發生的時候,我如何知曉?并執行該應用程序調用的所有數據庫一起故障轉移呢?
在SQL Server的所有功能中,有一種方式可以在數據庫鏡像故障發生時得到告警或者檢查發生的事件。用于數據庫鏡像的事件提醒并不如你想象的那樣直接,但它可以實現該功能。
對于數據庫鏡像,你可以選擇使用跟蹤事件,或者配置SQL Server告警來檢查對于數據庫鏡像狀態的改變的WMI(Windows Management Instrumentation)事件。
在開始之前,我們需要一些準備工作:
鏡像數據庫和msdb數據庫必需啟用service broker。可以使用如下查詢來檢查:
SELECT name, is_broker_enabled FROM sys.databases
如果service broker的值不為1,你可以對每個數據庫使用以下命令開啟。
ALTER DATABASE msdb SET ENABLE_BROKER
如果SQL Server代理正在運行,那么這個命令將不會完成。你需要先停止SQL Server代理,運行以上命令,然后再次啟動SQL Server代理。
最后,如果SQL Server代理沒有運行,你需要啟動它。
創建告警
首先,我們來創建告警,與其他告警不同的是,我們會選擇”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”是一樣的。
參考:
https://msdn.microsoft.com/en-us/library/ms191502.aspx
https://msdn.microsoft.com/en-us/library/ms186449.aspx
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。