溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SQL Server數(shù)據(jù)庫(kù)鏡像基于可用性組故障轉(zhuǎn)移

發(fā)布時(shí)間:2020-07-12 21:00:39 來(lái)源:網(wǎng)絡(luò) 閱讀:3216 作者:UltraSQL 欄目:數(shù)據(jù)庫(kù)

SQL Server數(shù)據(jù)庫(kù)鏡像基于可用性組故障轉(zhuǎn)移

 

微軟從SQL Server 2005開(kāi)始引入數(shù)據(jù)庫(kù)鏡像,很快成為一個(gè)流行的故障轉(zhuǎn)移解決方案。數(shù)據(jù)庫(kù)鏡像的一個(gè)大的問(wèn)題是故障轉(zhuǎn)移是基于數(shù)據(jù)庫(kù)級(jí)別的,因此,如果某個(gè)數(shù)據(jù)庫(kù)故障,鏡像只會(huì)針對(duì)這個(gè)數(shù)據(jù)庫(kù)切換,但是,其他數(shù)據(jù)庫(kù)都仍然在主服務(wù)器上。缺點(diǎn)是越來(lái)越多的應(yīng)用程序是基于多個(gè)數(shù)據(jù)庫(kù)來(lái)構(gòu)建,所以,如果某一個(gè)數(shù)據(jù)庫(kù)故障轉(zhuǎn)移而其他數(shù)據(jù)庫(kù)仍然在主服務(wù)器上,那應(yīng)用程序?qū)o(wú)法工作。當(dāng)這種情況發(fā)生的時(shí)候,我如何知曉?并執(zhí)行該應(yīng)用程序調(diào)用的所有數(shù)據(jù)庫(kù)一起故障轉(zhuǎn)移呢?

 

在SQL Server的所有功能中,有一種方式可以在數(shù)據(jù)庫(kù)鏡像故障發(fā)生時(shí)得到告警或者檢查發(fā)生的事件。用于數(shù)據(jù)庫(kù)鏡像的事件提醒并不如你想象的那樣直接,但它可以實(shí)現(xiàn)該功能。

 

對(duì)于數(shù)據(jù)庫(kù)鏡像,你可以選擇使用跟蹤事件,或者配置SQL Server告警來(lái)檢查對(duì)于數(shù)據(jù)庫(kù)鏡像狀態(tài)的改變的WMI(Windows Management Instrumentation)事件。

 

在開(kāi)始之前,我們需要一些準(zhǔn)備工作:

 

鏡像數(shù)據(jù)庫(kù)和msdb數(shù)據(jù)庫(kù)必需啟用service broker??梢允褂萌缦虏樵儊?lái)檢查:

SELECT name, is_broker_enabled
FROM sys.databases

 

如果service broker的值不為1,你可以對(duì)每個(gè)數(shù)據(jù)庫(kù)使用以下命令開(kāi)啟。

ALTER DATABASE msdb SET ENABLE_BROKER

 

如果SQL Server代理正在運(yùn)行,那么這個(gè)命令將不會(huì)完成。你需要先停止SQL Server代理,運(yùn)行以上命令,然后再次啟動(dòng)SQL Server代理。

 

最后,如果SQL Server代理沒(méi)有運(yùn)行,你需要啟動(dòng)它。

 

創(chuàng)建告警

 

首先,我們來(lái)創(chuàng)建告警,與其他告警不同的是,我們會(huì)選擇”WMI event alert“類型。

 

使用SSMS連接到實(shí)例,展開(kāi)SQL Server Agent,在Alerts上點(diǎn)擊右鍵,選擇“New Alert“。

SQL Server數(shù)據(jù)庫(kù)鏡像基于可用性組故障轉(zhuǎn)移

 

彈出”New Alert“界面,選擇“WMI event alert”。需要注意一下查詢的Namespace。默認(rèn),SQL Server會(huì)根據(jù)你操作的實(shí)例選擇正確的名稱空間。

SQL Server數(shù)據(jù)庫(kù)鏡像基于可用性組故障轉(zhuǎn)移

 

對(duì)于Query,使用以下查詢:

SELECT * FROM DATABASE_MIRRORING_STATE_CHANGE WHERE State = 7 OR State = 8

 

該數(shù)據(jù)從WMI獲取,當(dāng)數(shù)據(jù)庫(kù)鏡像狀態(tài)變?yōu)?(手動(dòng)故障轉(zhuǎn)移)或8(自動(dòng)故障轉(zhuǎn)移)時(shí),將會(huì)觸發(fā)作業(yè)或者提醒。

 

此外,你可以進(jìn)一步對(duì)于每一個(gè)特定的數(shù)據(jù)庫(kù)定義查詢:

SELECT * FROM DATABASE_MIRRORING_STATE_CHANGE WHERE State = 8 AND DatabaseName = 'Test'

 

可以閱讀下聯(lián)機(jī)幫助中DATABASE_MIRRORING_STATE_CHANGE的內(nèi)容。

以下是可以被監(jiān)控到的不同狀態(tài)改變的列表。更多內(nèi)容,可以從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界面,可以配置當(dāng)事件發(fā)生時(shí)如何處理。你可以配置當(dāng)告警觸發(fā)時(shí)執(zhí)行一個(gè)作業(yè),或者給操作者發(fā)送一個(gè)提醒。

SQL Server數(shù)據(jù)庫(kù)鏡像基于可用性組故障轉(zhuǎn)移

 

最后,如下所示可以配置額外的選項(xiàng)。

SQL Server數(shù)據(jù)庫(kù)鏡像基于可用性組故障轉(zhuǎn)移

 

配置示例

 

例如,一個(gè)應(yīng)用程序有調(diào)用3個(gè)數(shù)據(jù)庫(kù)(Customer、Orders和Log),如果其中一個(gè)數(shù)據(jù)庫(kù)自動(dòng)切換,你也想要兩外兩個(gè)數(shù)據(jù)庫(kù)也一起故障轉(zhuǎn)移。此外,這個(gè)鏡像配置了一個(gè)見(jiàn)證服務(wù)器,如果發(fā)生故障,會(huì)自動(dòng)故障轉(zhuǎn)移。

 

以下展示了如何配置。

 

首先,我們只針對(duì)這3個(gè)數(shù)據(jù)庫(kù)配置告警。

SQL Server數(shù)據(jù)庫(kù)鏡像基于可用性組故障轉(zhuǎn)移

 

然后配置告警觸發(fā)后運(yùn)行哪個(gè)作業(yè)。

SQL Server數(shù)據(jù)庫(kù)鏡像基于可用性組故障轉(zhuǎn)移

 

我們需要?jiǎng)?chuàng)建“Failover Databases”作業(yè),用于當(dāng)告警觸發(fā)的時(shí)候運(yùn)行。

 

對(duì)于SQL Server代理的“Failover Databases”作業(yè),作業(yè)步驟如下:

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命令對(duì)其他沒(méi)有自動(dòng)轉(zhuǎn)移的數(shù)據(jù)庫(kù)強(qiáng)制故障轉(zhuǎn)移。這跟你再GUI界面上點(diǎn)擊“Failover”是一樣的。


參考:

https://msdn.microsoft.com/en-us/library/ms191502.aspx

https://msdn.microsoft.com/en-us/library/ms186449.aspx



向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI