SQLServer的數據庫鏡像實施筆記

作者: 深山老林  來源: 博客園  發布時間: 2009-04-10 15:24  閱讀: 4157 次  推薦: 1   原文鏈接   [收藏]  

最初在為公司設計SQLServer數據庫鏡像的時候,首先考慮的是高可用性(三臺計算機,一臺見證服務器,一臺做主數據庫,一臺做鏡像)

在虛擬機環境下部署成功,一切都是那么的完美。 故障轉移3秒之內就可以順利完成。

1.高可用性的實施代碼:

主體數據庫

 

鏡像數據庫

 

見證服務器

 可能有朋友們會比較有疑惑,你一下搞兩個數據庫出來,他們的ip地址都不一樣,到時候數據庫切換過去了,我的數據庫的連接字符串可如何是好?難道還得在代碼中去控制是連接哪個數據庫嗎?

其實這個問題是這樣的,使用ADO.NET或者SQL Native Client能夠自動連接到故障轉移后的伙伴,連接字符串如下所示:

ConnectionString="DataSource= A;Failover Partner=B;Initial Catalog=AdventureWorks;Integrated Security=true;"

DataSource= A;這個就是我們常用的主數據庫的ip地址,Failover Partner=B;這個填寫的就是鏡像數據庫的ip地址,一旦出現了連接錯誤,ado.net會在超時以后自動去連接鏡像數據庫。

2.高級別保護模式

在昨天晚上加班做實施的時候,才發現我的設計已經被修改了,由于以前的項目有java寫的也有c#寫的,全自動的故障轉移不能夠實現 。換句話說,由于老項目中的歷史遺留問題,以及特殊模塊的耦合性過高,無法解耦,只能在高級別保護模式或高性能模式中選擇一種了。那么這兩者有什么區別呢?

簡單一點來說,區別就在與事務安全模式上跟應用場景上。

高級別保護模式采用的是同步鏡像, SAFETY FULL。應用場景:通常在局域網中或對數據要求比較高的場景中。

高性能保護模式采用的是異步鏡像, SAFETY OFF。應用場景:通常在廣域網或對數據要求不太高,丟失幾條數據是允許的,但是必須保證它不中斷服務。

在微軟的SQLServer2005的課程上是這么說的。如果是高級別保護模式的話,主、從數據庫只要有一臺不能正常保證服務,數據庫就不能夠對外進行服務了,我在開始的時候就沒有打算采用這種模式,因為部門經理說了,丟失一兩條數據是可以接受的,況且我們公司是做運營的,按照起先微軟的課程的理論,高級別保護模式是不太適合我們公司的應用場景的,萬一有一臺數據庫出問題了,整個服務就被中斷,這是不能讓人接受的。再說了,公司對數據要求不太苛刻,兩臺服務器都有內網線連接,由于內網傳輸速度非常的快,即使采用高性能模式,一般來說也是不會丟失數據的。于是我打算采用高性能模式來做數據庫的鏡像。由于公司服務器沒有域環境,所以我就采用了證書驗證來做SQLServer鏡像。

意外收獲:

兩臺服務器全部都安裝了SQLServer2008,在設置事務安全模式的時候,才發現SQLServer2008不支持異步模式。提示大概如下:此SQLServer版本不支持修改事務安全模式,alter database失敗。 我當時汗都出來了,忙活了一晚上,到最后居然是這個結果。

由于是服務器維護時間,我大膽的把鏡像服務器停止了,結果卻讓我大吃一驚,主數據庫依舊可以正常工作,正常對外提供服務。也就是說,起先微軟的課程講的知識是錯誤的,兩臺數據庫做鏡像,不管是哪臺數據庫出了問題,另外的一臺數據庫都可以保證正常對外提供服務。于是我反復試驗反復切換了一下,結果依然是這樣。

由于高級別保護模式與高性能模式代碼差不太多,只是在事務安全模式的設置上有些小區別,前面已經提到,這里就不再多解釋了。實施的代碼如下:

主體服務器





 

 

鏡像數據庫

 

可能有朋友會比較奇怪,你這里也沒有使用ALTER DATABASE crm SET SAFETY FULL; 按理應該是高性能模式才對呀?

其實這個問題是這樣的,我的這個SQLServer2008默認已經是將事務安全模式設置為full了,即使是手動設置也一樣,并且我實施的時候SQLServer2008不支持將事務安全模式設置為OFF。

OK,一切都設置好了,那么就可以模擬服務器真的down機時候的操作了,后續的工作我也把代碼做了總結,具體代碼如下:

手動故障轉移代碼


 

 

3.監視數據庫鏡像

SQLServer提供了一些視圖,可以供查詢鏡像的各種狀態,到時候可以根據這個做一個監視,一旦發生故障轉移群集,發郵件給系統管理員,好讓系統管理員及時的知道數據庫服務器發生了什么問題,即使的做故障分析、排查。有關這方面資料,MSDN上已經提供太多資料了。感興趣的朋友可以去查這方面的資料。

在文章的最后提出一個有爭議的問題SQLServer(2008)高級別保護模式,只要有一臺數據庫能夠保證正常運行,就可以正常對外提供服務。我的實驗結果是這樣的,這的確跟以往的理論知識有些出入。

還等什么,趕快搭環境動手實驗一下吧,體驗一下SQLServer鏡像帶來的快感。 希望有興趣的朋友們一起學習探討。

1
0
 
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()