引言:在SQL Server早期版本中,便出現(xiàn)了日志傳送(即Log Shipping)技術(shù)。日志傳送擁有獨(dú)特的功能,在SQL Server災(zāi)難恢復(fù)技術(shù)中扮演著重要的角色。其工作機(jī)制主要是通過(guò)事務(wù)日志備份和還原任務(wù),來(lái)保持多臺(tái)SQL Server主機(jī)之間的數(shù)據(jù)同步。
在日志傳送機(jī)制中,主服務(wù)器可以同時(shí)對(duì)應(yīng)多臺(tái)輔助服務(wù)器,即可以存在多個(gè)主數(shù)據(jù)庫(kù)的副本。
例如,當(dāng)存在三臺(tái)輔助服務(wù)器的情況下,前兩臺(tái)服務(wù)器上的輔助數(shù)據(jù)庫(kù)設(shè)置為無(wú)恢復(fù)模式,提供冗余的災(zāi)備功能,即使其中一臺(tái)服務(wù)器出現(xiàn)故障,另外一臺(tái)也可以提供災(zāi)難恢復(fù)功能。第三臺(tái)服務(wù)器上的輔助數(shù)據(jù)庫(kù)可以設(shè)置為備用模式,將諸如報(bào)表讀查詢請(qǐng)求之類(lèi)的操作交由其處理。
此外,還可以為日志傳送機(jī)制配置監(jiān)視服務(wù)器,主要用來(lái)記錄備份/還原作業(yè)的歷史和狀態(tài)信息,可以在作業(yè)失敗時(shí)生成警報(bào)。
日志傳送機(jī)制的運(yùn)作并不復(fù)雜,首先日志傳送組件在主服務(wù)器上對(duì)主數(shù)據(jù)庫(kù)進(jìn)行日志備份.
然后將日志備份文件復(fù)制到所有的輔助服務(wù)器上,輔助服務(wù)器對(duì)備份日志進(jìn)行還原,這樣的一系列過(guò)程不斷進(jìn)行重復(fù),實(shí)現(xiàn)主服務(wù)器和輔助服務(wù)器上數(shù)據(jù)的同步。
當(dāng)然,需要在主服務(wù)器,輔助服務(wù)器和監(jiān)視服務(wù)器上創(chuàng)建相應(yīng)的Job作業(yè)(例如備份作業(yè),復(fù)制作業(yè),還原作業(yè),監(jiān)視作業(yè)等),并通過(guò)每臺(tái)服務(wù)器上的SQL Server代理服務(wù)來(lái)觸發(fā)這些作業(yè),實(shí)現(xiàn)上述備份,復(fù)制和還原動(dòng)作。
在主服務(wù)器上存在一個(gè)共享目錄,日志備份作業(yè)將備份日志存放到該目錄中。通過(guò)復(fù)制作業(yè),將備份日志文件復(fù)制到輔助服務(wù)器上的本地目錄中,同時(shí)創(chuàng)建相應(yīng)的記錄信息,利用還原作業(yè),將日志備份文件還原到輔助數(shù)據(jù)庫(kù)中。
如果在預(yù)設(shè)的時(shí)間內(nèi),無(wú)法完成以上備份,復(fù)制和還原作業(yè),就會(huì)在監(jiān)視服務(wù)器上觸發(fā)監(jiān)視作業(yè),創(chuàng)建狀態(tài)和歷史記錄以及警報(bào)信息。
當(dāng)主數(shù)據(jù)出現(xiàn)異常,可以將應(yīng)用切換到輔助服務(wù)器上。在一般情況下,當(dāng)發(fā)生故障時(shí),主數(shù)據(jù)庫(kù)和輔助數(shù)據(jù)庫(kù)是不同步的,如果主數(shù)據(jù)庫(kù)還可以訪問(wèn),就需要手工對(duì)其進(jìn)行日志備份(即備份主數(shù)據(jù)庫(kù)的尾日志),這樣就獲得了最后一次備份作業(yè)觸發(fā)后所有的數(shù)據(jù)更新。
然后將主服務(wù)器上的共享目錄中的所有未被復(fù)制的備份文件,連同尾日志備份,全部復(fù)制到所有的輔助服務(wù)器上。
在輔助服務(wù)器上,將所有未還原的事物日志備份按照順序還原到輔助數(shù)據(jù)庫(kù)中,完成數(shù)據(jù)同步工作。可以通過(guò)查看還原作業(yè)的歷史信息,來(lái)清晰的了解究竟需要還原哪些日志備份。
接下來(lái)對(duì)輔助數(shù)據(jù)庫(kù)執(zhí)行恢復(fù)操作,使數(shù)據(jù)庫(kù)處于一致的狀態(tài)。執(zhí)行“Restore Database”等T-SQL語(yǔ)句,使其上線并處于聯(lián)機(jī)狀態(tài)。這樣,就完成了故障轉(zhuǎn)移操作。
日志傳送其實(shí)只是同步數(shù)據(jù)庫(kù)的內(nèi)容,并不會(huì)同步Logging登錄信息,這些信息保存在Master數(shù)據(jù)庫(kù)中,之后必須通過(guò)手動(dòng)操作,將登錄賬號(hào)從原始的服務(wù)器實(shí)例遷移到輔助服務(wù)器上,使其變成新的主服務(wù)器實(shí)例。
在該主服務(wù)器實(shí)例上要保證登錄名和密碼以及登錄名對(duì)應(yīng)的SID與和原始數(shù)據(jù)庫(kù)一致,修改應(yīng)用程序的連接字符串,使之重定向到新的主服務(wù)器上。
日志傳送是利用SQL Server Agent來(lái)執(zhí)行備份還原作業(yè),從而達(dá)到主副數(shù)據(jù)庫(kù)同步的目的。
因?yàn)樽鳂I(yè)是每隔一段時(shí)間才被SQL Server Agent觸發(fā),所以主副數(shù)據(jù)庫(kù)的同步并非實(shí)時(shí)進(jìn)行,其最大數(shù)據(jù)損失量?jī)H僅是由備份作業(yè)運(yùn)行的時(shí)間間隔決定的。
因此,盡可能的減小備份作業(yè)的間隔時(shí)間,可以將數(shù)據(jù)損失盡可能的減低。注意,SQL Server允許的最小間隔時(shí)間為10秒。當(dāng)然,過(guò)小的備份間隔也會(huì)給主服務(wù)器造成額外的負(fù)擔(dān)。
當(dāng)然,日志傳送操作起來(lái)有些繁瑣,并不適用于高可用環(huán)境,只能作為廉價(jià)的災(zāi)備方案使用。為主數(shù)據(jù)庫(kù)提供一個(gè)或者多個(gè)副本作為保證。例如,可以在群集環(huán)境中使用日志傳送功能,來(lái)提高其應(yīng)對(duì)故障的能力。
注意,對(duì)于啟用了日志傳送任務(wù)的數(shù)據(jù)庫(kù)來(lái)說(shuō),不能在維護(hù)計(jì)劃中創(chuàng)建事務(wù)日志備份,但是可以創(chuàng)建完整的數(shù)據(jù)庫(kù)備份和差異備份,而無(wú)需擔(dān)心和日志傳送產(chǎn)生沖突。因?yàn)槿魏蔚氖謩?dòng)的日志備份,都會(huì)破壞日志傳送的工作。如果找不到手工備份的日志文件,就會(huì)導(dǎo)致日志傳送鏈條的中斷,只能重建整個(gè)日志傳送鏈條。
這里舉例來(lái)說(shuō)明日志傳送功能的實(shí)現(xiàn)方法。例如,SQLnode1為 主 服 務(wù)器,SQLnode2為輔助服務(wù)器。在SQLnode1中針對(duì)名為“chanpin”的數(shù)據(jù)庫(kù)進(jìn)行日志傳送配置操作,將該數(shù)據(jù)庫(kù)設(shè)置為完全恢復(fù)模式,方法是在Microsoft SQL Server Management Studio窗口中打開(kāi)該數(shù)據(jù)庫(kù)屬性窗口,在左側(cè)點(diǎn)擊“選項(xiàng)”項(xiàng),在右側(cè)的“恢復(fù)模式”列表中選擇“完整”項(xiàng)。
并 執(zhí) 行“BACKUP DATABASE [chanpin]TO DISK = N′D:akchanpin.bak′ WITH NOFORMAT,NOINIT,NAME = N′CHANPIN-完 整 數(shù) 據(jù) 庫(kù) 備 份′,SKIP, NOREWIND,NOUNLOAD, STATS= 10′”,“Go”之類(lèi)的語(yǔ)句,對(duì)其執(zhí)行一次全備份。事先需要在SQLnode1服務(wù)器上建議一個(gè)共享文件夾,路徑為“D:ak”,用來(lái)存儲(chǔ)日志備份文件。必須讓SQL Server Service賬戶擁有對(duì)該目錄的完全控制權(quán)限,讓輔助服務(wù)器上的SQL Server Agent代理賬戶有權(quán)讀取該文件夾內(nèi)容。
在“CHANPIN”數(shù) 據(jù)庫(kù)的右鍵菜單上點(diǎn)擊“任務(wù)”-“傳送事物日志”項(xiàng),在彈出窗口(如圖1)中選擇“將此數(shù)據(jù)庫(kù)啟用為日志傳送配置中的主數(shù)據(jù)庫(kù)”項(xiàng),點(diǎn)擊“備份設(shè)置”按鈕,在事務(wù)日志備份設(shè)置窗口中的“備份文件夾的網(wǎng)絡(luò)路徑”欄中輸入共享路徑。
例 如“\sqlnode1ak”。也可以在其下編輯欄中輸入其本地路徑。又例如“D:ak”,這要求備份文件夾存儲(chǔ)在主服務(wù)器上??梢愿鶕?jù)需要,調(diào)整備份文件保留時(shí)間和報(bào)警時(shí)間。
在默認(rèn)情況下,備份文件經(jīng)過(guò)72小時(shí)會(huì)被自動(dòng)刪除,如果在一個(gè)小時(shí)的間隔內(nèi)沒(méi)有觸發(fā)備份作業(yè),將會(huì)觸發(fā)報(bào)警動(dòng)作。為了控制備份文件的體積,可以在“設(shè)置備份壓縮”列表中選擇“壓縮備份”項(xiàng),在“作業(yè)名稱”欄中可以更改其名稱,點(diǎn)擊“計(jì)劃”按鈕,在計(jì)劃屬性窗口(如圖2)中的“執(zhí)行間隔”欄中可以設(shè)置備份的頻率。默認(rèn)為每隔15分鐘執(zhí)行一次備份。
圖1 傳輸日志配置界面
圖2 設(shè)置計(jì)劃屬性參數(shù)
點(diǎn)擊確定按鈕保存配置,在上級(jí)窗口中的“輔助數(shù)據(jù)庫(kù)”欄中點(diǎn)擊“添加”按鈕,在輔助數(shù)據(jù)庫(kù)設(shè)置窗口中點(diǎn)擊“連接”按鈕,在連接到服務(wù)器窗口中的“服務(wù)器名稱”列表中選擇“SQLnode2”。
選擇合適的身份驗(yàn)證方式,點(diǎn)擊“連接”按鈕,來(lái)添加輔助服務(wù)器實(shí)例,日志傳送機(jī)制可以不依賴于AD域環(huán)境,只要服務(wù)器之間可以正常通訊即可。
在“輔助數(shù)據(jù)庫(kù)”欄中輸入“CHANPIN”。因?yàn)槭孪纫呀?jīng)執(zhí)行了主數(shù)據(jù)庫(kù)的完整備份操作,所以在“初始化輔助數(shù)據(jù)庫(kù)”面板中選擇“是,將主數(shù)據(jù)庫(kù)的現(xiàn)有備份還原到輔助數(shù)據(jù)庫(kù)中”項(xiàng),在“備份文件”欄中輸入備份文件路徑,例如“\sqlnode1akchanpin.bak”。在“復(fù)制文件”面板中的“復(fù)制文件的目標(biāo)文件夾”欄中輸入合適的網(wǎng)絡(luò)路徑。
例如“d:ak”,注意該文件夾位于SQLnode2服務(wù)器上。您可以根據(jù)需要,設(shè)置復(fù)制作業(yè)的名稱以及刪除復(fù)制文件的周期(默認(rèn)為72小時(shí))。這樣,當(dāng)觸發(fā)復(fù)制作業(yè)后,就可以將SQLnode1上的共享目錄中的備份文件復(fù)制到該文件夾中。
點(diǎn)擊“計(jì)劃”按鈕,在彈出窗口中的“執(zhí)行間隔”欄中可以更改復(fù)制作業(yè)的時(shí)間間隔,默認(rèn)為15分鐘。在“還原事物日志”面板中選擇“備份模式”和“在還原備份時(shí)斷開(kāi)數(shù)據(jù)庫(kù)中的用戶連接”項(xiàng),可以保證還原動(dòng)作順利進(jìn)行。
點(diǎn)擊“計(jì)劃”按鈕,可以修改還原作業(yè)的執(zhí)行間隔。其余設(shè)置保持默認(rèn),點(diǎn)擊確定按鈕,保存配置信息,這樣,就創(chuàng)建了備份,復(fù)制和還原作業(yè)。在數(shù)據(jù)庫(kù)屬性窗口中選擇“使用監(jiān)視服務(wù)器實(shí)例”項(xiàng),可以配置監(jiān)視服務(wù)器。在保存日志傳送設(shè)置窗口中點(diǎn)擊按鈕“報(bào)告”→“查看報(bào)告”項(xiàng),顯示配置成功的信息。在SQLnode2上打開(kāi)Microsoft SQL Server Management Studio窗口,在數(shù)據(jù)庫(kù)節(jié)點(diǎn)上執(zhí)行刷新操作,可以看到“chanpin(備用/只讀)”的數(shù)據(jù)庫(kù)名稱,說(shuō)明日志傳送已經(jīng)配置完畢。
在SQLnode1和SQLnode2上 選 擇“SQL Server代理”項(xiàng),在其右鍵菜單上點(diǎn)擊“啟動(dòng)”項(xiàng),啟動(dòng)SQLServer代理服務(wù)。在 SQLnode1上 點(diǎn) 擊“SQl Server代理”→“作業(yè)”項(xiàng),可以看到創(chuàng)建的備份作業(yè)項(xiàng)目。在SQLnode2上點(diǎn)擊“SQl Server代 理”→“作業(yè)”項(xiàng),可以看到創(chuàng)建的復(fù)制和還原作業(yè)項(xiàng)目。這樣,當(dāng)達(dá)到預(yù)設(shè)的時(shí)間間隔后,SQLnode1上的代理服務(wù)就會(huì)觸發(fā)備份作業(yè),在上述共享目錄中可以看到生成的日志備份文件。
在SQLnode2上同樣可以在預(yù)設(shè)的時(shí)間內(nèi)執(zhí)行復(fù)制和還原作業(yè),在對(duì)應(yīng)的目錄中可以看到復(fù)制過(guò)來(lái)的日志備份文件。在SQLnode2上的“數(shù)據(jù)庫(kù)實(shí)例名稱”節(jié)點(diǎn)的右鍵菜單上點(diǎn)擊“報(bào)表”→“標(biāo)準(zhǔn)報(bào)表”→“事物日志傳送狀態(tài)”項(xiàng),可以查看相關(guān)的報(bào)表,來(lái)了解日志傳送的具體信息。