服務(wù)器和應(yīng)用系統(tǒng)遷移方案
2020-02-14 14:52 作者:艾銻無(wú)限 瀏覽量:
迎戰(zhàn)疫情,艾銻無(wú)限用愛(ài)與您同行
為中國(guó)中小企業(yè)提供免費(fèi)IT外包服務(wù)

這次的肺炎疫情對(duì)中國(guó)的中小企業(yè)將會(huì)是沉重的打擊,據(jù)釘釘和微信兩個(gè)辦公平臺(tái)數(shù)據(jù)統(tǒng)計(jì)現(xiàn)有2億左右的人在家遠(yuǎn)程辦公,那么對(duì)于中小企業(yè)的員工來(lái)說(shuō)不懂IT技術(shù)將會(huì)讓他們面臨的最大挑戰(zhàn)和困難。
電腦不亮了怎么辦?系統(tǒng)藍(lán)屏如何處理?辦公室的電腦在家如何連接?網(wǎng)絡(luò)應(yīng)該如何設(shè)置?VPN如何搭建?數(shù)據(jù)如何對(duì)接?服務(wù)器如何登錄?數(shù)據(jù)安全如何保證?數(shù)據(jù)如何存儲(chǔ)?視頻會(huì)議如何搭建?業(yè)務(wù)系統(tǒng)如何開(kāi)啟等等一系列的問(wèn)題,都會(huì)困擾著并非技術(shù)出身的您。
好消息是當(dāng)您看到這篇文章的時(shí)候,就不用再為上述的問(wèn)題而苦惱,您只需撥打艾銻無(wú)限的全國(guó)免費(fèi)熱線電話:400 650 7820,就會(huì)有我們的遠(yuǎn)程工程師為您解決遇到的問(wèn)題,他們可以遠(yuǎn)程幫您處理遇到的一些IT技術(shù)難題。
如遇到免費(fèi)熱線占線,您還可以撥打我們的24小時(shí)值班經(jīng)理電話:15601064618或技術(shù)經(jīng)理的電話:13041036957,我們會(huì)在第一時(shí)間接聽(tīng)您的來(lái)電,為您提供適合的解決方案,讓您無(wú)論在家還是在企業(yè)都能無(wú)憂辦公。
那艾銻無(wú)限具體能為您的企業(yè)提供哪些服務(wù)呢?

艾銻無(wú)限始創(chuàng)于2005年,歷經(jīng)15年服務(wù)了5000多家中小企業(yè)并保障了幾十萬(wàn)臺(tái)設(shè)備的正常運(yùn)轉(zhuǎn),積累了豐富的企業(yè)IT緊急問(wèn)題和特殊故障的解決經(jīng)驗(yàn),制定了相對(duì)應(yīng)的解決方案。我們?yōu)槟钠髽I(yè)提供的IT服務(wù)分為三大版塊:
第一版塊是保障性IT外包服務(wù):如電腦設(shè)備運(yùn)維,辦公設(shè)備運(yùn)維,網(wǎng)絡(luò)設(shè)備運(yùn)維,服務(wù)器運(yùn)維等綜合性企業(yè)IT設(shè)備運(yùn)維服務(wù)。
第二版塊是功能性互聯(lián)網(wǎng)外包服務(wù):如網(wǎng)站開(kāi)發(fā)外包,小程序開(kāi)發(fā)外包,APP開(kāi)發(fā)外包,電商平臺(tái)開(kāi)發(fā)外包,業(yè)務(wù)系統(tǒng)的開(kāi)發(fā)外包和后期的運(yùn)維外包服務(wù)。
第三版塊是增值性云服務(wù)外包:如企業(yè)郵箱上云,企業(yè)網(wǎng)站上云,企業(yè)存儲(chǔ)上云,企業(yè)APP小程序上云,企業(yè)業(yè)務(wù)系統(tǒng)上云,阿里云產(chǎn)品等后續(xù)的云運(yùn)維外包服務(wù)。
您要了解更多服務(wù)也可以登錄艾銻無(wú)限的官網(wǎng):www.bjitwx.com查看詳細(xì)說(shuō)明,在疫情期間,您企業(yè)遇到的任何困境只要找到艾銻無(wú)限,能免費(fèi)為您提供服務(wù)的我們絕不收一分錢(qián),我們?nèi)w艾銻人承諾此活動(dòng)直到中國(guó)疫情結(jié)束,我們將這次活動(dòng)稱為——春雷行動(dòng)。

