您好,登錄后才能下訂單哦!
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“。
彈出”New Alert“界面,選擇“WMI event alert”。需要注意一下查詢的Namespace。默認(rèn),SQL Server會(huì)根據(jù)你操作的實(shí)例選擇正確的名稱空間。
對(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è)提醒。
最后,如下所示可以配置額外的選項(xiàng)。
配置示例
例如,一個(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ù)配置告警。
然后配置告警觸發(fā)后運(yùn)行哪個(gè)作業(yè)。
我們需要?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
免責(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)容。