本文對(duì)sql server 2005數(shù)據(jù)庫(kù)鏡像進(jìn)行了教程式的講解,具體內(nèi)容包括:介紹、動(dòng)態(tài)、可用性場(chǎng)景、實(shí)現(xiàn)和高可用性技術(shù),供大家參考!
概述
數(shù)據(jù)庫(kù)鏡像是sql server 2005用于提高數(shù)據(jù)庫(kù)可用性的新技術(shù)。數(shù)據(jù)庫(kù)鏡像將事務(wù)日志記錄直接從一臺(tái)服務(wù)器傳輸?shù)搅硪慌_(tái)服務(wù)器,并且能夠在出現(xiàn)故障時(shí)快速轉(zhuǎn)移到備用服務(wù)器。可以編寫(xiě)客戶端程序自動(dòng)重定向連接信息,這樣一旦出現(xiàn)故障轉(zhuǎn)移就可以自動(dòng)連接到備用服務(wù)器和數(shù)據(jù)庫(kù)。
自動(dòng)進(jìn)行故障轉(zhuǎn)移并且使數(shù)據(jù)損失最小化通常包括昂貴的硬件和復(fù)雜的軟件。但是,數(shù)據(jù)庫(kù)鏡像可以在不丟失已提交數(shù)據(jù)的前提下進(jìn)行快速故障轉(zhuǎn)移,無(wú)須專門的硬件,并且易于配置和管理。
數(shù)據(jù)庫(kù)鏡像介紹
在數(shù)據(jù)庫(kù)鏡像中,一臺(tái)sql server 2005實(shí)例連續(xù)不斷的將數(shù)據(jù)庫(kù)事務(wù)日志發(fā)送到另一臺(tái)備用sql server實(shí)例的數(shù)據(jù)庫(kù)副本中。發(fā)送方的數(shù)據(jù)庫(kù)和服務(wù)器擔(dān)當(dāng)主角色,而接收方的數(shù)據(jù)庫(kù)和服務(wù)器擔(dān)當(dāng)鏡像角色。主服務(wù)器和鏡像服務(wù)器必須是獨(dú)立的sql server 2005實(shí)例。
在所有sql server數(shù)據(jù)庫(kù)中,在對(duì)真正的數(shù)據(jù)頁(yè)面進(jìn)行修改之前,數(shù)據(jù)改變首先都記錄在事務(wù)日志中。事務(wù)日志記錄先被放置在內(nèi)存中的數(shù)據(jù)庫(kù)日志緩沖區(qū)中,然后盡快地輸出到磁盤(或者被硬化)。在數(shù)據(jù)庫(kù)鏡像中,當(dāng)主服務(wù)器將主數(shù)據(jù)庫(kù)的日志緩沖區(qū)寫(xiě)入磁盤時(shí),也同時(shí)將這些日志記錄塊發(fā)送到鏡像實(shí)例。
當(dāng)鏡像服務(wù)器接收到日志記錄塊后,首先將日志記錄放入鏡像數(shù)據(jù)庫(kù)的日志緩沖區(qū),然后盡快地將它們硬化到磁盤。稍后鏡像服務(wù)器會(huì)重新執(zhí)行那些日志記錄。由于鏡像數(shù)據(jù)庫(kù)重新應(yīng)用了主數(shù)據(jù)庫(kù)的事務(wù)日志記錄,因此復(fù)制了發(fā)生在主數(shù)據(jù)庫(kù)上的數(shù)據(jù)改變。
主服務(wù)器和鏡像服務(wù)器將對(duì)方視為數(shù)據(jù)庫(kù)鏡像會(huì)話中的伙伴。數(shù)據(jù)庫(kù)鏡像會(huì)話包含了鏡像伙伴服務(wù)器之間的關(guān)系。一臺(tái)給定的伙伴服務(wù)器可以同時(shí)承擔(dān)某個(gè)數(shù)據(jù)庫(kù)的主角色和另一個(gè)數(shù)據(jù)庫(kù)的鏡像角色。
除了兩臺(tái)伙伴服務(wù)器(主服務(wù)器和鏡像服務(wù)器),一個(gè)數(shù)據(jù)庫(kù)會(huì)話中可能還包含第三臺(tái)可選服務(wù)器,叫做見(jiàn)證服務(wù)器。見(jiàn)證服務(wù)器的角色就是啟動(dòng)自動(dòng)故障轉(zhuǎn)移。當(dāng)數(shù)據(jù)庫(kù)鏡像用于高可用性時(shí),如果主服務(wù)器突然失敗了,如果鏡像服務(wù)器通過(guò)見(jiàn)證服務(wù)器確認(rèn)了主服務(wù)器的失敗,那么它就自動(dòng)承擔(dān)主服務(wù)器角色,并且在幾秒鐘之內(nèi)就可以向用戶提供數(shù)據(jù)庫(kù)服務(wù)。
數(shù)據(jù)庫(kù)鏡像中需要注意的一些重要事項(xiàng):
◆主數(shù)據(jù)庫(kù)必須為full還原模型。由于bulk-logged操作而導(dǎo)致的日志記錄無(wú)法發(fā)送到鏡像數(shù)據(jù)庫(kù)。
◆初始化鏡像數(shù)據(jù)庫(kù)必須首先使用norecovery還原主數(shù)據(jù)庫(kù),然后再按順序還原著數(shù)據(jù)庫(kù)事務(wù)日志備份。
◆鏡像數(shù)據(jù)庫(kù)和主數(shù)據(jù)庫(kù)名稱必須一致。
◆由于鏡像數(shù)據(jù)庫(kù)處于recovering狀態(tài),因此不能直接訪問(wèn)。通過(guò)在鏡像數(shù)據(jù)庫(kù)上創(chuàng)建數(shù)據(jù)庫(kù)快照可以間接讀取某一個(gè)時(shí)刻點(diǎn)的鏡像數(shù)據(jù)庫(kù)。(參閱該白皮書(shū)后面“數(shù)據(jù)庫(kù)鏡像和數(shù)據(jù)庫(kù)快照”部分)
注意: 要想獲取更多與數(shù)據(jù)庫(kù)鏡像術(shù)語(yǔ)有關(guān)的信息,請(qǐng)參閱sql server 2005 books online中關(guān)于“overview of database mirroring”。
操作模式
數(shù)據(jù)庫(kù)鏡像會(huì)話有三種可能的操作模式。根據(jù)事務(wù)安全性的設(shè)置以及鏡像會(huì)話中是否需要見(jiàn)證服務(wù)器來(lái)決定精確的操作模式。
表1:數(shù)據(jù)庫(kù)鏡像操作模式
| 操作模式 | 事務(wù)安全性 | 傳輸機(jī)制 | 需要quorum | 見(jiàn)證服務(wù)器 | 故障轉(zhuǎn)移類型 | 
| 高可用 | full | 同步 | y | y | 自動(dòng)或者手動(dòng) | 
| 高保護(hù) | full | 同步 | y | n | 只能手動(dòng) | 
| 高性能 | off | 異步 | n | n/a | 只能forced | 
如果safety設(shè)置為full,那么通過(guò)同步方式傳輸數(shù)據(jù),并且需要一臺(tái)鏡像服務(wù)器才能提供數(shù)據(jù)庫(kù)服務(wù)。quorum投票表決要求至少兩臺(tái)服務(wù)器的參與才能夠決定兩個(gè)伙伴服務(wù)器各自承擔(dān)什么角色,主角色還是鏡像角色。
為了更深入研究這三種操作模式,首先來(lái)更進(jìn)一步研究一下事務(wù)安全性和quorum的角色。
事務(wù)安全性
if 事務(wù)安全性(或者'safety')設(shè)置為full,那么主服務(wù)器和鏡像服務(wù)器工作在同步傳輸模式下。當(dāng)主服務(wù)器硬化其主數(shù)據(jù)庫(kù)日志記錄到磁盤時(shí),也同時(shí)將日志發(fā)送到鏡像服務(wù)器。然后主服務(wù)器等待鏡像服務(wù)器的回答。鏡像服務(wù)器將那些相同的日志記錄硬化到鏡像日志所在磁盤后,對(duì)主服務(wù)器進(jìn)行答復(fù)。當(dāng)safety設(shè)置為off時(shí),主服務(wù)器不會(huì)等待來(lái)自服務(wù)器的確認(rèn),因此主數(shù)據(jù)庫(kù)和鏡像數(shù)據(jù)庫(kù)可能不是完全同步的(也就是,鏡像可能滯后于主數(shù)據(jù)庫(kù))。
同步傳輸方式保證鏡像數(shù)據(jù)庫(kù)事務(wù)日志中所有事務(wù)與主數(shù)據(jù)庫(kù)事務(wù)日志中的事務(wù)同步,因此可視為事務(wù)是安全傳輸?shù)摹R獙afety設(shè)置為full,使用
alter database [<dbname>] set safety full;當(dāng)safety設(shè)置為off,主服務(wù)器和鏡像服務(wù)器之間的通信是異步的。主服務(wù)器不會(huì)等待鏡像服務(wù)器已將事務(wù)記錄硬化的確認(rèn)信息。鏡像服務(wù)器通過(guò)盡快記錄事務(wù)日志的來(lái)試圖保持與主服務(wù)器同步,但是如果主服務(wù)器突然失敗同時(shí)強(qiáng)制鏡像服務(wù)器提供服務(wù),那么某些事務(wù)還是有可能丟失(參閱sql server books中的'forced service')。
quorum和見(jiàn)證服務(wù)器
當(dāng)safety設(shè)置為full,數(shù)據(jù)庫(kù)鏡像需要quorum才能提供數(shù)據(jù)庫(kù)服務(wù)。quorum是在同步數(shù)據(jù)庫(kù)鏡像會(huì)話中要求的所有連接起來(lái)的服務(wù)器之間的最小關(guān)系。由于一個(gè)quorum至少需要兩臺(tái)服務(wù)器,因此當(dāng)safety為full時(shí),主服務(wù)器必須和其他某至少一臺(tái)服務(wù)器組成quorum才能夠提供數(shù)據(jù)庫(kù)服務(wù)。
見(jiàn)證服務(wù)器幫助主服務(wù)器或者鏡像服務(wù)器組成quorum。如果存在見(jiàn)證服務(wù)器,那么主數(shù)據(jù)庫(kù)或者鏡像數(shù)據(jù)庫(kù)失敗時(shí),其余兩臺(tái)服務(wù)器還可以組成quorum。如果主服務(wù)器無(wú)法看到鏡像服務(wù)器,那么它可以和見(jiàn)證服務(wù)器組成quorum,并保持提供數(shù)據(jù)庫(kù)服務(wù)。類似地,如果鏡像服務(wù)器和見(jiàn)證服務(wù)器看不到主服務(wù)器,那么這兩臺(tái)服務(wù)器可以組成quorum,鏡像服務(wù)器擔(dān)當(dāng)新主服務(wù)器的角色。
見(jiàn)證服務(wù)器失敗不被視為數(shù)據(jù)庫(kù)鏡像繪畫(huà)中的單點(diǎn)失敗。因?yàn)槿绻?jiàn)證服務(wù)器失敗了,那么主服務(wù)器和鏡像服務(wù)器還可以組成quorum(更多信息請(qǐng)參閱sql server books online中的“quorum in database mirroring sessions”主題)。
高可用操作模式
高可用操作模式支持最大程度的數(shù)據(jù)庫(kù)可用性,如果主數(shù)據(jù)庫(kù)失敗將自動(dòng)轉(zhuǎn)移到經(jīng)銷數(shù)據(jù)庫(kù)。它要求將safety設(shè)置為full并且定義一臺(tái)見(jiàn)證服務(wù)器作為數(shù)據(jù)庫(kù)鏡像會(huì)話中的一員。
高可用操作模式最適合于那些服務(wù)器之間具有高速且可靠的通信線路,同時(shí)要求在單一數(shù)據(jù)庫(kù)上實(shí)現(xiàn)自動(dòng)故障轉(zhuǎn)移的場(chǎng)景。當(dāng)safety為full時(shí),主服務(wù)器必須短暫等待來(lái)自鏡像服務(wù)器的回答,主服務(wù)器性能也因此受到鏡像服務(wù)器能力的影響。由于單數(shù)據(jù)庫(kù)失敗將導(dǎo)致自動(dòng)故障轉(zhuǎn)移,因此如果有多數(shù)據(jù)庫(kù)應(yīng)用程序,那么就應(yīng)該考慮其他操作模式(參閱該白皮書(shū)中實(shí)現(xiàn)數(shù)據(jù)庫(kù)鏡像部分介紹的“多數(shù)據(jù)庫(kù)問(wèn)題”)
高可用模式中數(shù)據(jù)庫(kù)鏡像是自監(jiān)視的。如果主數(shù)據(jù)庫(kù)突然不可用,或者主服務(wù)器停機(jī),那么見(jiàn)證服務(wù)器和鏡像服務(wù)器將組成quorum,然后鏡像的sql server將進(jìn)行自動(dòng)故障轉(zhuǎn)移。此時(shí),競(jìng)相服務(wù)器實(shí)例將其角色轉(zhuǎn)換為新主服務(wù)器并恢復(fù)數(shù)據(jù)庫(kù)。由于鏡像數(shù)據(jù)庫(kù)已經(jīng)重新執(zhí)行了主數(shù)據(jù)庫(kù)的事務(wù)日志并且其事務(wù)日志也與主數(shù)據(jù)庫(kù)同步,因此鏡像服務(wù)器可以快速提供數(shù)據(jù)庫(kù)服務(wù)。
此外,sql server 2005可以在數(shù)據(jù)庫(kù)恢復(fù)前就向用戶提供數(shù)據(jù)庫(kù)服務(wù)。sql server數(shù)據(jù)庫(kù)恢復(fù)包括三個(gè)階段:分析階段、redo階段、以及最后的undo階段。在sql server 2005中,只要redo階段完成,新恢復(fù)的數(shù)據(jù)庫(kù)就可以讓用戶訪問(wèn)。因此如果數(shù)據(jù)庫(kù)鏡像故障轉(zhuǎn)移發(fā)生,新恢復(fù)的主數(shù)據(jù)庫(kù)只要完成了redo階段就可以向用戶提供服務(wù)了。因?yàn)殓R像數(shù)據(jù)庫(kù)自始至終都在重新執(zhí)行事務(wù)日志記錄,因此所有鏡像服務(wù)器只須完成redo過(guò)程就可以了,通常幾秒鐘就可以完成。
高保護(hù)操作模式
高保護(hù)操作模式中事務(wù)安全性設(shè)置為full,但是鏡像會(huì)話中沒(méi)有見(jiàn)證服務(wù)器。主服務(wù)器必須組成quorum,可是沒(méi)有見(jiàn)證服務(wù)器,因此只能和鏡像服務(wù)器配合在一起。這種模式下由于沒(méi)有見(jiàn)證服務(wù)器來(lái)?yè)?dān)當(dāng)平局決勝的角色,因此只能手動(dòng)完成故障轉(zhuǎn)移。行自動(dòng)故障轉(zhuǎn)移是不可能的,因?yàn)槿绻鞣?wù)器失敗,鏡像服務(wù)器沒(méi)有見(jiàn)證服務(wù)器來(lái)組成quorum。
safety設(shè)置為full,如果主服務(wù)器突然間失去了和鏡像服務(wù)器的quorum,那么鏡像服務(wù)器必須使其數(shù)據(jù)庫(kù)停止服務(wù)。不推薦使用高保護(hù)模式的數(shù)據(jù)庫(kù)鏡像配置,除非在高可用模式下必須臨時(shí)移除見(jiàn)證服務(wù)器時(shí),可以使用該模式作為一種臨時(shí)過(guò)渡。
高性能操作模式
在高性能操作模式下,事務(wù)安全性設(shè)置為off,以異步方式傳輸日志記錄。主服務(wù)器無(wú)須等待鏡像服務(wù)器所有日志記錄已被硬化的確認(rèn)信息。鏡像服務(wù)器盡自己最大可能保持與主服務(wù)器數(shù)據(jù)的一致,但不能保證在任何時(shí)刻來(lái)自主數(shù)據(jù)庫(kù)的所有最新事務(wù)日志記錄都能夠被硬化到鏡像數(shù)據(jù)庫(kù)的事務(wù)日志中。
在高性能模式下,見(jiàn)證服務(wù)器不承擔(dān)任何角色,也不需要quorum。因此高性能模式無(wú)法啟用自動(dòng)和手動(dòng)的故障轉(zhuǎn)移。唯一允許的故障轉(zhuǎn)移方式就是forced service ,它同樣也是一種手工操作:
alter database <dbname> set partner force_service_allow_data_lossforced service故障轉(zhuǎn)移導(dǎo)致立刻恢復(fù)鏡像數(shù)據(jù)庫(kù)。如果某些主數(shù)據(jù)庫(kù)的事務(wù)日志記錄還沒(méi)有被鏡像服務(wù)器接收,那么恢復(fù)鏡像數(shù)據(jù)庫(kù)將導(dǎo)致潛在的數(shù)據(jù)丟失。高性能模式特別適合于遠(yuǎn)距離的數(shù)據(jù)傳輸(換句話說(shuō),用于遠(yuǎn)程站點(diǎn)的災(zāi)難恢復(fù)),或者對(duì)那些活動(dòng)頻繁且可以容忍某種程度數(shù)據(jù)丟失的數(shù)據(jù)庫(kù)進(jìn)行鏡像。
數(shù)據(jù)庫(kù)快照和數(shù)據(jù)庫(kù)鏡像
由于鏡像數(shù)據(jù)庫(kù)處于recovering狀態(tài),因此不可訪問(wèn)也不可讀。在sql server 2005企業(yè)版和開(kāi)發(fā)人員版中可以創(chuàng)建數(shù)據(jù)庫(kù)快照來(lái)讀取某個(gè)時(shí)點(diǎn)的鏡像數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)快照提供了一個(gè)只讀的數(shù)據(jù)庫(kù)視圖,開(kāi)放數(shù)據(jù)給用戶訪問(wèn)。這些數(shù)據(jù)與創(chuàng)建快照時(shí)刻的數(shù)據(jù)庫(kù)數(shù)據(jù)相一致。
對(duì)數(shù)據(jù)庫(kù)快照的訪問(wèn)如同訪問(wèn)一個(gè)其他的數(shù)據(jù)庫(kù)。查詢數(shù)據(jù)庫(kù)快照時(shí),從數(shù)據(jù)庫(kù)快照文件中讀出那些自快照創(chuàng)建后被修改的數(shù)據(jù),從原始數(shù)據(jù)庫(kù)中讀出未修改的數(shù)據(jù)。最終效果就是讀取了在創(chuàng)建快照時(shí)刻數(shù)據(jù)庫(kù)當(dāng)時(shí)的數(shù)據(jù)。(更多信息請(qǐng)參閱sql server books online中"using database snapshots with database mirroring"主題。)
由于數(shù)據(jù)庫(kù)快照確實(shí)增加了鏡像服務(wù)器的負(fù)擔(dān),因此需要當(dāng)心它們對(duì)數(shù)據(jù)庫(kù)鏡像性能可能造成的影響。由于只能鏡像到一個(gè)數(shù)據(jù)庫(kù),因此如果需要將數(shù)據(jù)擴(kuò)充到多個(gè)只讀的報(bào)表服務(wù)器上,那么事務(wù)復(fù)制是更好的選擇。(更新信息請(qǐng)閱讀后面實(shí)現(xiàn)數(shù)據(jù)庫(kù)鏡像部分的“數(shù)據(jù)庫(kù)鏡像和復(fù)制”)
客戶端重定向
在sql server 2005中,如果使用ado.net或者sql native client連接配置了鏡像的數(shù)據(jù)庫(kù),那么應(yīng)用程序就可以利用驅(qū)動(dòng)程序的能力在發(fā)生數(shù)據(jù)庫(kù)鏡像故障轉(zhuǎn)移時(shí)自動(dòng)重定向數(shù)據(jù)庫(kù)連接。必須在連接字符串中指定原始主服務(wù)器和數(shù)據(jù)庫(kù)名稱,以及可選的故障轉(zhuǎn)移伙伴服務(wù)器名稱。
連接字符串的寫(xiě)法有許多種,以下只給出一個(gè)例子,指定server a作為主服務(wù)器,server b作為鏡像服務(wù)器,adventureworks作為數(shù)據(jù)庫(kù)名稱:
"data source=a;failover partner=b;initial catalog=adventureworks;
integrated security=true;"如果連接到原始主服務(wù)器失敗,那么就使用連接字符串中的failover partner作為備用服務(wù)器名稱。如果連接到原始主服務(wù)器成功,那么就不使用連接字符串中的failover partner名稱,但是會(huì)從主服務(wù)器上查詢其故障轉(zhuǎn)移伙伴的名稱并將結(jié)果存放在客戶端緩存中。
假設(shè)客戶端成功連接到主服務(wù)器,然后一個(gè)數(shù)據(jù)庫(kù)鏡像故障轉(zhuǎn)移發(fā)生(自動(dòng)地、手動(dòng)的、forced)。當(dāng)下一次應(yīng)用程序嘗試使用連接時(shí),ado.net或者sql native client驅(qū)動(dòng)程序?qū)?huì)檢測(cè)到與舊主服務(wù)器的連接已經(jīng)失敗,然后自動(dòng)重新連接由failover partner名稱指定的新主服務(wù)器。如果連接成功并且新的鏡像服務(wù)器存在,那么驅(qū)動(dòng)程序從新主服務(wù)器處獲取新的故障轉(zhuǎn)移伙伴名稱并將其存放在客戶端緩存中。如果無(wú)法連接到備用服務(wù)器,那么驅(qū)動(dòng)程序?qū)⒔惶鎳L試與每個(gè)服務(wù)器的連接直道連接超時(shí)。
使用內(nèi)置在ado.net和sql native client驅(qū)動(dòng)程序中的數(shù)據(jù)庫(kù)鏡像支持的最大優(yōu)點(diǎn)就是無(wú)須重新編寫(xiě)應(yīng)用程序,或者在應(yīng)用程序中編寫(xiě)特殊代碼來(lái)處理數(shù)據(jù)庫(kù)鏡像的故障轉(zhuǎn)移。
如果不使用ado.net或者sql native client自動(dòng)進(jìn)行重定向,那么也可以使用其他技術(shù)使應(yīng)用程序進(jìn)行故障轉(zhuǎn)移。例如,如果客戶端連接到一臺(tái)虛擬服務(wù)器,可以使用network load balancing手動(dòng)重定向一臺(tái)服務(wù)器到另一臺(tái)服務(wù)器的連接。還可以編程實(shí)現(xiàn)自己的重定向代碼和連接重試邏輯。
但是,所有這些用于協(xié)調(diào)客戶端重定向和數(shù)據(jù)庫(kù)鏡像的技術(shù)都有一些重要限制。數(shù)據(jù)庫(kù)鏡像只能工作在數(shù)據(jù)庫(kù)級(jí)別,而不是服務(wù)器級(jí)別。如果應(yīng)用程序查詢一臺(tái)服務(wù)器上的多個(gè)數(shù)據(jù)庫(kù),或者使用完全限定對(duì)象名稱進(jìn)行跨數(shù)據(jù)庫(kù)查詢,那么就需要多加小心了。如果多個(gè)數(shù)據(jù)庫(kù)位于一臺(tái)服務(wù)器并且都配置了和備用服務(wù)器的鏡像,就有可能出現(xiàn)其中一個(gè)數(shù)據(jù)庫(kù)故障轉(zhuǎn)移到備用服務(wù)器而其他數(shù)據(jù)庫(kù)依然在原始服務(wù)器的情況。如果是那樣的話,可能就要求每個(gè)數(shù)據(jù)庫(kù)查詢都使用一個(gè)單獨(dú)的連接,這樣將無(wú)法進(jìn)行跨數(shù)據(jù)庫(kù)查詢,因?yàn)樵阽R像服務(wù)器上只有一個(gè)數(shù)據(jù)庫(kù)是主數(shù)據(jù)庫(kù),其余都是鏡像數(shù)據(jù)庫(kù)。
數(shù)據(jù)庫(kù)鏡像與sql server 2005版本
下表顯示各種版本的sql server 2005支持的數(shù)據(jù)庫(kù)鏡像功能。
表2:數(shù)據(jù)庫(kù)鏡像和sql server 2005版本
| 數(shù)據(jù)庫(kù) 鏡像功能 | 企業(yè)版 | 開(kāi)發(fā)人員版 | 標(biāo)準(zhǔn)版 | 工作組版 | sql express | 
| 鏡像伙伴 | √ | √ | √ | ||
| 見(jiàn)證服務(wù)器 | √ | √ | √ | √ | √ | 
| safety = full | √ | √ | √ | ||
| safety = off | √ | √ | |||
| 故障轉(zhuǎn)移后undo期間數(shù)據(jù)庫(kù)可用性 | √ | √ | √ | ||
| 并行redo | √ | √ | |||
| 數(shù)據(jù)庫(kù)快照 | √ | √ | 
少數(shù)幾個(gè)數(shù)據(jù)庫(kù)鏡像功能要求使用sql server 2005企業(yè)版或者開(kāi)發(fā)人員版:
◆高性能模式下safety設(shè)置為off (異步數(shù)據(jù)傳輸);
◆數(shù)據(jù)庫(kù)快照;
◆使用多線程在鏡像數(shù)據(jù)庫(kù)上應(yīng)用事務(wù)日志(并行redo)。
sql express和工作組版本可以作為數(shù)據(jù)庫(kù)鏡像的見(jiàn)證服務(wù)器,但不能作為伙伴服務(wù)器。
數(shù)據(jù)庫(kù)鏡像動(dòng)態(tài)
要深入理解sql server 2005 數(shù)據(jù)庫(kù)鏡像,了解數(shù)據(jù)庫(kù)鏡像會(huì)話如何變化將對(duì)您大有幫助。這一部分內(nèi)容包括數(shù)據(jù)庫(kù)鏡像會(huì)話中不同的數(shù)據(jù)庫(kù)狀態(tài)、同步和異步的日志記錄傳輸機(jī)制、以及故障轉(zhuǎn)移次序。
配置和安全性
一旦確定了主服務(wù)器、鏡像服務(wù)器、以及可選的見(jiàn)證服務(wù)器,設(shè)置數(shù)據(jù)庫(kù)鏡像主要包括三個(gè)步驟。
1.必須備份數(shù)據(jù)庫(kù)并使用norecovery在鏡像數(shù)據(jù)庫(kù)上還原該數(shù)據(jù)庫(kù)。
注意:在備份數(shù)據(jù)庫(kù)并還原到鏡像數(shù)據(jù)庫(kù)之前,主數(shù)據(jù)庫(kù)必須設(shè)置為full還原模型。如果必須在事務(wù)日志中傳輸bulk-logged記錄,那么數(shù)據(jù)庫(kù)鏡像將無(wú)能為力。鏡像服務(wù)器必須有足夠的磁盤空間以允許和主數(shù)據(jù)庫(kù)同樣的文件增長(zhǎng)。如果希望在鏡像服務(wù)器中創(chuàng)建數(shù)據(jù)庫(kù)快照,那么還必須為快照提供額外的磁盤空間。
如果備份、拷貝、以及還原數(shù)據(jù)庫(kù)耗費(fèi)了相當(dāng)長(zhǎng)的時(shí)間,那么可能需要現(xiàn)在原始數(shù)據(jù)庫(kù)上進(jìn)行一次事務(wù)日志備份來(lái)控制日志的大小。但是,如果通過(guò)日志到日志的備份清理了日志記錄,數(shù)據(jù)庫(kù)鏡像將無(wú)法初始化。因此必須在初始化數(shù)據(jù)庫(kù)鏡像之前在鏡像數(shù)據(jù)庫(kù)上按順序恢復(fù)那些事務(wù)日志記錄備份。
2.參與數(shù)據(jù)庫(kù)鏡像會(huì)話的服務(wù)器必須彼此信任。對(duì)于本地通信而言,例如一個(gè)域內(nèi)的通信,信任意味著sql server實(shí)例登陸賬號(hào)必須有權(quán)限連接到其他鏡像服務(wù)器,也包括endpoints。首先在每個(gè)服務(wù)器上使用create login命令,然后使用grant connect on endpoint命令(參閱" in sql server books online中“example of setting up database mirroring using windows authentication”)
非信任域之間的通信必須使用證書(shū)。如果使用create certificate語(yǔ)句創(chuàng)建自簽名的證書(shū),基本上所有數(shù)據(jù)鏡像證書(shū)的要求都可以滿足。確認(rèn)在create certificate語(yǔ)句中將證書(shū)標(biāo)記為active for begin_dialog。
3.下一步是創(chuàng)建數(shù)據(jù)庫(kù)鏡像的endpoints。創(chuàng)建endpoints要求您必須具有sql server instance的系統(tǒng)管理員權(quán)限。必須在每臺(tái)服務(wù)器上創(chuàng)建專門用于數(shù)據(jù)庫(kù)鏡像的endpoints. 創(chuàng)建endpoints最簡(jiǎn)單的方式就是使用configure database mirroring security向?qū)В梢栽赿atabase properties對(duì)話框中mirroring頁(yè)面上單擊configure security按鈕啟動(dòng)該向?qū)Аonfigure security對(duì)話框會(huì)在構(gòu)造和執(zhí)行create endpoint命令之前,提示您輸入正確的計(jì)算機(jī)名稱和端口號(hào),以及可選的登陸帳號(hào)。(參閱sql server books online中 “how to: create a mirroring endpoint (transact-sql)”)
如果在域中設(shè)置數(shù)據(jù)庫(kù)鏡像,并且所有的sql server實(shí)例使用相同的服務(wù)帳號(hào)和密碼,那么就不需要在每個(gè)服務(wù)器上創(chuàng)建登陸帳號(hào)。類似的,如果在工作組中,并且所有的sql server實(shí)例使用相同的服務(wù)帳號(hào)和密碼,也不需要在每個(gè)服務(wù)器上創(chuàng)建登陸帳號(hào)。設(shè)置endpoints時(shí)將configure database mirroring security向?qū)е械牡顷憥ぬ?hào)保留為空就可以了。
每個(gè)數(shù)據(jù)庫(kù)endpoint必須指定服務(wù)器上一個(gè)唯一的端口號(hào)。如果使用不同服務(wù)器上的sql server實(shí)例,那么這些端口號(hào)可以是相同的。configure database mirroring security向?qū)?huì)自動(dòng)建議您使用5022作為端口號(hào)。如果任何sql server實(shí)例運(yùn)行在同一臺(tái)服務(wù)器上,那么每個(gè)實(shí)例的端口號(hào)必須唯一,所有的鏡像端口號(hào)也必須唯一。
假設(shè)在高可用鏡像會(huì)話中有三臺(tái)服務(wù)器。server a是主服務(wù)器,server b是鏡像服務(wù)器,server w作為見(jiàn)證服務(wù)器。對(duì)于server a而言,下面的命令在5022端口創(chuàng)建endpoint:
create endpoint [mirroring]
as tcp (listener_port = 5022)
for database_mirroring (role = partner, encryption = enabled);注意:角色被指定為partner,這樣該服務(wù)器可以擔(dān)當(dāng)數(shù)據(jù)庫(kù)鏡像的主服務(wù)器或者鏡像服務(wù)器。在server b上執(zhí)行相同的命令。因?yàn)閟erver b是獨(dú)立物理服務(wù)器上的sql server實(shí)例,因此可以使用相同的端口號(hào)。然后對(duì)于server w,使用
create endpoint [mirroring]
as tcp (listener_port = 5022)
for database_mirroring (role = witness, encryption = enabled);注意:對(duì)于server w,角色被指定為witness。
默認(rèn)不啟動(dòng)endpoint。接下來(lái)在每個(gè)服務(wù)器上使用下面的命令來(lái)啟動(dòng)endpoint:
alter endpoint [mirroring] state = started;可以在create endpoint命令中插入可選的state選項(xiàng)。在每臺(tái)服務(wù)器上反復(fù)執(zhí)行該選項(xiàng)。
使用create endpoint創(chuàng)建endpoint時(shí),可以通過(guò)協(xié)議特定的參數(shù)根據(jù)ip地址來(lái)限制對(duì)endpoint的訪問(wèn)。結(jié)合restrict_ip with all選項(xiàng)和except_ip加上那些允許訪問(wèn)的特殊ip地址可以對(duì)一組ip地址作限制。(參閱sql server books online中的see “create endpoint”)。
查詢每個(gè)服務(wù)器的sys.database_mirroring_endpoints目錄視圖來(lái)檢查數(shù)據(jù)庫(kù)鏡像的endpoints:
select *
from sys.database_mirroring_endpoints;4. 要啟動(dòng)數(shù)據(jù)庫(kù)鏡像,接下來(lái)指定指定伙伴服務(wù)器和見(jiàn)證服務(wù)器。 必須具有數(shù)據(jù)庫(kù)管理員權(quán)限才可以啟動(dòng)和管理一個(gè)給定的數(shù)據(jù)庫(kù)鏡像會(huì)話。在server a,即打算作主服務(wù)器的機(jī)器上設(shè)置主數(shù)據(jù)庫(kù)角色以及伙伴(鏡像)服務(wù)器:
-- specify the partner from the principal server
alter database [adventureworks] set partner =
n'tcp://b.corp.mycompany.com:5022';鏡像伙伴的名稱必須為完全限定計(jì)算機(jī)名。決定機(jī)器的完全限定名稱可能有些難,不過(guò)configure database mirroring security向?qū)?huì)在建立endpoint時(shí)自動(dòng)找出它們。
從命令行提示中運(yùn)行下面的命令也可以找出一臺(tái)機(jī)器的完全限定名稱:
ipconfig /all
將"host name"和"primary dns suffix"連接到一起。如果您看到的信息類似于:
host name . . . . . . . . . . . . : a
primary dns suffix . . . . . . . : corp.mycompany.com
那么計(jì)算機(jī)名就是a.corp.mycompany.com。加上'tcp://'前綴然后再附加':<端口號(hào)>' ,就是鏡像伙伴名稱。
在鏡像服務(wù)器上重復(fù)相同的命令,但是要指定主服務(wù)器名稱:
-- specify the partner from the mirror server
alter database [adventureworks] set partner =
n'tcp://a.corp.mycompany.com:5022';接下來(lái)在主服務(wù)器上指定見(jiàn)證服務(wù)器:
-- specify the witness from the principal server
alter database [adventureworks] set witness =
n'tcp://w.corp.mycompany.com:5026';執(zhí)行完create endpoint后見(jiàn)證服務(wù)器上就不需要執(zhí)行其他命令了。
最后,在主服務(wù)器上指定會(huì)話的safety級(jí)別:
-- set the safety level from the principal server
alter database [adventureworks] set safety full;此時(shí),鏡像將自動(dòng)啟動(dòng),然后主服務(wù)器和鏡像服務(wù)器將進(jìn)行同步。
可以調(diào)整判定鏡像伙伴是否故障的超時(shí)值,使用alter database命令的timeout參數(shù)。例如將timeout值改為20秒(默認(rèn)是10),在主服務(wù)器上執(zhí)行:
-- issue from the principal server
alter database [adventureworks] set partner timeout 20;最后,在主服務(wù)器上使用alter database和redo_queue選項(xiàng)可以鏡像服務(wù)器上redo隊(duì)列的大小。下面的查詢將鏡像服務(wù)器的redo隊(duì)列設(shè)置為100兆:
-- issue from the principal server
alter database [adventureworks] set partner redo_queue 100mb;只要指定了鏡像伙伴,鏡像將立即啟動(dòng)。
數(shù)據(jù)庫(kù)鏡像目錄視圖
數(shù)據(jù)庫(kù)鏡像會(huì)話包括組成伙伴的服務(wù)器,可能還有見(jiàn)證服務(wù)器之間的關(guān)聯(lián)。每臺(tái)參與鏡像的服務(wù)器都保存關(guān)于鏡像會(huì)話和當(dāng)前數(shù)據(jù)庫(kù)狀態(tài)的元數(shù)據(jù)。可以在主服務(wù)器和鏡像服務(wù)器上通過(guò)查詢sys.database_mirroring目錄視圖來(lái)檢查會(huì)話狀態(tài)。使用另一個(gè)視圖sys.database_mirroring_witnesses可是返回見(jiàn)證服務(wù)器的信息(要想獲得兩個(gè)目錄視圖中所有列的更完整的描述,請(qǐng)參閱 sql server books online的“sys.database_mirroring" and "sys.database_mirrroing_witnesses”)。
了解數(shù)據(jù)庫(kù)鏡像會(huì)話如何工作以及數(shù)據(jù)庫(kù)處于何種狀態(tài)的一種不錯(cuò)的方法就是檢查目錄視圖里的數(shù)據(jù)。我們從高可用配置開(kāi)始(safety設(shè)置為full,有一臺(tái)見(jiàn)證服務(wù)器)。下面的查詢返回了主服務(wù)器或者見(jiàn)證服務(wù)器上數(shù)據(jù)庫(kù)鏡像會(huì)話的基本描述信息。
select
db_name(database_id) as 'databasename'
, mirroring_role_desc
, mirroring_safety_level_desc
, mirroring_state_desc
, mirroring_safety_sequence
, mirroring_role_sequence
, mirroring_partner_instance
, mirroring_witness_name
, mirroring_witness_state_desc
, mirroring_failover_lsn
from sys.database_mirroring
where mirroring_guid is not null;在見(jiàn)證服務(wù)器上運(yùn)行下面類似的查詢,可以返回見(jiàn)證服務(wù)器的相關(guān)描述信息。
select
database_name
, safety_level_desc
, safety_sequence_number
, role_sequence_number
, is_suspended
, is_suspended_sequence_number
, principal_server_name
, mirror_server_name
from sys.database_mirroring_witnesses;現(xiàn)在來(lái)比較在一個(gè)典型的數(shù)據(jù)庫(kù)鏡像會(huì)話中兩個(gè)查詢的輸出結(jié)果。假設(shè)已經(jīng)設(shè)置了server a到 server b的數(shù)據(jù)庫(kù)鏡像,使用safety為full。(設(shè)置以下配置的示例代碼,請(qǐng)參閱后面的實(shí)現(xiàn)數(shù)據(jù)庫(kù)鏡像“配置和安全性”)見(jiàn)證服務(wù)器是server w,對(duì)adventureworks數(shù)據(jù)庫(kù)做鏡像。表3顯示了兩個(gè)查詢的輸出結(jié)果:
表3:高可用鏡像會(huì)話,兩個(gè)伙伴服務(wù)器sys.database_mirroring輸出結(jié)果
| 鏡像伙伴的 元數(shù)據(jù)列 | 主服務(wù)器值: server a | 鏡像服務(wù)器值: server b | 
| db_name(database_id) | adventureworks | adventureworks | 
| mirroring_role_desc | principal | mirror | 
| mirroring_safety_level_desc | full | full | 
| mirroring_state_desc | synchronized | synchronized | 
| mirroring_safety_sequence | 1 | 1 | 
| mirroring_role_sequence | 1 | 1 | 
| mirroring_partner_instance | tcp://b.corp.mycompany.com:5022 | tcp://a. .corp.mycompany.com:5022 | 
| mirroring_witness_name | tcp://w.corp.mycompany.com:5022 | tcp://w.corp.mycompany.com:5022 | 
| mirroring_witness_state_desc | connected | connected | 
| mirroring_failover_lsn | 95000000007300001 | 95000000007300001 | 
注意數(shù)據(jù)庫(kù)鏡像會(huì)話中的每個(gè)伙伴保存的所有元數(shù)據(jù)從另一個(gè)伙伴的角度來(lái)看是完全相同的。每個(gè)伙伴保存其數(shù)據(jù)庫(kù)名稱、整個(gè)會(huì)話的safety設(shè)置、數(shù)據(jù)庫(kù)的鏡像狀態(tài)、以及兩個(gè)序列計(jì)數(shù)器。
◆mirroring_safety_sequence計(jì)數(shù)器保存在兩個(gè)伙伴上,只要safety設(shè)置改變時(shí)將增加該計(jì)數(shù)器的值。
◆mirroring_role_sequence計(jì)數(shù)器保存在兩個(gè)伙伴以及見(jiàn)證服務(wù)器上,只要發(fā)生故障轉(zhuǎn)移就增加該計(jì)數(shù)器的值。
伙伴數(shù)據(jù)庫(kù)的狀態(tài)以及見(jiàn)證服務(wù)器的狀態(tài)都保存在每個(gè)伙伴服務(wù)器上:
◆mirroring_state_desc顯示了會(huì)話中伙伴數(shù)據(jù)庫(kù)的狀態(tài)。
◆mirroring_witness_state_desc顯示了會(huì)話中見(jiàn)證服務(wù)器的狀態(tài)。
最后,每個(gè)伙伴都包含一個(gè)mirroring_failover_lsn。lsn是一個(gè)日志序列號(hào),用于唯一標(biāo)識(shí)每條事務(wù)日志記錄。 鏡像伙伴將上次硬化的最后一組日志記錄的最高lsn +1保存起來(lái)。在上表中,由于主數(shù)據(jù)庫(kù)中只有為數(shù)不多的活動(dòng),因此 鏡像轉(zhuǎn)移故障的lsn和主服務(wù)器以及見(jiàn)證服務(wù)器的lsn相同。當(dāng)傳輸大量數(shù)據(jù)時(shí),可能就會(huì)發(fā)現(xiàn)主服務(wù)器的lsn值大于鏡像服務(wù)器的值,因?yàn)殓R像服務(wù)器的運(yùn)行有些滯后。
現(xiàn)在比較一下在見(jiàn)證服務(wù)器上找到的元數(shù)據(jù)。下表顯示了來(lái)自見(jiàn)證服務(wù)器元數(shù)據(jù)的一些可比較信息:
表4:見(jiàn)證服務(wù)器上sys.database_mirroring_witnesses的輸出,關(guān)聯(lián)了伙伴的元數(shù)據(jù)
| 見(jiàn)證服務(wù)器的元數(shù)據(jù)列 | 見(jiàn)證服務(wù)器值 | 相應(yīng)的鏡像伙伴元數(shù)據(jù)列 | 
| database_name | adventureworks | db_name(database_id) | 
| safety_level_desc | full | mirroring_safety_level_desc | 
| safety_sequence_number | 1 | mirroring_safety_sequence | 
| role_sequence_number | 1 | mirroring_role_sequence | 
| is_suspended | 0 | |
| is_suspended_sequence_number | 1 | |
| principal_server_name | tcp://a. .corp.mycompany.com:5022 | |
| mirror_server_name | tcp://b.corp.mycompany.com:5022 | 
注意見(jiàn)證服務(wù)器的元數(shù)據(jù)包含了safety的描述、safety的序列號(hào)、以及角色序列號(hào)。見(jiàn)證服務(wù)器還保存了會(huì)話是否被掛起的信息,以及主服務(wù)器和鏡像服務(wù)器的名稱。注意見(jiàn)證服務(wù)器的目錄視圖并沒(méi)有報(bào)告鏡像故障轉(zhuǎn)移的lsn,而且也不保存數(shù)據(jù)庫(kù)狀態(tài)。
數(shù)據(jù)庫(kù)鏡像所需的全部元數(shù)據(jù)(特別是故障轉(zhuǎn)移lsn和伙伴服務(wù)器名稱)都保存在鏡像伙伴上。見(jiàn)證服務(wù)器只保存在高可用模式下作為見(jiàn)證者必須保存的那些數(shù)據(jù),特別是用于跟蹤會(huì)話中角色轉(zhuǎn)換數(shù)目的角色序列號(hào)。該計(jì)數(shù)器用于幫助判定何時(shí)一臺(tái)主服務(wù)器可以做角色轉(zhuǎn)換。相關(guān)知識(shí)會(huì)在下一部分介紹的場(chǎng)景中進(jìn)行闡述。
數(shù)據(jù)庫(kù)鏡像狀態(tài)和狀態(tài)轉(zhuǎn)換
在數(shù)據(jù)庫(kù)鏡像會(huì)話過(guò)程中,每臺(tái)伙伴服務(wù)器都對(duì)數(shù)據(jù)庫(kù)狀態(tài)作記錄和保存,可以通過(guò)sys.database_mirroring目錄視圖來(lái)查看。mirroring_state列返回狀態(tài)號(hào),mirroring_state_desc列返回狀態(tài)的描述性名稱。(要想獲取關(guān)于數(shù)據(jù)庫(kù)狀態(tài)號(hào)和描述性名稱的完整列表,請(qǐng)看sql server books online中的“sys.database_mirroring”)。同樣的目錄視圖還用于報(bào)告見(jiàn)證服務(wù)器的狀態(tài)信息。
除了為每個(gè)數(shù)據(jù)庫(kù)報(bào)告狀態(tài)信息以外,還有三個(gè)重要術(shù)語(yǔ)用來(lái)對(duì)數(shù)據(jù)庫(kù)鏡像中的服務(wù)器和數(shù)據(jù)庫(kù)進(jìn)行描述。
1.主服務(wù)器上的數(shù)據(jù)是exposed ,當(dāng)它進(jìn)行事務(wù)處理但是沒(méi)有日志數(shù)據(jù)被發(fā)送到鏡像服務(wù)器。
2.不能提供數(shù)據(jù)庫(kù)服務(wù) – 當(dāng)主服務(wù)器不允許任何用戶連接到數(shù)據(jù)庫(kù),不允許任何事務(wù)處理。
3.服務(wù)器被孤立 – 當(dāng)它無(wú)法聯(lián)系數(shù)據(jù)庫(kù)鏡像會(huì)話中任何其他服務(wù)器,同時(shí)別人也聯(lián)系不上它。
當(dāng)主數(shù)據(jù)庫(kù)是exposed,它可以接收用戶連接和進(jìn)行事務(wù)處理,但是沒(méi)有日志記錄被發(fā)送到鏡像數(shù)據(jù)庫(kù)。因此如果主數(shù)據(jù)庫(kù)失敗了,那么鏡像數(shù)據(jù)庫(kù)不包含任何自主數(shù)據(jù)庫(kù)進(jìn)入exposed狀態(tài)后主服務(wù)器上發(fā)生的事務(wù)。同樣的,也不可以清理主數(shù)據(jù)庫(kù)的事務(wù)日志,這導(dǎo)致日志文件的無(wú)限增長(zhǎng)。
當(dāng)safety設(shè)置為full時(shí),如果主服務(wù)器無(wú)法和其他服務(wù)器組成quorum,它將停止提供數(shù)據(jù)庫(kù)服務(wù)。主服務(wù)器將不允許主數(shù)據(jù)庫(kù)上的用戶連接和事務(wù),并斷開(kāi)所有當(dāng)前的用戶。只要主服務(wù)器能再次組成quorum,就立刻重新提供數(shù)據(jù)庫(kù)服務(wù)。
一臺(tái)服務(wù)器可能運(yùn)轉(zhuǎn)正常但是它和數(shù)據(jù)庫(kù)鏡下會(huì)話中的其他服務(wù)器之間的通信連路中斷了。如果那樣的話,我們稱服務(wù)器被孤立了。 當(dāng)safety為full時(shí),如果主服務(wù)器被孤立,那么它將無(wú)法提供數(shù)據(jù)庫(kù)服務(wù),因?yàn)闀?huì)話中沒(méi)有其他服務(wù)器可與之共同組成quorum。
新聞熱點(diǎn)
疑難解答
圖片精選