以下還有我們?yōu)槟峁┑囊恍┘夹g(shù)資訊,以便可以幫助您更好的了解相關(guān)的IT知識(shí),幫您渡過(guò)疫情中辦公遇到的困難和挑戰(zhàn),艾銻無(wú)限愿和中國(guó)中小企業(yè)一起共進(jìn)退,因?yàn)槲覀兿嘈湃f(wàn)物同體,能量合一,只要我們一起齊心協(xié)力,一定會(huì)成功。再一次祝福您和您的企業(yè),戰(zhàn)勝疫情,您和您的企業(yè)一定行。
服務(wù)器和應(yīng)用系統(tǒng)遷移方案
一、遷移方案總體思路
新舊系統(tǒng)的遷移是一個(gè)整體系統(tǒng)工程。遷移必須保證用戶系統(tǒng)建設(shè)的相關(guān)要求,在遷移過(guò)程中,我們需要重點(diǎn)考慮幾個(gè)問(wèn)題:
1、數(shù)據(jù)遷移如何保障“業(yè)務(wù)中斷停機(jī)時(shí)間”。業(yè)務(wù)中斷對(duì)用用戶無(wú)論是生產(chǎn)環(huán)境還是測(cè)試環(huán)境均存在較大的恢復(fù)風(fēng)險(xiǎn),這樣的風(fēng)險(xiǎn)特別是對(duì)于時(shí)間敏感型數(shù)據(jù)還是對(duì)于數(shù)據(jù)完整性業(yè)務(wù)都是不可以接受的。我們基于這樣的要求,考慮到如何將停機(jī)時(shí)間最小,能否實(shí)現(xiàn)0停機(jī)的建設(shè)目標(biāo)?
i. 對(duì)于服務(wù)器操作系統(tǒng)而言,我們可以采用P2V的方式,利用操作系統(tǒng)的Volume Shadow Copy卷影副本復(fù)制服務(wù)作為基礎(chǔ),來(lái)實(shí)現(xiàn)在舊系統(tǒng)環(huán)境下的系統(tǒng)無(wú)修改,無(wú)停機(jī)的情況下,將數(shù)據(jù)和應(yīng)用軟件、操作系統(tǒng)環(huán)境、系統(tǒng)環(huán)境變量等全部以“快照”形式遷移到新服務(wù)器中。由此實(shí)現(xiàn)服務(wù)器環(huán)境的整體遷移。
ii. 對(duì)于應(yīng)用IIS和其他應(yīng)用服務(wù)器來(lái)說(shuō),我們可以基于應(yīng)用服務(wù)器的動(dòng)態(tài)業(yè)務(wù)擴(kuò)展集群方式,來(lái)實(shí)現(xiàn)服務(wù)器不停機(jī)環(huán)境下的增加業(yè)務(wù)節(jié)點(diǎn)操作,這樣可以實(shí)現(xiàn)應(yīng)用服務(wù)器“熱添加”到新環(huán)境中的故障轉(zhuǎn)移/負(fù)載均衡集群系統(tǒng)中,在部分應(yīng)用服務(wù)中我們可以使用session會(huì)話復(fù)制來(lái)實(shí)現(xiàn)舊系統(tǒng)的全局環(huán)境變量和會(huì)話請(qǐng)求狀態(tài)也遷移到新環(huán)境中來(lái)??紤]到會(huì)話復(fù)制和狀態(tài)的快速實(shí)時(shí),我們可以采用會(huì)話內(nèi)存復(fù)制,考慮到會(huì)話復(fù)制和狀態(tài)的安全性,我們可以采用會(huì)話數(shù)據(jù)庫(kù)復(fù)制管理。
iii. 對(duì)于數(shù)據(jù)庫(kù)而言,我們可以基于數(shù)據(jù)庫(kù)本身自帶的數(shù)據(jù)庫(kù)鏡像技術(shù)、數(shù)據(jù)庫(kù)日志傳遞技術(shù)來(lái)實(shí)現(xiàn)各自的分庫(kù)、遷移庫(kù)的構(gòu)建,數(shù)據(jù)庫(kù)鏡像技術(shù)可以讓我們不但保證數(shù)據(jù)庫(kù)遷移的不停機(jī),而且還可以保證萬(wàn)一遷移中出現(xiàn)停機(jī)故障也不影響源數(shù)據(jù)庫(kù),而日志傳遞技術(shù)構(gòu)建的遷移可以保證系統(tǒng)數(shù)據(jù)庫(kù)遷移以異步方式進(jìn)行,這樣可以讓我們的系統(tǒng)環(huán)境在網(wǎng)絡(luò)出現(xiàn)故障的情況依然可以進(jìn)行遷移任務(wù)窗口的正常工作。
2、遷移涉及到的除了應(yīng)用、實(shí)例、數(shù)據(jù)庫(kù)的操作以外,還涉及到遷移前規(guī)劃、遷移后測(cè)試的完整性測(cè)試。這些測(cè)試包括但不限于數(shù)據(jù)一致性測(cè)試、數(shù)據(jù)完整性測(cè)試、應(yīng)用會(huì)話狀態(tài)完整性測(cè)試、連接中斷測(cè)試、
數(shù)據(jù)恢復(fù)測(cè)試。只有這樣才能保證遷移的安全性和有效性。
二、服務(wù)器硬件環(huán)境遷移方案
1. 遷移評(píng)估
遷移前,對(duì)遷移方案進(jìn)行評(píng)估以確保遷移成功。首先需要勘察現(xiàn)有系統(tǒng)的架構(gòu)和資源使用狀況,評(píng)估過(guò)程必須包含以下信息和內(nèi)容:
現(xiàn)有系統(tǒng)支撐的服務(wù)數(shù)量以及在服務(wù)器中的分布情況
現(xiàn)有物理服務(wù)器資源占用狀況,包括CPU、內(nèi)存、磁盤(pán)和網(wǎng)絡(luò)連接狀況,為保證遷移成功,目標(biāo)虛擬機(jī)規(guī)格應(yīng)不低于原物理機(jī)標(biāo)準(zhǔn)
當(dāng)前的物理環(huán)境是否支持虛擬化,是否支持資源擴(kuò)展,因?yàn)樵谶w移之前須在物理服務(wù)器上完成虛擬化
對(duì)當(dāng)前的存儲(chǔ)容量和資源利用率進(jìn)行評(píng)估,需在目標(biāo)系統(tǒng)中規(guī)劃好遷移需要的存儲(chǔ)空間。需明確現(xiàn)有存儲(chǔ)如何利用,比如有些服務(wù)器是在本地磁盤(pán)上創(chuàng)建系統(tǒng)盤(pán)和用戶盤(pán),有些服務(wù)器則在本地磁盤(pán)上創(chuàng)建系統(tǒng)盤(pán)而在SAN/NAS上創(chuàng)建用戶盤(pán)。
2. 遷移計(jì)劃
通過(guò)對(duì)現(xiàn)有網(wǎng)絡(luò)環(huán)境的評(píng)估,我們對(duì)現(xiàn)有資源利用率,服務(wù)以及系統(tǒng)需求非常清晰。評(píng)估后才能開(kāi)始對(duì)遷移進(jìn)行計(jì)劃,步驟如下:
一、確定遷移步驟,包括所有服務(wù)器的遷移先后順序,其順序按風(fēng)險(xiǎn)的高低降序排列。
二、確定備份方案,由于現(xiàn)有系統(tǒng)會(huì)被加固,某些服務(wù)器通過(guò)虛擬化重復(fù)利用,而在虛擬化前需要清除所有的數(shù)據(jù),因此需要對(duì)這些服務(wù)器進(jìn)行備份保證服務(wù)的連續(xù)性。
三、確定并準(zhǔn)備好遷移所需的工具,包括工具在遷移中必備的一系列功能和使用工具所需具備的網(wǎng)絡(luò)環(huán)境。
四、在實(shí)際遷移開(kāi)始之前確定額外的測(cè)試環(huán)境,該測(cè)試環(huán)境能夠引導(dǎo)測(cè)試從而確保遷移成功。因此,測(cè)試環(huán)境需明確設(shè)計(jì)的服務(wù)器和存儲(chǔ)數(shù)量。
五、規(guī)劃網(wǎng)絡(luò)環(huán)境,由于網(wǎng)絡(luò)中的服務(wù)器各處不同位置,因此在遷移中需考慮到網(wǎng)絡(luò)連接情況、數(shù)據(jù)備份方式,以及網(wǎng)絡(luò)流量來(lái)源,確定網(wǎng)絡(luò)流量是否會(huì)引發(fā)網(wǎng)絡(luò)擁塞
六、確定遷移周期以及參與人員,包括遷移起止時(shí)間,團(tuán)隊(duì)能力建設(shè)以及團(tuán)隊(duì)成員的角色。
3. 測(cè)試計(jì)劃
遷移計(jì)劃后,執(zhí)行小批量的測(cè)試遷移方案,這里會(huì)涉及到首批遷移的測(cè)試和審核,步驟如下:
準(zhǔn)備用于測(cè)試遷移的測(cè)試系統(tǒng)環(huán)境,在測(cè)試時(shí),第一批服務(wù)器將會(huì)遷移到該系統(tǒng)環(huán)境中。
安裝并核實(shí)遷移工具,此時(shí)要執(zhí)行第一批服務(wù)器的P2V遷移。
對(duì)第一批服務(wù)器,需分析存儲(chǔ)系統(tǒng),不管該服務(wù)器在存儲(chǔ)遷移中采用本地磁盤(pán)存儲(chǔ)還是遠(yuǎn)端SAN/NAS存儲(chǔ)系統(tǒng)。
4. 遷移測(cè)試
在第一批服務(wù)器和服務(wù)的小批量測(cè)試遷移后,需對(duì)遷移后的服務(wù)器進(jìn)行測(cè)試,包括單元測(cè)試和性能測(cè)試。
5. 遷移實(shí)施
在遷移實(shí)施過(guò)程中,所有的服務(wù)器都會(huì)被遷移到虛擬化系統(tǒng)下。執(zhí)行步驟如下:
確保批量遷移的整個(gè)網(wǎng)絡(luò)環(huán)境已準(zhǔn)備完畢,并通過(guò)遷移工具完成源系統(tǒng)和目標(biāo)系統(tǒng)之間的連通。此處的目標(biāo)系統(tǒng)屬于中轉(zhuǎn)系統(tǒng)。
對(duì)遷移系統(tǒng)進(jìn)行性能審核和健康檢查,如果系統(tǒng)狀態(tài)監(jiān)視則停用舊系統(tǒng)并將其服務(wù)暫時(shí)轉(zhuǎn)移到新的虛擬化系統(tǒng)中。
進(jìn)行利舊,對(duì)于一部分可用的舊硬件可在服務(wù)器虛擬化中重新再利用,一些軟件資源需擴(kuò)展,如內(nèi)存和硬盤(pán)。這些服務(wù)器構(gòu)成最終的虛擬化基礎(chǔ)設(shè)施,即最終系統(tǒng)。
最后,在目標(biāo)系統(tǒng)和最終系統(tǒng)之間進(jìn)行V2V遷移。這樣,最終系統(tǒng)完成了現(xiàn)存硬件的重復(fù)利用。
a. 服務(wù)器虛擬化前進(jìn)行備份
為了對(duì)舊系統(tǒng)中的物理服務(wù)器進(jìn)行虛擬化,需考慮服務(wù)器虛擬化帶來(lái)的影響。例如,現(xiàn)有服務(wù)器的重復(fù)利用,服務(wù)器虛擬化時(shí)會(huì)對(duì)這些服務(wù)器的CPU,內(nèi)存以及硬盤(pán)資源進(jìn)行再利用,然而這些服務(wù)器上存在某些服務(wù)仍在運(yùn)行,若無(wú)備份則會(huì)影響現(xiàn)有業(yè)務(wù)。因此,在執(zhí)行遷移和虛擬化之前,必須先對(duì)需利舊的服務(wù)器進(jìn)行備份。
遷移步驟如下圖所示。
提供物理備份服務(wù)器,并已進(jìn)行虛擬化,數(shù)據(jù)和服務(wù)器已備份到虛擬化系統(tǒng)。
首先,對(duì)于要被遷移的服務(wù)器上,一般會(huì)存在多種服務(wù)正在運(yùn)行,而且這些服務(wù)器在遷移評(píng)估后認(rèn)為在虛擬化場(chǎng)景下可再利用的。但是,遷移過(guò)程中不允許存在較長(zhǎng)的停機(jī)時(shí)間,因此需要準(zhǔn)備一臺(tái)采用虛擬化平臺(tái)的備份虛擬機(jī),通過(guò)P2V將該服務(wù)器備份到虛擬機(jī)上。
備份完所有需要進(jìn)行虛擬化的服務(wù)器之后,這些服務(wù)器上安裝虛擬化軟件進(jìn)行虛擬化,根據(jù)評(píng)估階段確定的容量規(guī)劃,在虛擬化平臺(tái)上創(chuàng)建相應(yīng)規(guī)格的虛擬機(jī),其計(jì)算資源用于承接舊系統(tǒng)中的服務(wù)。
準(zhǔn)備好所有的虛擬機(jī)后,規(guī)劃和安裝相關(guān)遷移工具,將備份系統(tǒng)中的服務(wù)遷移到虛擬化系統(tǒng)的虛擬機(jī)中。虛擬機(jī)遷移是指將備份的虛擬化系統(tǒng)中的應(yīng)用服務(wù)遷移到最終的虛擬化系統(tǒng)中。
虛擬機(jī)遷移完畢后,要對(duì)這些服務(wù)進(jìn)行測(cè)試,最后停用舊系統(tǒng),所有服務(wù)切換到虛擬化系統(tǒng)中。
b. 遷移的詳細(xì)操作步驟
遷移的具體步驟及描述如下圖所示:
A. 在評(píng)估階段,虛擬化和遷移之前需收集的信息如下:
性能統(tǒng)計(jì):包括CPU使用率,內(nèi)存使用率,硬盤(pán)IOPS和硬盤(pán)使用情況;
物理服務(wù)器配置:包括CPU規(guī)格,內(nèi)存容量,硬盤(pán)容量
統(tǒng)計(jì)物理服務(wù)器部署位置,分析是否支持虛擬化,累計(jì)支持虛擬化的服務(wù)器數(shù)量,并規(guī)劃出虛擬化中需新增的硬件情況;
通過(guò)上述無(wú)代理收集和代理收集兩種場(chǎng)景收集當(dāng)前系統(tǒng)的使用和配置情況。可采用華為信息收集工具或者第三方工具。
B. 分析現(xiàn)有服務(wù)的依賴條件,對(duì)當(dāng)前系統(tǒng)進(jìn)行備份。
上圖描述了一種應(yīng)用系統(tǒng)下的依賴關(guān)系,可作為遷移參考,確定所有服務(wù)器的遷移優(yōu)先級(jí)順序。
在確定各服務(wù)的依賴條件后,對(duì)需進(jìn)行虛擬化的服務(wù)器進(jìn)行備份。具體備份過(guò)程參見(jiàn)本小節(jié)遷移實(shí)施方案中 “服務(wù)器虛擬化前進(jìn)行備份”部分的內(nèi)容。
C. 容量規(guī)劃和虛擬化執(zhí)行
根據(jù)當(dāng)前的資源使用和需求情況,計(jì)算虛擬化所需的容量。
D. 規(guī)劃應(yīng)用服務(wù)
在華為虛擬化解決方案中,同類虛擬機(jī)部署在同一個(gè)計(jì)算資源池中,在同一個(gè)池中可相互共享存儲(chǔ)/計(jì)算資源,一個(gè)集群的故障不會(huì)影響其他資源池。
E. 虛擬化規(guī)劃和虛擬機(jī)分配
建立虛擬化平臺(tái)后,要準(zhǔn)備最終的遷移資源。遷移前,如果服務(wù)器a具備雙核CPU和2G內(nèi)存,那么在虛擬化平臺(tái)中就創(chuàng)建一個(gè)2核/2G內(nèi)存的虛擬機(jī),并分配相應(yīng)的硬盤(pán)。
F. 規(guī)劃遷移工具
采用遷移工具從物理或虛擬的服務(wù)器向最終的虛擬化系統(tǒng)中進(jìn)行磁盤(pán)復(fù)制。
G. 通過(guò)工具執(zhí)行在線遷移
準(zhǔn)備好源系統(tǒng),目標(biāo)虛擬機(jī)以及目標(biāo)系統(tǒng)后,決定遷移時(shí)需使用的遷移工具和遷移策略。
H. 遷移測(cè)試
遷移后,需進(jìn)行測(cè)試來(lái)驗(yàn)證遷移是否成功,測(cè)試場(chǎng)景如下:
應(yīng)用服務(wù)遷移后對(duì)虛擬化基本功能的監(jiān)測(cè);
遷移前后應(yīng)用服務(wù)的特性功能是否幾乎相同;
虛擬化系統(tǒng)的性能監(jiān)控;
….
I. 停用舊系統(tǒng)
截至目前現(xiàn)有的服務(wù)器已經(jīng)被虛擬化和重復(fù)使用,其他一些不支持虛擬化的服務(wù)器上對(duì)應(yīng)的服務(wù)也已經(jīng)遷移到虛擬化平臺(tái),那么現(xiàn)在可將應(yīng)用服務(wù)切換到虛擬系統(tǒng)并停用舊系統(tǒng),其步驟如下:
三、應(yīng)用系統(tǒng)數(shù)據(jù)庫(kù)遷移方案
1. 應(yīng)用服務(wù)器遷移到群集環(huán)境
為滿足企業(yè)不斷的成長(zhǎng)需求,實(shí)現(xiàn)企業(yè)服務(wù)器的高可伸縮性、高可用、高可靠性和高性能,提升服務(wù)器的SLA,Microsoft到目前為止,提出了五種解決方案:
我們對(duì)于IIS等應(yīng)用環(huán)境以及.net應(yīng)用程序框架我們提出構(gòu)建IIS環(huán)境的NLB群集,將當(dāng)前系統(tǒng)不停機(jī)加入到NLB群集中,使之成為群集中的一個(gè)節(jié)點(diǎn),而新環(huán)境則為另外一個(gè)節(jié)點(diǎn)。實(shí)施完成后再退出此遷移群集,將新環(huán)境加入到新的構(gòu)建的NLB群集。
微軟的網(wǎng)絡(luò)負(fù)載平衡可以提供最多32臺(tái)主機(jī)的負(fù)載平衡,當(dāng)我們的Web站點(diǎn)需要分擔(dān)更多用戶訪問(wèn)請(qǐng)求的時(shí)候,負(fù)載均衡無(wú)疑是值得考慮的一個(gè)解決方案。當(dāng)然NLB也有相應(yīng)的限制,像廣域網(wǎng)環(huán)境中,我們就不能使用NLB進(jìn)行設(shè)置,因?yàn)槠渚W(wǎng)絡(luò)不允許使用同一個(gè)MAC地址,也就違反了NLB的基本要求。 在安全方面,除了我們進(jìn)行的端口規(guī)則設(shè)定,Windows 2003 Server本身基于TCP/IP 堆棧的集成是動(dòng)態(tài)的,不用進(jìn)行任何人工干預(yù),這種設(shè)置有效的防止了DOS攻擊等惡意攻擊。除此之外,企業(yè)結(jié)合自身的網(wǎng)絡(luò)安全,確保NLB站點(diǎn)的高效運(yùn)作。
NLB不但能實(shí)現(xiàn)均衡負(fù)載,而且還能實(shí)現(xiàn)多種形式的冗余。NLB主要用于那些文件改動(dòng)不大,并且不常駐內(nèi)存的環(huán)境,比如WEB服務(wù)、FTP服務(wù)、和VPN服務(wù)等。NLB不適合用于數(shù)據(jù)庫(kù)、郵件等服務(wù),因?yàn)椴荒鼙WC每個(gè)節(jié)點(diǎn)的數(shù)據(jù)是一樣的。
當(dāng)用戶訪問(wèn)集群的時(shí)候,集群能將訪問(wèn)請(qǐng)求分?jǐn)偟郊褐械拿總€(gè)服務(wù)器上,以達(dá)到均衡負(fù)載的效果。這些服務(wù)器被稱為集群節(jié)點(diǎn)。在負(fù)載平衡中,每個(gè)節(jié)點(diǎn)的文件一般都要求是一樣的。這樣每個(gè)節(jié)點(diǎn)返回給客戶的結(jié)果都是一致的。一般來(lái)說(shuō)組建一個(gè)NLB要求至少兩個(gè)節(jié)點(diǎn),其中一個(gè)節(jié)點(diǎn)不能使用,這全部負(fù)載將落入到剩下的那個(gè)節(jié)點(diǎn)上,即全載。Windows server 2003 最多支持32個(gè)節(jié)點(diǎn)。節(jié)點(diǎn)越多,可用性,可靠性就越高。
NLB能提供三種冗余功能,軟件冗余、硬件冗余、站點(diǎn)冗余。
基于NLB集群的Web網(wǎng)站
數(shù)據(jù)庫(kù)設(shè)計(jì)
1.MSCS,提供后端服務(wù)與應(yīng)用程序的容錯(cuò)移轉(zhuǎn),可提升系統(tǒng)的可用性。常見(jiàn)的應(yīng)用有SQL Server與Exchange Server等。
MSCS是由客戶端來(lái)決定由誰(shuí)來(lái)處理服務(wù)請(qǐng)求,所有服務(wù)器共享一個(gè)共享存儲(chǔ)器來(lái)儲(chǔ)存會(huì)話狀態(tài)。當(dāng)主動(dòng)服務(wù)器掛了,則繼續(xù)由被動(dòng)服務(wù)器接手。被動(dòng)服務(wù)器會(huì)從共享存儲(chǔ)器取出會(huì)話狀態(tài),繼續(xù)未完成的工作,以達(dá)到容錯(cuò)移轉(zhuǎn)的目的。
2.數(shù)據(jù)庫(kù)是數(shù)據(jù)管理最有效的手段,要使用它來(lái)高效地管理和存取各種數(shù)據(jù)資源,必須設(shè)計(jì)出結(jié)構(gòu)合理、功能完善的數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí)一項(xiàng)復(fù)雜的工作,它是一項(xiàng)涉及多學(xué)科的綜合技術(shù),要求數(shù)據(jù)庫(kù)管理員既要懂得數(shù)據(jù)庫(kù)知識(shí),又要充分了解應(yīng)用領(lǐng)域的專業(yè)知識(shí)。
在進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),要根據(jù)企業(yè)組織中各類用戶的信息要求和處理需求來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行設(shè)計(jì)。數(shù)據(jù)庫(kù)設(shè)計(jì)的主要內(nèi)容包過(guò)機(jī)構(gòu)性設(shè)計(jì)和行為特性設(shè)計(jì),設(shè)計(jì)的過(guò)程主要包括需求分析、概念設(shè)計(jì)、邏輯設(shè)計(jì)和物理設(shè)計(jì)四個(gè)階段。
(1)需求分析
需求分析就是對(duì)現(xiàn)實(shí)世界要處理的對(duì)象進(jìn)行詳細(xì)調(diào)查,在了解原系統(tǒng)的概況、確定新系統(tǒng)功能的過(guò)程中,獲得用戶對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)要求、功能要求、安全要求和完整性要求。
(2)概念設(shè)計(jì)
概念設(shè)計(jì)時(shí)將需求說(shuō)明中關(guān)于數(shù)據(jù)的要求,綜合為一個(gè)統(tǒng)一的概念模型。概念模型是表達(dá)概念模型設(shè)計(jì)結(jié)果的工具,是設(shè)計(jì)人員對(duì)系統(tǒng)的抽象的概括,它能表達(dá)用戶的需求,且獨(dú)立于支持?jǐn)?shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)的管理系統(tǒng)和硬件系統(tǒng)。
(3)邏輯設(shè)計(jì)
概念設(shè)計(jì)的結(jié)果是得到一個(gè)與數(shù)據(jù)庫(kù)的管理系統(tǒng)無(wú)關(guān)的概念模型,而邏輯設(shè)計(jì)的目的是吧概念設(shè)計(jì)的概念模型,轉(zhuǎn)換成與選用的具體機(jī)器上的DBMS所支持的數(shù)據(jù)模型相符合的邏輯結(jié)構(gòu)。
(4)物理設(shè)計(jì)
物理設(shè)計(jì)的任務(wù)是確實(shí)數(shù)據(jù)庫(kù)的存儲(chǔ)結(jié)構(gòu),主要包括確定數(shù)據(jù)庫(kù)文件和索引文件的記錄格式和物理結(jié)構(gòu),懸著存取方法,決定訪問(wèn)路徑和外存儲(chǔ)器的分配策略,實(shí)現(xiàn)完整性和安全性以及程序設(shè)計(jì)等。
對(duì)于一個(gè)比較大的網(wǎng)站來(lái)說(shuō),數(shù)據(jù)庫(kù)集群也應(yīng)該是以集群的方式建立,這樣可以增強(qiáng)網(wǎng)站的性能,提高網(wǎng)站的可靠性。數(shù)據(jù)庫(kù)可分為三類:故障切換集群、分布式數(shù)據(jù)庫(kù)系統(tǒng)、共享磁盤(pán)系統(tǒng)。
NLB集群系統(tǒng)的總體設(shè)計(jì)
(1)環(huán)境下實(shí)現(xiàn)Windows 2003服務(wù)器集群;
(2)在域內(nèi)環(huán)境內(nèi)的windows2003 web server群集;
(3)利用IIS搭建了一個(gè)WEB站點(diǎn),域名為dzx.com。由于業(yè)務(wù)的逐漸增加,網(wǎng)站速度也越來(lái)越慢,而且經(jīng)常出現(xiàn)故障,為公司的利益帶來(lái)了很多的不便;公司決定使用兩臺(tái)WEB站點(diǎn)為客戶機(jī)提供訪問(wèn)。因此采用了網(wǎng)絡(luò)負(fù)載均衡技術(shù)。
NLB集群工作原理及算法
1.NLB的工作原理
當(dāng)客戶向NLB群集(NLB的虛擬IP地址)發(fā)起請(qǐng)求時(shí),其實(shí)客戶的請(qǐng)求數(shù)據(jù)包是發(fā)送到所有的NLB節(jié)點(diǎn),然后運(yùn)行在NLB節(jié)點(diǎn)上的NLB服務(wù)根據(jù)同樣的NLB算法來(lái)確定是否應(yīng)該由自己進(jìn)行處理,如果不是則丟棄客戶的請(qǐng)求數(shù)據(jù)包,如果是則進(jìn)行處理。 如何將請(qǐng)求數(shù)據(jù)包發(fā)送到所有的NLB節(jié)點(diǎn)是NLB運(yùn)行的關(guān)鍵之處,單播和多播這兩種操作模式就是用于實(shí)現(xiàn)這一需求。NLB不支持單個(gè)NLB群集中的單播/多播的混合環(huán)境;在每一個(gè)NLB群集中,該群集中的所有節(jié)點(diǎn)都必須配置為多播或單播,否則,此NLB群集將無(wú)法正常工作。
2.負(fù)載平衡算法
一個(gè)負(fù)載平衡算法都包含以下三個(gè)組成部分:
策略:制定任務(wù)放置策略的制定者使用的負(fù)載和任務(wù)量,以及分配的方式。 傳送策略:基于任務(wù)和計(jì)算機(jī)負(fù)載,判定是否要把一個(gè)任務(wù)傳送到其它計(jì)算機(jī)上處理。 放置策略:對(duì)于適合傳送到其它計(jì)算機(jī)處理的任務(wù),選擇任務(wù)將被傳送的目的計(jì)算機(jī)。
負(fù)載平衡的上述三個(gè)部分之間是以不同的方式相互作用的。放置策略利用策略提供的負(fù)載,僅當(dāng)任務(wù)被傳送策略判定為適于傳送之后才行動(dòng)。
總之,負(fù)載平衡的目標(biāo)是:提供最短的平均任務(wù)響應(yīng)時(shí)間;能適于變化的負(fù)載;是可靠的負(fù)載平衡機(jī)制。
(1)策略
人們用來(lái)描述負(fù)載采用的參數(shù)有:
運(yùn)行隊(duì)列中的任務(wù)數(shù)、系統(tǒng)調(diào)用的速率、CPU上下文切換率、空閑CPU時(shí)間百分比、空閑存儲(chǔ)器的大?。↘字節(jié))、1分鐘內(nèi)的平均負(fù)載。
對(duì)于這些單個(gè)的負(fù)載描述參數(shù),第(1)個(gè),即采用運(yùn)行隊(duì)列中的任務(wù)數(shù)作為描述負(fù)載的參數(shù)被證實(shí)是最有效的,即它的平均任務(wù)響應(yīng)時(shí)間最短,并且已經(jīng)得到廣泛應(yīng)用。但是,假如為了使系統(tǒng)更全面而采集了更多的參數(shù),則往往由于增加了額外開(kāi)銷,卻得不到所希望的性能改善。例如,采用將六個(gè)參數(shù)中的某兩個(gè)進(jìn)行"AND"或"OR"組合,得到的平均響應(yīng)時(shí)間反而比單個(gè)參數(shù)的平均響應(yīng)時(shí)間還要差一些。
(2)傳送策略
為了簡(jiǎn)單起見(jiàn),在選用傳送策略時(shí),多選用閥值策略。例如,Eager等人的方法是:在判定是否要在本地處理一個(gè)任務(wù)時(shí),無(wú)需交換計(jì)算機(jī)之間的狀態(tài),一旦服務(wù)隊(duì)列或等待服務(wù)隊(duì)列的長(zhǎng)度大于閥值時(shí),就傳送這個(gè)任務(wù),而且傳送的是剛剛接收的任務(wù)。而進(jìn)程遷移能夠遷移正在執(zhí)行的任務(wù),是對(duì)這種只能傳送剛剛接收的任務(wù)的一種改進(jìn)。
在模擬研究七個(gè)負(fù)載平衡算法時(shí),其傳送策略都采用閥值策略。它的閥值策略基于兩個(gè)閥值∶計(jì)算機(jī)的負(fù)載閥值Load和任務(wù)執(zhí)行時(shí)間閥值TCPU。假如計(jì)算機(jī)的負(fù)載超過(guò)Load并且任務(wù)的執(zhí)行時(shí)間超過(guò)TCPU時(shí),就把此任務(wù)傳送到其它計(jì)算機(jī)執(zhí)行。
(3)放置策略
經(jīng)過(guò)總結(jié),共有以下四種放置策略
①集中策略。每隔P秒,其中一個(gè)計(jì)算機(jī)被指定為"負(fù)載中心"(LIC),接受所有其它負(fù)載的變更值,并把它們匯集到一個(gè)"負(fù)載向量"中,然后把負(fù)載向量廣播給所有其它的計(jì)算機(jī)。當(dāng)一臺(tái)計(jì)算機(jī)認(rèn)為一個(gè)任務(wù)適于傳送到其它計(jì)算機(jī)上執(zhí)行時(shí),它就給LIC發(fā)送一個(gè)請(qǐng)求,并告知當(dāng)前負(fù)載的值。LIC選一臺(tái)具有最短運(yùn)行隊(duì)列長(zhǎng)度的計(jì)算機(jī),并且通知任務(wù)所在的計(jì)算機(jī)把任務(wù)發(fā)送給它,同時(shí),它把目的主機(jī)負(fù)載值增加1。
②閥值策略。隨機(jī)選擇一臺(tái)計(jì)算機(jī),判定若把任務(wù)傳送到那臺(tái)計(jì)算機(jī)后,那臺(tái)計(jì)算機(jī)的任務(wù)隊(duì)列長(zhǎng)度是否會(huì)超過(guò)閥值。假如不超過(guò)閥值,就傳送此任務(wù);否則,隨機(jī)選擇另一臺(tái)計(jì)算機(jī),并以同樣方式判定,繼續(xù)這樣做直到找到一臺(tái)合適的目的計(jì)算機(jī),或探測(cè)次數(shù)超過(guò)一個(gè)靜態(tài)值限制LP,當(dāng)任務(wù)真正到達(dá)計(jì)算機(jī)以后,不管狀態(tài)如何,必須處理該任務(wù)。
③最短任務(wù)隊(duì)列策略。隨機(jī)選擇LP臺(tái)不同的計(jì)算機(jī),察看每臺(tái)計(jì)算機(jī)的任務(wù)隊(duì)列長(zhǎng)度,任務(wù)被傳送到具有最短任務(wù)隊(duì)列長(zhǎng)度的計(jì)算機(jī)。當(dāng)任務(wù)真正到達(dá)計(jì)算機(jī),無(wú)論狀態(tài)如何,目的計(jì)算機(jī)必須處理該任務(wù)。對(duì)此策略的一個(gè)簡(jiǎn)單改進(jìn)時(shí),無(wú)論何時(shí),碰到一臺(tái)隊(duì)列長(zhǎng)度為0的計(jì)算機(jī)時(shí),不再繼續(xù)探測(cè),因?yàn)榭梢源_定此計(jì)算機(jī)是一臺(tái)可以接受的目的計(jì)算機(jī)。
④保留策略。當(dāng)一個(gè)任務(wù)從一臺(tái)計(jì)算機(jī)離開(kāi)時(shí),該計(jì)算機(jī)檢查本地負(fù)載,假如負(fù)載小于閥值T1,就探測(cè)其它計(jì)算機(jī),并在R個(gè)負(fù)載大于T1的計(jì)算機(jī)中登記該計(jì)算機(jī)的名字,并把登記的內(nèi)容保留到一個(gè)棧中。當(dāng)一個(gè)任務(wù)到達(dá)一臺(tái)超載的計(jì)算機(jī)時(shí),就把這個(gè)任務(wù)傳送到此臺(tái)計(jì)算機(jī)棧頂?shù)挠?jì)算機(jī)上。假如一個(gè)計(jì)算機(jī)的負(fù)載低于T1,就清空棧里保留的所有計(jì)算機(jī)名。
從論文中,比較了②和③兩種策略,結(jié)論是:以簡(jiǎn)單(計(jì)算不昂貴)的方式,利用少量狀態(tài),第②中方法往往獲得比第③種方法更好的效果。第③中方法比較復(fù)雜,它必須用性能的改善來(lái)補(bǔ)償額外花費(fèi),所以取得的效果會(huì)稍差一些。
4.3 地址分配
在NLB群集中,每臺(tái)服務(wù)器都會(huì)有一個(gè)屬于自己的靜態(tài)IP地址,同時(shí)NLB群集中的所有服務(wù)器還有一個(gè)共同的IP地址—NLB群集地址;
當(dāng)客戶向NLB群集(NLB的虛擬IP地址)發(fā)起請(qǐng)求時(shí),其實(shí)客戶的請(qǐng)求數(shù)據(jù)包是發(fā)送到所有的NLB節(jié)點(diǎn),即:NLB算法需要NLB群集中的所有主機(jī)都能看到發(fā)往群集的每一個(gè)數(shù)據(jù)包。然后運(yùn)行在NLB節(jié)點(diǎn)上的NLB服務(wù)根據(jù)同樣的NLB算法來(lái)確定是否應(yīng)該由自己進(jìn)行處理,如果不是則丟棄客戶的請(qǐng)求數(shù)據(jù)包,如果是則進(jìn)行處理。
網(wǎng)絡(luò)負(fù)載平衡使得單個(gè)子網(wǎng)上的所有群集主機(jī)可以同時(shí)檢測(cè)群集 IP 地址的傳入網(wǎng)絡(luò)通信。在每個(gè)群集主機(jī)上,網(wǎng)絡(luò)負(fù)載平衡驅(qū)動(dòng)程序充當(dāng)群集適配器驅(qū)動(dòng)程序和 TCP/IP 堆棧間的過(guò)濾器,以便在主機(jī)間分配通信。
在配置負(fù)載均衡的時(shí)候步驟主要有三個(gè)
(1)啟用網(wǎng)絡(luò)負(fù)載平衡;
(2)連接到現(xiàn)存的群集;
(3)添加主機(jī)到群集。
1.啟用網(wǎng)絡(luò)負(fù)載平衡:在開(kāi)始——運(yùn)行中輸入nlbmgr,單擊“確定”按鈕,打開(kāi)“網(wǎng)絡(luò)負(fù)載平衡管理器”窗口。如圖所示
網(wǎng)絡(luò)負(fù)載均衡管理器
2.右擊“網(wǎng)絡(luò)負(fù)載均衡群集”,然后單擊“新建群集”命令,然后在彈出如圖5-2的對(duì)話框中的IP地址和其他群集信息,選擇群集操作模式為“多播”,然后單擊“下一步”按鈕。在這里添加的IP地址是和DC所在在同一個(gè)網(wǎng)段的,在這里使用一個(gè)多播的原因是在客戶端是同時(shí)能收到信息。
3.在“群集IP地址”的對(duì)話框中可以添加IP地址,如果有多個(gè)群集的IP地址也可以來(lái)添加多個(gè)IP地址,如圖5-3是添加的端口的IP地址,在本次實(shí)驗(yàn)中只有一個(gè)網(wǎng)絡(luò)群集的IP地址所以在下面選擇自動(dòng)添加而不是選擇所有的端口,而在解析的時(shí)候是通過(guò)DNS服務(wù)器解析而沒(méi)有使用其他的協(xié)議因此所采用TCP協(xié)議的端口HTTP80;所以在這里選擇80即可。
4.在完成上面群集IP地址的規(guī)劃之后,會(huì)出現(xiàn)如圖5-4所示的端口規(guī)則:端口規(guī)則是可以按照群集中每一個(gè)成員的負(fù)載量來(lái)分派客戶端的通信。當(dāng)然在下面如圖所示的界面中也可以來(lái)刪除端口規(guī)則。刪除端口規(guī)則也可以更加明顯的看出群集的效果,刪除端口規(guī)則可以按照端口的優(yōu)先級(jí)來(lái)響應(yīng)客戶機(jī)請(qǐng)求,假設(shè)當(dāng)優(yōu)先級(jí)高的出現(xiàn)故障那么優(yōu)先級(jí)低的主機(jī)會(huì)提供服務(wù)。當(dāng)然對(duì)于客戶機(jī)來(lái)說(shuō)是感覺(jué)不到那個(gè)到底出現(xiàn)故障。
5.完成上面的步驟在“連接”的對(duì)話框中來(lái)輸入和服務(wù)器相連的IP地址;及192.168.120.1,點(diǎn)擊“連接”就會(huì)彈出如圖5-5所示的對(duì)話框。然后在下面的接口中選擇服務(wù)器的網(wǎng)絡(luò)適配器(IP地址)。
6.完成上面的步驟基本在DC上的配置就完成了,在這里所采用系統(tǒng)默認(rèn)的自動(dòng)狀態(tài),單擊完成即可。但是要明白在配置優(yōu)先級(jí)的時(shí)候最多可以配置32位,因?yàn)镹LB網(wǎng)絡(luò)負(fù)載均衡做多支持32臺(tái)主機(jī)。默認(rèn)情況下他的初始狀態(tài)是“已啟動(dòng)”,設(shè)置更高的優(yōu)先級(jí)的原因是當(dāng)把“端口規(guī)則”刪除的并且當(dāng)其中的一臺(tái)的出現(xiàn)故障的時(shí)候,優(yōu)先級(jí)就會(huì)在這時(shí)候起到作用。如圖5-6所示,把第一臺(tái)主機(jī)的優(yōu)先級(jí)設(shè)為1。
7.啟動(dòng)網(wǎng)絡(luò)負(fù)載平衡后,在下圖中5-7所示:在群集cluster.domain.com中已經(jīng)有了一臺(tái)主機(jī)。根據(jù)實(shí)驗(yàn)的需求還需要添加一臺(tái)主機(jī)到群集:如果在第二臺(tái)上添加的時(shí)候首先會(huì)連接到“現(xiàn)存的群集”。
8.把第二臺(tái)主機(jī)連接到現(xiàn)存的群集,在這里連接時(shí)候是在第二個(gè)服務(wù)器上面添加。在第二臺(tái)服務(wù)器上(IP地址為192.168.20.2)的開(kāi)始——運(yùn)行中輸入“nlbmgr”,單擊確定單開(kāi)“網(wǎng)絡(luò)負(fù)載均衡管理器”窗口,右擊“網(wǎng)絡(luò)負(fù)載均衡平衡群集”,然后“選擇連接到現(xiàn)存的”命令。在彈出的的對(duì)話框中輸入第一臺(tái)計(jì)算機(jī)的IP地址“192.168.120.2”單擊“連接”然后完成就可了!
9. 添加主機(jī)到群集;在使用“網(wǎng)絡(luò)負(fù)載平衡管理器“,右擊“cluster.domain.com”。在彈出的對(duì)話框中選擇“添加主機(jī)到群集”,添加主機(jī)的真正原因就是達(dá)到網(wǎng)絡(luò)負(fù)載平衡的原因,如圖5-9所示:
10.在完成上面的配置后,在下面圖的界面中添加將要成為群集成員的IP地址(或者主機(jī)的名稱)單擊連接按鈕,將在底部的對(duì)話框中會(huì)彈出可以用的網(wǎng)絡(luò)適配器。選擇要用網(wǎng)絡(luò)負(fù)載平衡的網(wǎng)絡(luò)適配器,即可完成。
11.在保持主機(jī)參數(shù)為默認(rèn)狀態(tài),注意優(yōu)先級(jí)是“2”它是默認(rèn)的:一切按照默認(rèn)的即可。
12.添加主機(jī)到群集后,在群集cluster.domain.com中會(huì)有兩臺(tái)服務(wù)器,最多可以有32臺(tái)主機(jī)。在圖5-12中可以知道兩臺(tái)主機(jī)的IP地址是192.168.20.1和192.168.20.2;這樣就完成了網(wǎng)絡(luò)負(fù)載均衡的配置了。
網(wǎng)絡(luò)負(fù)載均衡的最佳操作
1.正確保護(hù)網(wǎng)絡(luò)負(fù)載平衡主機(jī)和經(jīng)過(guò)負(fù)載平衡的應(yīng)用程序;
2. 在每一個(gè)群集主機(jī)上至少配置兩個(gè)網(wǎng)絡(luò)適配器,但是并非必要;
3.在群集適配器上只使用TCP/IP協(xié)議;
4.保證群集中的所有主機(jī)屬于同一個(gè)子網(wǎng)并且客戶機(jī)能夠訪問(wèn)該子網(wǎng);
5.使用網(wǎng)絡(luò)負(fù)載均衡管理器配置NLB群集;
6.不要啟用網(wǎng)絡(luò)負(fù)載平衡遠(yuǎn)程訪問(wèn)控制;
7.啟用日志記錄;
8.獨(dú)立使用NLB群集和服務(wù)器群集。
2. 數(shù)據(jù)庫(kù)遷移實(shí)施
一、實(shí)施概述
在做SQL Server數(shù)據(jù)庫(kù)維護(hù)的時(shí)候,當(dāng)上司要求我們把幾十G的數(shù)據(jù)文件搬動(dòng)到其它服務(wù)器,并且要求最小宕機(jī)時(shí)間的時(shí)候,我們有沒(méi)什么方案可以做到這些要求呢?
在這里我們假設(shè)這兩臺(tái)機(jī)器并不是在一個(gè)機(jī)房上,這樣看起來(lái)我們的解決方案才更有意義,如果你那么好運(yùn)這兩臺(tái)機(jī)器在同一個(gè)局域網(wǎng),那么恭喜你,你可以多很多的方案可以做到。
二、分析與設(shè)計(jì)思路
其實(shí)我們假設(shè)的環(huán)境有兩個(gè)特點(diǎn):第一個(gè)是數(shù)據(jù)庫(kù)文件比較大;第二個(gè)就是我們的傳送文件的速度可能會(huì)比較慢。也許這傳送速度我們是沒(méi)有辦法了,但是我們可以就從文件的大小這個(gè)問(wèn)題出發(fā),結(jié)合SQL Server的特性,這樣就有了下面的解決方案了。
為了使宕機(jī)時(shí)間最短,我們這里使用了完整備份和差異備份來(lái)遷移數(shù)據(jù)庫(kù),在白天的時(shí)候?qū)π枰w移的數(shù)據(jù)庫(kù)進(jìn)行一次完整備份(XXX_full.bak),并把備份文件拷貝(這里可以使用FTP軟件進(jìn)行斷點(diǎn)續(xù)傳)到目標(biāo)服務(wù)器進(jìn)行還原,等到下班時(shí)間之后再進(jìn)行一次差異備份(XXX_diff.bak),再把這個(gè)差異備份拷貝到目標(biāo)服務(wù)器,在完整還原的基礎(chǔ)上再進(jìn)行差異還原。
這里的宕機(jī)時(shí)間 = 差異備份時(shí)間 + 傳送差異備份文件時(shí)間 + 還原差異備份文件時(shí)間,這宕機(jī)時(shí)間是不是讓你感覺(jué)這時(shí)間很短呢?
三、參考腳本
注意修改下面腳本中數(shù)據(jù)庫(kù)的名稱,還有絕對(duì)路徑。
--1:完整備份
declare @dbname varchar(100)
declare @sql nvarchar(max)
set @dbname = 'DataBaseName'
set @sql = '
--'+@dbname+'_full
BACKUP DATABASE ['+@dbname+']
TO DISK = ''D:\DBBackup\'+@dbname+'_full.bak''
WITH NOFORMAT, NOINIT, NAME = '''+@dbname+'-完整數(shù)據(jù)庫(kù)備份'',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO'
print @sql
--生成的SQL
--DataBaseName_full
BACKUP DATABASE [DataBaseName]
TO DISK = 'D:\DBBackup\DataBaseName_full.bak'
WITH NOFORMAT, NOINIT, NAME = 'DataBaseName-完整數(shù)據(jù)庫(kù)備份',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
--2:完整備份還原
declare @dbname varchar(100)
declare @sql nvarchar(max)
set @dbname = 'DataBaseName'
set @sql = '
--RESTORE '+@dbname+'_full
RESTORE DATABASE ['+@dbname+']
FROM DISK = ''D:\DBBackup\'+@dbname+'_full.bak'' WITH FILE = 1,
MOVE N''DataBase_Name'' TO N''D:\DataBase\'+@dbname+'.mdf'',
MOVE N''DataBase_Name_log'' TO N''D:\DataBase\'+@dbname+'_log.ldf'',
NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
GO'
print @sql
--生成的SQL
--RESTORE DataBaseName_full
RESTORE DATABASE [DataBaseName]
FROM DISK = 'D:\DBBackup\DataBaseName_full.bak' WITH FILE = 1,
MOVE N'DataBase_Name' TO N'D:\DataBase\DataBaseName.mdf',
MOVE N'DataBase_Name_log' TO N'D:\DataBase\DataBaseName_log.ldf',
NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
GO
--3:差異備份
declare @dbname varchar(100)
declare @sql nvarchar(max)
set @dbname = 'DataBaseName'
set @sql = '
--'+@dbname+'_diff
BACKUP DATABASE ['+@dbname+']
TO DISK = N''D:\DBBackup\'+@dbname+'_diff.bak''
WITH DIFFERENTIAL , NOFORMAT, NOINIT, NAME = N'''+@dbname+'-差異數(shù)據(jù)庫(kù)備份'',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
'
print @sql
--生成的SQL
--DataBaseName_diff
BACKUP DATABASE [DataBaseName]
TO DISK = N'D:\DBBackup\DataBaseName_diff.bak'
WITH DIFFERENTIAL , NOFORMAT, NOINIT, NAME = N'DataBaseName-差異數(shù)據(jù)庫(kù)備份',
SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
--4:差異備份還原
declare @dbname varchar(100)
declare @sql nvarchar(max)
set @dbname = 'DataBaseName'
set @sql = '
--RESTORE '+@dbname+'_full
RESTORE DATABASE ['+@dbname+']
FROM DISK = ''D:\DBBackup\'+@dbname+'_diff.bak'' WITH FILE = 1,
NOUNLOAD, STATS = 10
GO'
print @sql
--生成的SQL
--RESTORE DataBaseName_full
RESTORE DATABASE [DataBaseName]
FROM DISK = 'D:\DBBackup\DataBaseName_diff.bak' WITH FILE = 1,
NOUNLOAD, STATS = 10
GO
四、后記
以測(cè)試的700G的數(shù)據(jù)文件,我是通過(guò)數(shù)據(jù)庫(kù)的作業(yè)進(jìn)行愚公移山的,搬數(shù)據(jù)到新的服務(wù)器上的,這樣的好處就是對(duì)之前的數(shù)據(jù)庫(kù)進(jìn)行優(yōu)化,比如進(jìn)行數(shù)據(jù)庫(kù)參數(shù)的設(shè)置,比如表分區(qū),在對(duì)之前數(shù)據(jù)庫(kù)影響盡量小的情況進(jìn)行數(shù)據(jù)搬遷。
四、遷移重難點(diǎn)分析及措施
1. 如何保證數(shù)據(jù)遷移過(guò)程中的安全性和操作可審計(jì)性?
回答:數(shù)據(jù)遷移中的安全性不可忽略,我們基于多重?cái)?shù)據(jù)審計(jì)功能實(shí)現(xiàn)遷移安全性和操作審計(jì)性。
若要將登錄和密碼從服務(wù)器 A 上的 SQL Server 實(shí)例傳輸?shù)椒?wù)器 B 上的 SQL Server 實(shí)例,請(qǐng)執(zhí)行以下步驟:
1 在服務(wù)器 A 上,啟動(dòng) SQL Server Management Studio,然后連接到要從中移動(dòng)數(shù)據(jù)庫(kù)的 SQL Server 實(shí)例。
2 打開(kāi)新的查詢編輯器窗口,然后運(yùn)行以下腳本。
USE master
GO
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
DROP PROCEDURE sp_hexadecimal
GO
CREATE PROCEDURE sp_hexadecimal
@binvalue varbinary(256),
@hexvalue varchar (514) OUTPUT
AS
DECLARE @charvalue varchar (514)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = '0x'
SELECT @i = 1
SELECT @length = DATALENGTH (@binvalue)
SELECT @hexstring = '0123456789ABCDEF'
WHILE (@i <= @length)
BEGIN
DECLARE @tempint int
DECLARE @firstint int
DECLARE @secondint int
SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
SELECT @firstint = FLOOR(@tempint/16)
SELECT @secondint = @tempint - (@firstint*16)
SELECT @charvalue = @charvalue +
SUBSTRING(@hexstring, @firstint+1, 1) +
SUBSTRING(@hexstring, @secondint+1, 1)
SELECT @i = @i + 1
END
SELECT @hexvalue = @charvalue
GO
IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
DROP PROCEDURE sp_help_revlogin
GO
CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
DECLARE @name sysname
DECLARE @type varchar (1)
DECLARE @hasaccess int
DECLARE @denylogin int
DECLARE @is_disabled int
DECLARE @PWD_varbinary varbinary (256)
DECLARE @PWD_string varchar (514)
DECLARE @SID_varbinary varbinary (85)
DECLARE @SID_string varchar (514)
DECLARE @tmpstr varchar (1024)
DECLARE @is_policy_checked varchar (3)
DECLARE @is_expiration_checked varchar (3)
DECLARE @defaultdb sysname
IF (@login_name IS NULL)
DECLARE login_curs CURSOR FOR
SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
sys.server_principals p LEFT JOIN sys.syslogins l
ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'
ELSE
DECLARE login_curs CURSOR FOR
SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
sys.server_principals p LEFT JOIN sys.syslogins l
ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name
OPEN login_curs
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
IF (@@fetch_status = -1)
BEGIN
PRINT 'No login(s) found.'
CLOSE login_curs
DEALLOCATE login_curs
RETURN -1
END
SET @tmpstr = '/* sp_help_revlogin script '
PRINT @tmpstr
SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
PRINT @tmpstr
PRINT ''
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
PRINT ''
SET @tmpstr = '-- Login: ' + @name
PRINT @tmpstr
IF (@type IN ( 'G', 'U'))
BEGIN -- NT authenticated account/group
SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
END
ELSE BEGIN -- SQL Server authentication
-- obtain password and sid
SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )
EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
-- obtain password policy state
SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'
IF ( @is_policy_checked IS NOT NULL )
BEGIN
SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
END
IF ( @is_expiration_checked IS NOT NULL )
BEGIN
SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked
END
END
IF (@denylogin = 1)
BEGIN -- login is denied access
SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
END
ELSE IF (@hasaccess = 0)
BEGIN -- login exists but does not have access
SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
END
IF (@is_disabled = 1)
BEGIN -- login is disabled
SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
END
PRINT @tmpstr
END
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin
END
CLOSE login_curs
DEALLOCATE login_curs
RETURN 0
GO
3 注意:此腳本會(huì)在“master”數(shù)據(jù)庫(kù)中創(chuàng)建兩個(gè)存儲(chǔ)過(guò)程。兩個(gè)存儲(chǔ)過(guò)程分別命名為“sp_hexadecimal”存儲(chǔ)過(guò)程和“sp_help_revlogin”存儲(chǔ)過(guò)程。
4 運(yùn)行下面的語(yǔ)句。
EXEC sp_help_revlogin
5 由“sp_help_revlogin”存儲(chǔ)過(guò)程生成的輸出腳本是登錄腳本。此登錄腳本創(chuàng)建具有原始安全標(biāo)識(shí)符 (SID) 和原始密碼的登錄。
6 在服務(wù)器 B 上,啟動(dòng) SQL Server Management Studio,然后連接到您將數(shù)據(jù)庫(kù)移動(dòng)到的 SQL Server 實(shí)例。 重要信息:在執(zhí)行步驟 5 之前,請(qǐng)檢查“備注”一節(jié)中的信息。
7 打開(kāi)新的查詢編輯器窗口,然后運(yùn)行步驟 3 中生成的輸出腳本。
如何解決在運(yùn)行 SQL Server 的服務(wù)器之間移動(dòng)數(shù)據(jù)庫(kù)時(shí)的權(quán)限問(wèn)題
· 如果服務(wù)器 A 和服務(wù)器 B 處于同一域中,則使用相同的 SID。因此,用戶不可能是孤立的。
· 在輸出腳本中,通過(guò)使用加密密碼來(lái)創(chuàng)建登錄。這是因?yàn)?CREATE LOGIN 語(yǔ)句中使用了 HASHED 參數(shù)。此參數(shù)指定在 PASSWORD 參數(shù)后輸入的密碼已經(jīng)過(guò)哈希處理。
· 默認(rèn)情況下,只有“sysadmin”固定服務(wù)器角色的成員可以從“sys.server_principals”視圖運(yùn)行 SELECT 語(yǔ)句。除非“sysadmin”固定服務(wù)器角色的成員授予用戶必需的權(quán)限,否則用戶無(wú)法創(chuàng)建或運(yùn)行輸出腳本。
· 本文中的步驟不會(huì)為特定登錄傳輸默認(rèn)數(shù)據(jù)庫(kù)信息。這是因?yàn)槟J(rèn)數(shù)據(jù)庫(kù)不可能總是存在于服務(wù)器 B 上。若要定義某個(gè)登錄的默認(rèn)數(shù)據(jù)庫(kù),請(qǐng)使用 ALTER LOGIN 語(yǔ)句,并傳入登錄名和默認(rèn)數(shù)據(jù)庫(kù)作為參數(shù)。
· 服務(wù)器 A 的排序順序可能不區(qū)分大小寫(xiě),而服務(wù)器 B 的排序順序可能區(qū)分大小寫(xiě)。在此情況下,當(dāng)您將登錄和密碼傳輸?shù)椒?wù)器 B 上的實(shí)例之后,必須以大寫(xiě)字母的形式來(lái)鍵入密碼中的所有字母。 或者,服務(wù)器 A 的排序順序可能區(qū)分大小寫(xiě),而服務(wù)器 B 的排序順序可能不區(qū)分大小寫(xiě)。在此情況下,您將無(wú)法使用傳輸?shù)椒?wù)器 B 上的實(shí)例的登錄和密碼進(jìn)行登錄,除非滿足下面的條件之一:
o 原始密碼不包含字母。
o 原始密碼中的所有字母都是大寫(xiě)字母。
· 服務(wù)器 A 和服務(wù)器 B 的排序順序可能都區(qū)分大小寫(xiě),或者可能都不區(qū)分大小寫(xiě)。在這些情況下,用戶不會(huì)遇到問(wèn)題。
· 已經(jīng)位于服務(wù)器 B 上的實(shí)例中的登錄可能具有與輸出腳本中的某個(gè)名稱相同的名稱。在此情況下,當(dāng)對(duì)服務(wù)器 B 上的實(shí)例運(yùn)行輸出腳本時(shí),會(huì)接收到下面的錯(cuò)誤消息:
消息 15025,級(jí)別 16,狀態(tài) 1,行 1 服務(wù)器主體 'MyLogin' 已存在。
· 類似地,已經(jīng)位于服務(wù)器 B 上的實(shí)例中的登錄可能具有與輸出腳本中的某個(gè) SID 相同的 SID。在此情況下,當(dāng)對(duì)服務(wù)器 B 上的實(shí)例運(yùn)行輸出腳本時(shí),會(huì)接收到下面的錯(cuò)誤消息:
消息 15433,級(jí)別 16,狀態(tài) 1,行 1 所提供的參數(shù) sid 正在使用。
· 因此,必須執(zhí)行以下操作:
7 仔細(xì)檢查輸出腳本。
7 檢查服務(wù)器 B 上的實(shí)例中的“sys.server_principals”視圖的內(nèi)容。
7 相應(yīng)地解決這些錯(cuò)誤消息。
· 在 SQL Server 2005 中,登錄的 SID 用作實(shí)現(xiàn)數(shù)據(jù)庫(kù)級(jí)別訪問(wèn)的基礎(chǔ)。一個(gè)登錄可能在服務(wù)器的兩個(gè)不同數(shù)據(jù)庫(kù)中具有兩個(gè)不同的 SID。在此情況下,該登錄只可以訪問(wèn)具有與“sys.server_principals”視圖中的 SID 匹配的 SID 的數(shù)據(jù)庫(kù)。在從兩個(gè)不同的服務(wù)器合并這兩個(gè)數(shù)據(jù)庫(kù)時(shí),可能會(huì)出現(xiàn)此問(wèn)題。若要解決此問(wèn)題,可使用 DROP USERT 語(yǔ)句,從具有不匹配的 SID 的數(shù)據(jù)庫(kù)中手動(dòng)刪除相應(yīng)的登錄。然后,通過(guò)使用 CREATE USER 語(yǔ)句再次添加該登錄。
2. 如何保證數(shù)據(jù)庫(kù)遷移0停機(jī),實(shí)時(shí)遷移?
回答:我們基于CDC技術(shù) + 數(shù)據(jù)庫(kù)鏡像技術(shù) 來(lái)實(shí)現(xiàn)遷移0停機(jī)。
在常見(jiàn)的企業(yè)數(shù)據(jù)平臺(tái)管理中有一項(xiàng)任務(wù)是一直困擾SQL Server DBA們的,這就是對(duì)數(shù)據(jù)更新的監(jiān)控。很多數(shù)據(jù)應(yīng)用都需要捕獲對(duì)業(yè)務(wù)數(shù)據(jù)表的更新。筆者見(jiàn)過(guò)幾種解決方案:
1、在數(shù)據(jù)表中加入特殊的標(biāo)志列; 2、 通過(guò)在數(shù)據(jù)表上創(chuàng)建觸發(fā)器; 3、通過(guò)第三方產(chǎn)品,例如IBM的Log Explorer。
其實(shí)第1種和第2中方案都不好,因?yàn)榈?種方法需要在應(yīng)用程序編碼的時(shí)候尤為小心,如果有一段數(shù)據(jù)訪問(wèn)邏輯忘了更新標(biāo)志位就會(huì)導(dǎo)致遺漏某些數(shù)據(jù)更新,而第2種方法對(duì)性能影響過(guò)于明顯,因?yàn)橛|發(fā)器的性能開(kāi)銷是眾所周知的。第3種方法其實(shí)屬于一種叫做Log Audit的方案體系。因?yàn)镾QL Server同其他關(guān)系型數(shù)據(jù)庫(kù)一樣,所有數(shù)據(jù)操作都會(huì)在日志中記錄,因此通過(guò)分析日志就可以獲得完整的數(shù)據(jù)操作歷史。SQL Server其實(shí)早就有內(nèi)部的API可供ISV開(kāi)發(fā)者中Log Audit的方案,不過(guò)微軟對(duì)這套API控制比較嚴(yán)格,只有簽署了一堆協(xié)議的核心級(jí)合作伙伴才能了解這套API。
因此,現(xiàn)對(duì)業(yè)務(wù)數(shù)據(jù)更新的跟蹤在SQL Server平臺(tái)上一直是一件非常頭疼的事情,用戶需要在投入大量開(kāi)發(fā)精力和投入額外采購(gòu)成本之間做出選擇。幸運(yùn)的事,微軟終于在SQL Server 2008中提供了一套半公開(kāi)的Log Audit機(jī)制,就是我們所說(shuō)的Change Data Capture,我們后面簡(jiǎn)稱CDC。
◆當(dāng)DML提交到應(yīng)用數(shù)據(jù)庫(kù)時(shí),SQL Server必須寫(xiě)入日志,并在緩存中更新數(shù)據(jù),然后在檢查點(diǎn)將內(nèi)存中的數(shù)據(jù)刷回?cái)?shù)據(jù)文件。 ◆CDC的內(nèi)部進(jìn)程根據(jù)CDC的設(shè)置,在日志文件中提取更新歷史信息,并將這些個(gè)更新信息寫(xiě)入對(duì)應(yīng)的更新跟蹤表。 ◆DBA或開(kāi)發(fā)人員通過(guò)調(diào)用CDC的函數(shù)來(lái)訪問(wèn)更新跟蹤表,提取感興趣的更新歷史信息,并通過(guò)ETL應(yīng)用程序更新數(shù)據(jù)倉(cāng)庫(kù)。 ◆理論上面更新跟蹤表事會(huì)無(wú)限制增長(zhǎng)的,因此CDC內(nèi)部有一個(gè)清理進(jìn)程,在默認(rèn)情況下更新跟蹤信息在寫(xiě)入跟蹤表三天后會(huì)被自動(dòng)清理。
CDC的配置
由于CDC是一項(xiàng)比較高端的功能,因此只有在SQL Server 2008的企業(yè)版、開(kāi)發(fā)版和評(píng)估版中才能找到CDC功能。
啟用數(shù)據(jù)庫(kù)級(jí)別的CDC
要啟用CDC功能,首先需要一個(gè)sysadmin服務(wù)器角色的成員用戶激活數(shù)據(jù)庫(kù)級(jí)別的CDC,這個(gè)過(guò)程可以通過(guò)sys.sp_cdc_enable_db_change_data_capture存儲(chǔ)過(guò)程來(lái)完成。如果想知道一個(gè)數(shù)據(jù)庫(kù)是否啟用了CDC功能,可以通過(guò)查詢sys.databases系統(tǒng)目錄的is_cdc_enabled字段。
當(dāng)一個(gè)數(shù)據(jù)庫(kù)啟用CDC功能后,SQL Server會(huì)自動(dòng)在這個(gè)數(shù)據(jù)庫(kù)中創(chuàng)建cdc架構(gòu)和cdc用戶,所有CDC相關(guān)的數(shù)據(jù)表和用戶函數(shù)都會(huì)存放在cdc架構(gòu)下。
CDC功能啟用后,SQL Server會(huì)首先在cdc架構(gòu)下創(chuàng)建五張表用于記錄一些CDC的原數(shù)據(jù),分別是ddl_history,change_tables,captured_columns,index_columns和lsn_time_mapping。
在數(shù)據(jù)庫(kù)啟用了CDC后,接下來(lái)我們就需要在數(shù)據(jù)表上啟用CDC了。屬于db_owner角色的用戶可以通過(guò)存儲(chǔ)過(guò)程sys.sp_cdc_enable_table_change_data_capture來(lái)啟用對(duì)某張數(shù)據(jù)表的更新跟蹤,一張數(shù)據(jù)表最多可以設(shè)置兩個(gè)跟蹤實(shí)例。每個(gè)跟蹤實(shí)例中可以設(shè)置對(duì)原始數(shù)據(jù)表的所有列或部分列進(jìn)行更新跟蹤。如果想知道數(shù)據(jù)表是否進(jìn)行了更新跟蹤,DBA可以查詢sys.tables系統(tǒng)目錄的is_tracked_by_cdc字段。
對(duì)一張數(shù)據(jù)表啟用CDC跟蹤實(shí)例后,SQL Server會(huì)在cdc架構(gòu)下創(chuàng)建一張數(shù)據(jù)表用于記錄從日志中解析出來(lái)的更新歷史信息。
一段CDC的評(píng)估腳本
為了評(píng)估CDC功能,我特地寫(xiě)了一段腳本如下:
1、首先創(chuàng)建一個(gè)測(cè)試數(shù)據(jù)庫(kù);
2、然后激活TestCDC數(shù)據(jù)庫(kù)上的更新捕獲功能;
USE TestCDC
GO
EXEC sp_cdc_enable_db_change_date_capture;
GO
執(zhí)行了存儲(chǔ)過(guò)程sp_cdc_enable_db_change_data_capture后,就會(huì)在數(shù)據(jù)庫(kù)TestCDC中看到有一些新的表被創(chuàng)建了,分別是ddl_history,change_tables,captured_columns,index_columns和lsn_time_mapping,并且這5張表都是在cdc架構(gòu)下。
3、然后在TestCDC數(shù)據(jù)庫(kù)中創(chuàng)建測(cè)試表
USE TestCDC GO CREATE TABLE dbo.Product
(
ProductID int PRIMARY KEY NOT NULL,
ProductName nvarchar(100),
Category nvarchar(50)
)
GO
4、在dbo.Product表上激活更新跟蹤
EX
EC sp_cdc_enable_table_change_data_capture'dbo',
'Product',
@role_name= NULL,
@supports_net_changes =1;
成功提交上述命令后,就可以在數(shù)據(jù)表change_tables,captured_columns和index_columns表中看到相應(yīng)的記錄,其中change_table中一條,capture_column中三條,index_columns中一條。同時(shí)cdc架構(gòu)下有增加了一張新表叫做dbo_Product_CT,這張表的結(jié)構(gòu)和Product表的結(jié)構(gòu)有點(diǎn)相似,Product表中的三列在dbo_Product_CT中都有,同時(shí)dbo_Product_CT表中還增加了_$start_lsn,_$end_lsn,_$seqval,_$operation和_$update_mask五個(gè)新的字段。-hU:i B%P%B&X 其實(shí)在存儲(chǔ)過(guò)程sp_cdc_enable_table_change_data_capture中有一系列的參數(shù),在這里我們?yōu)榱撕?jiǎn)化忽略了一個(gè)參數(shù)就是@captured_column_list,這個(gè)參數(shù)可以對(duì)表中特定的某些字段啟用更新跟蹤。
5、在Product表上提交INSERT語(yǔ)句
INSERT INTO dbo.Product VALUES (1, N'ABC', N'A');
提交完了這條命令后,就會(huì)在lsn_time_mapping和dbo_Product_CT中分別看到一條新記錄。其中dbo_Product_CT表中的_$operation字段的值是2,_$update_mask字段的值是0x07。 _$operation字段是代表DML操作類型,1是delete,2是insert,3是update的舊值,4是update的新值。 $update_mask字段是表示一個(gè)字段列表的掩碼,那些在DML操作中被更新了的字段位為1,而沒(méi)有更新的字段位為0。在本例中Product表一共有三列被跟蹤,所以應(yīng)該是一個(gè)三位的二進(jìn)制數(shù),右邊低位第一位是第一列ProductID,低位第二位是第二列ProductName,第三位就是Category了。因?yàn)檫@是一次INSERT,所以更新涉及到了所有的三列,所以_$update_mask字段就應(yīng)該是0x7了。
6、 繼續(xù)在Product表上提交UPDATE語(yǔ)句
UPDATE dbo.Product SET Category = N'B' WHERE ProductID = 1;
提交完這條命令后,當(dāng)然也會(huì)在lsn_time_mapping和dbo_Product_CT中看到新記錄了。不過(guò)這次lsn_time_mapping中是一條,而dbo_Product_CT中則是兩條。(為什么會(huì)這樣呢?建議大家自己試一下咯,一試就明白了。)
其中dbo_Product_CT表中的_$operation字段的值是第一條是3,第二條是4,_$update_mask字段的值兩條都是0x04。在這次操作中我們更新的是第三列,所以_$update_mask字段就應(yīng)該是0x4了。(如果我們更新的是ProductID會(huì)發(fā)現(xiàn)_$update_mask并非是0x1,而同樣是0x7,這估計(jì)是因?yàn)镻roductID是主鍵,更新主鍵應(yīng)該視同一條新的記錄。)
7、再來(lái)一次UPDATE
UPDATE dbo.Product SET Category = N'A' WHERE ProductID = 1;
提交完這條命令后,在dbo_Product_CT中又看到兩條新記錄了。其中dbo_Product_CT表中的_$operation字段的值是第一條是3,第二條是4,_$update_mask字段的值兩條都是0x04。(看來(lái)CDC確實(shí)會(huì)記錄下數(shù)據(jù)的每次修改。)
8、繼續(xù)在Product表上提交DML語(yǔ)句
DELETE dbo.Product WHERE ProductID = 1;
提交完了這條命令后,就會(huì)在lsn_time_mapping和dbo_Product_CT中分別看到一條新記錄。
其中dbo_Product_CT表中的_$operation字段的值是1,_$update_mask字段的值是0x07。
9、提交一個(gè)DDL試試看
ALTER TABLE dbo.Product ADD Description nvarchar(100);
提交完這句命令后,只會(huì)在ddl_history表中看到一條新的記錄。
10、然后再試試DML
UPDATE dbo.Product SET Description = N'NA';
提交完這句語(yǔ)句后,所有cdc架構(gòu)下的表中都沒(méi)有看到新記錄。說(shuō)明新增的列Description不跟蹤更新了......估計(jì)有人會(huì)說(shuō)(細(xì)心的人哦!):“這次當(dāng)然看不到新記錄了,因?yàn)樵谇懊娴?步我們已經(jīng)刪除了所有的記錄,因此這次的UPDATE語(yǔ)句沒(méi)有影響到任何記錄,當(dāng)然CDC的表中不會(huì)有任何記錄了。”那么到底對(duì)Description更新會(huì)不會(huì)記錄呢,經(jīng)過(guò)測(cè)試確實(shí)是不記錄的。
那么如果我們想對(duì)Description也進(jìn)行更新跟蹤應(yīng)該怎么辦呢?很簡(jiǎn)單的,由另外一個(gè)存儲(chǔ)過(guò)程叫做sp_cdc_disable_table_change_data_capture可以禁用對(duì)某張表的更新跟蹤,可以使用這個(gè)存儲(chǔ)過(guò)程先對(duì)Product表禁用更新跟蹤,然后再重新啟用對(duì)Product表的更新跟蹤就可以了。
11、最后試一下DROP命令
DROP TABLE dbo.Product;
dbo.Product表消失了,同時(shí)cdc.dbo_Product_CT表也消失了。
12. 評(píng)估結(jié)束。一定有人問(wèn),捕獲到的更新怎么用呢,還有一堆系統(tǒng)函數(shù)和存儲(chǔ)過(guò)程可以幫助用戶,但是那段測(cè)試的過(guò)程就不詳細(xì)寫(xiě)了。
其中最重要的應(yīng)該就是cdc.fn_cdc_get_all_changes_和cdc.fn_cdc_get_net_changes_兩個(gè)函數(shù)了,這兩個(gè)函數(shù)可以幫助我們獲取dbo_Product_CT表中數(shù)據(jù),其中cdc.fn_cdc_get_all_changes_是用于獲取所有更新,而cdc.fn_cdc_get_net_changes_則是用于獲取精簡(jiǎn)后的更新,在精簡(jiǎn)的更新中有一些重復(fù)的更新就會(huì)被合并成一條記錄,比如說(shuō)我們把產(chǎn)品類型由A改為B,然后又改回A,在cdc.fn_cdc_get_all_changes_中應(yīng)該有3條記錄,而在cdc.fn_cdc_get_net_changes_中則只有1條記錄。兩個(gè)函數(shù)的范例如下(你會(huì)發(fā)現(xiàn)精簡(jiǎn)結(jié)果集的函數(shù)運(yùn)算相當(dāng)慢,至少在CTP4中是這樣的,不知道以后的版本會(huì)不回有改進(jìn)):
SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_Product(0x00000048000001760004, 0x00000048000001F70004, 'all');
SELECT * FROM cdc.fn_cdc_get_net_changes_dbo_Product(0x00000048000001760004, 0x00000048000001F70004, 'all');