版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
服務(wù)器和應(yīng)用系統(tǒng)遷移方案(此文檔為word格式,下載后您可任意修改編輯?。┮?、遷移方案總體思路新舊系統(tǒng)的遷移是一個(gè)整體系統(tǒng)工程。遷移必須保證用戶系統(tǒng)建設(shè)的相關(guān)要求,在遷移過程中,我們需要重點(diǎn)考慮幾個(gè)問題:1、數(shù)據(jù)遷移如何保障“業(yè)務(wù)中斷停機(jī)時(shí)間”。業(yè)務(wù)中斷對(duì)于用戶無論是運(yù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)的VolumeShadowCopy卷影副本復(fù)制服務(wù)作為基礎(chǔ),來實(shí)現(xiàn)在舊系統(tǒng)環(huán)境下的系統(tǒng)無修改,無停機(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ù)器來說,我們可以基于應(yīng)用服務(wù)器的動(dòng)態(tài)業(yè)務(wù)擴(kuò)展集群方式,來實(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ù)制來實(shí)現(xiàn)舊系統(tǒng)的全局環(huán)境變量和會(huì)話請(qǐng)求狀態(tài)也遷移到新環(huán)境中來??紤]到會(huì)話復(fù)制和狀態(tài)的快速實(shí)時(shí),我們可以采用會(huì)話內(nèi)存復(fù)制,考慮到會(huì)話復(fù)制和狀態(tài)的安全性,我們可以采用會(huì)話數(shù)據(jù)庫復(fù)制管理。iii.對(duì)于數(shù)據(jù)庫而言,我們可以基于數(shù)據(jù)庫本身自帶的數(shù)據(jù)庫鏡像技術(shù)、數(shù)據(jù)庫日志傳遞技術(shù)來實(shí)現(xiàn)各自的分庫、遷移庫的構(gòu)建,數(shù)據(jù)庫鏡像技術(shù)可以讓我們不但保證數(shù)據(jù)庫遷移的不停機(jī),而且還可以保證萬一遷移中出現(xiàn)停機(jī)故障也不影響源數(shù)據(jù)庫,而日志傳遞技術(shù)構(gòu)建的遷移可以保證系統(tǒng)數(shù)據(jù)庫遷移以異步方式進(jìn)行,這樣可以讓我們的系統(tǒng)環(huán)境在網(wǎng)絡(luò)出現(xiàn)故障的情況依然可以進(jìn)行遷移任務(wù)窗口的正常工作。2、遷移涉及到的除了應(yīng)用、實(shí)例、數(shù)據(jù)庫的操作以外,還涉及到遷移前規(guī)劃、遷移后測(cè)試的完整性測(cè)試。這些測(cè)試包括但不限于數(shù)據(jù)一致性測(cè)試、數(shù)據(jù)完整性測(cè)試、應(yīng)用會(huì)話狀態(tài)完整性測(cè)試、連接中斷測(cè)試、數(shù)據(jù)恢復(fù)測(cè)試。只有這樣才能保證遷移的安全性和有效性。二、服務(wù)器硬件環(huán)境遷移方案.遷移評(píng)估遷移前,對(duì)遷移方案進(jìn)行評(píng)估以確保遷移成功。首先需要勘察現(xiàn)有系統(tǒng)的架構(gòu)和資源使用狀況,評(píng)估過程必須包含以下信息和內(nèi)容:現(xiàn)有系統(tǒng)支撐的服務(wù)數(shù)量以及在服務(wù)器中的分布情況現(xiàn)有物理服務(wù)器資源占用狀況,包括CPU、內(nèi)存、磁盤和網(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ù)器是在本地磁盤上創(chuàng)建系統(tǒng)盤和用戶盤,有些服務(wù)器則在本地磁盤上創(chuàng)建系統(tǒng)盤而在SAN/NAS上創(chuàng)建用戶盤。.遷移計(jì)劃通過對(duì)現(xiàn)有網(wǎng)絡(luò)環(huán)境的評(píng)估,我們對(duì)現(xiàn)有資源利用率,服務(wù)以及系統(tǒng)需求非常清晰。評(píng)估后才能開始對(duì)遷移進(jìn)行計(jì)劃,步驟如下:一、確定遷移步驟,包括所有服務(wù)器的遷移先后順序,其順序按風(fēng)險(xiǎn)的高低降序排列。二、確定備份方案,由于現(xiàn)有系統(tǒng)會(huì)被加固,某些服務(wù)器通過虛擬化重復(fù)利用,而在虛擬化前需要清除所有的數(shù)據(jù),因此需要對(duì)這些服務(wù)器進(jìn)行備份保證服務(wù)的連續(xù)性。三、確定并準(zhǔn)備好遷移所需的工具,包括工具在遷移中必備的一系列功能和使用工具所需具備的網(wǎng)絡(luò)環(huán)境。四、在實(shí)際遷移開始之前確定額外的測(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ò)流量來源,確定網(wǎng)絡(luò)流量是否會(huì)引發(fā)網(wǎng)絡(luò)擁塞六、確定遷移周期以及參與人員,包括遷移起止時(shí)間,團(tuán)隊(duì)能力建設(shè)以及團(tuán)隊(duì)成員的角色。.測(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ǔ)遷移中采用本地磁盤存儲(chǔ)還是遠(yuǎn)端SAN/NAS存儲(chǔ)系統(tǒng)。.遷移測(cè)試在第一批服務(wù)器和服務(wù)的小批量測(cè)試遷移后,需對(duì)遷移后的服務(wù)器進(jìn)行測(cè)試,包括單元測(cè)試和性能測(cè)試。.遷移實(shí)施在遷移實(shí)施過程中,所有的服務(wù)器都會(huì)被遷移到虛擬化系統(tǒng)下。執(zhí)行步驟如下:確保批量遷移的整個(gè)網(wǎng)絡(luò)環(huán)境已準(zhǔn)備完畢,并通過遷移工具完成源系統(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)存和硬盤。這些服務(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ù)器虛擬化帶來的影響。例如,現(xiàn)有服務(wù)器的重復(fù)利用,服務(wù)器虛擬化時(shí)會(huì)對(duì)這些服務(wù)器的CPU,內(nèi)存以及硬盤資源進(jìn)行再利用,然而這些服務(wù)器上存在某些服務(wù)仍在運(yùn)行,若無備份則會(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)景下可再利用的。但是,遷移過程中不允許存在較長的停機(jī)時(shí)間,因此需要準(zhǔn)備一臺(tái)采用虛擬化平臺(tái)的備份虛擬機(jī),通過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)存使用率,硬盤IOPS和硬盤使用情況;物理服務(wù)器配置:包括CPU規(guī)格,內(nèi)存容量,硬盤容量統(tǒng)計(jì)物理服務(wù)器部署位置,分析是否支持虛擬化,累計(jì)支持虛擬化的服務(wù)器數(shù)量,并規(guī)劃出虛擬化中需新增的硬件情況;通過上述無代理收集和代理收集兩種場(chǎng)景收集當(dāng)前系統(tǒng)的使用和配置情況??刹捎萌A為信息收集工具或者第三方工具。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)行備份。具體備份過程參見本小節(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)的硬盤。F.規(guī)劃遷移工具采用遷移工具從物理或虛擬的服務(wù)器向最終的虛擬化系統(tǒng)中進(jìn)行磁盤復(fù)制。G.通過工具執(zhí)行在線遷移準(zhǔn)備好源系統(tǒng),目標(biāo)虛擬機(jī)以及目標(biāo)系統(tǒng)后,決定遷移時(shí)需使用的遷移工具和遷移策略。H.遷移測(cè)試遷移后,需進(jìn)行測(cè)試來驗(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ù)庫遷移方案1.應(yīng)用服務(wù)器遷移到群集環(huán)境為滿足企業(yè)不斷的成長需求,實(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)更多用戶訪問請(qǐng)求的時(shí)候,負(fù)載均衡無疑是值得考慮的一個(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è)定,Windows2003Server本身基于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ù)庫、郵件等服務(wù),因?yàn)椴荒鼙WC每個(gè)節(jié)點(diǎn)的數(shù)據(jù)是一樣的。當(dāng)用戶訪問集群的時(shí)候,集群能將訪問請(qǐng)求分?jǐn)偟郊褐械拿總€(gè)服務(wù)器上,以達(dá)到均衡負(fù)載的效果。這些服務(wù)器被稱為集群節(jié)點(diǎn)。在負(fù)載平衡中,每個(gè)節(jié)點(diǎn)的文件一般都要求是一樣的。這樣每個(gè)節(jié)點(diǎn)返回給客戶的結(jié)果都是一致的。一般來說組建一個(gè)NLB要求至少兩個(gè)節(jié)點(diǎn),其中一個(gè)節(jié)點(diǎn)不能使用,這全部負(fù)載將落入到剩下的那個(gè)節(jié)點(diǎn)上,即全載。Windowsserver2003最多支持32個(gè)節(jié)點(diǎn)。節(jié)點(diǎn)越多,可用性,可靠性就越高。NLB能提供三種冗余功能,軟件冗余、硬件冗余、站點(diǎn)冗余?;贜LB集群的Web網(wǎng)站數(shù)據(jù)庫設(shè)計(jì).MSCS,提供后端服務(wù)與應(yīng)用程序的容錯(cuò)移轉(zhuǎn),可提升系統(tǒng)的可用性。常見的應(yīng)用有SQLServer與ExchangeServer等。MSCS是由客戶端來決定由誰來處理服務(wù)請(qǐng)求,所有服務(wù)器共享一個(gè)共享存儲(chǔ)器來儲(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)的目的。.數(shù)據(jù)庫是數(shù)據(jù)管理最有效的手段,要使用它來高效地管理和存取各種數(shù)據(jù)資源,必須設(shè)計(jì)出結(jié)構(gòu)合理、功能完善的數(shù)據(jù)庫。數(shù)據(jù)庫設(shè)計(jì)時(shí)一項(xiàng)復(fù)雜的工作,它是一項(xiàng)涉及多學(xué)科的綜合技術(shù),要求數(shù)據(jù)庫管理員既要懂得數(shù)據(jù)庫知識(shí),又要充分了解應(yīng)用領(lǐng)域的專業(yè)知識(shí)。在進(jìn)行數(shù)據(jù)庫設(shè)計(jì)時(shí),要根據(jù)企業(yè)組織中各類用戶的信息要求和處理需求來對(duì)數(shù)據(jù)庫進(jìn)行設(shè)計(jì)。數(shù)據(jù)庫設(shè)計(jì)的主要內(nèi)容包過機(jī)構(gòu)性設(shè)計(jì)和行為特性設(shè)計(jì),設(shè)計(jì)的過程主要包括需求分析、概念設(shè)計(jì)、邏輯設(shè)計(jì)和物理設(shè)計(jì)四個(gè)階段。(1)需求分析需求分析就是對(duì)現(xiàn)實(shí)世界要處理的對(duì)象進(jìn)行詳細(xì)調(diào)查,在了解原系統(tǒng)的概況、確定新系統(tǒng)功能的過程中,獲得用戶對(duì)數(shù)據(jù)庫的數(shù)據(jù)要求、功能要求、安全要求和完整性要求。(2)概念設(shè)計(jì)概念設(shè)計(jì)時(shí)將需求說明中關(guān)于數(shù)據(jù)的要求,綜合為一個(gè)統(tǒng)一的概念模型。概念模型是表達(dá)概念模型設(shè)計(jì)結(jié)果的工具,是設(shè)計(jì)人員對(duì)系統(tǒng)的抽象的概括,它能表達(dá)用戶的需求,且獨(dú)立于支持?jǐn)?shù)據(jù)庫的數(shù)據(jù)庫的管理系統(tǒng)和硬件系統(tǒng)。(3)邏輯設(shè)計(jì)概念設(shè)計(jì)的結(jié)果是得到一個(gè)與數(shù)據(jù)庫的管理系統(tǒng)無關(guān)的概念模型,而邏輯設(shè)計(jì)的目的是吧概念設(shè)計(jì)的概念模型,轉(zhuǎn)換成與選用的具體機(jī)器上的DBMS所支持的數(shù)據(jù)模型相符合的邏輯結(jié)構(gòu)。(4)物理設(shè)計(jì)物理設(shè)計(jì)的任務(wù)是確實(shí)數(shù)據(jù)庫的存儲(chǔ)結(jié)構(gòu),主要包括確定數(shù)據(jù)庫文件和索引文件的記錄格式和物理結(jié)構(gòu),懸著存取方法,決定訪問路徑和外存儲(chǔ)器的分配策略,實(shí)現(xiàn)完整性和安全性以及程序設(shè)計(jì)等。對(duì)于一個(gè)比較大的網(wǎng)站來說,數(shù)據(jù)庫集群也應(yīng)該是以集群的方式建立,這樣可以增強(qiáng)網(wǎng)站的性能,提高網(wǎng)站的可靠性。數(shù)據(jù)庫可分為三類:故障切換集群、分布式數(shù)據(jù)庫系統(tǒng)、共享磁盤系統(tǒng)。NLB集群系統(tǒng)的總體設(shè)計(jì)(1)環(huán)境下實(shí)現(xiàn)Windows2003服務(wù)器集群;(2)在域內(nèi)環(huán)境內(nèi)的windows2003webserver群集;(3)利用IIS搭建了一個(gè)WEB站點(diǎn),域名為。由于業(yè)務(wù)的逐漸增加,網(wǎng)站速度也越來越慢,而且經(jīng)常出現(xiàn)故障,為公司的利益帶來了很多的不便;公司決定使用兩臺(tái)WEB站點(diǎn)為客戶機(jī)提供訪問。因此采用了網(wǎng)絡(luò)負(fù)載均衡技術(shù)。NLB集群工作原理及算法.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算法來確定是否應(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群集將無法正常工作。.負(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)策略人們用來描述負(fù)載采用的參數(shù)有:運(yùn)行隊(duì)列中的任務(wù)數(shù)、系統(tǒng)調(diào)用的速率、CPU上下文切換率、空閑CPU時(shí)間百分比、空閑存儲(chǔ)器的大小(K字節(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ù),則往往由于增加了額外開銷,卻得不到所希望的性能改善。例如,采用將六個(gè)參數(shù)中的某兩個(gè)進(jìn)行“AND"或"OR"組合,得到的平均響應(yīng)時(shí)間反而比單個(gè)參數(shù)的平均響應(yīng)時(shí)間還要差一些。(2)傳送策略為了簡單起見,在選用傳送策略時(shí),多選用閥值策略。例如,Eager等人的方法是:在判定是否要在本地處理一個(gè)任務(wù)時(shí),無需交換計(jì)算機(jī)之間的狀態(tài),一旦服務(wù)隊(duì)列或等待服務(wù)隊(duì)列的長度大于閥值時(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ù)載超過Load并且任務(wù)的執(zhí)行時(shí)間超過TCPU時(shí),就把此任務(wù)傳送到其它計(jì)算機(jī)執(zhí)行。(3)放置策略經(jīng)過總結(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ì)列長度的計(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ì)列長度是否會(huì)超過閥值。假如不超過閥值,就傳送此任務(wù);否則,隨機(jī)選擇另一臺(tái)計(jì)算機(jī),并以同樣方式判定,繼續(xù)這樣做直到找到一臺(tái)合適的目的計(jì)算機(jī),或探測(cè)次數(shù)超過一個(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ì)列長度,任務(wù)被傳送到具有最短任務(wù)隊(duì)列長度的計(jì)算機(jī)。當(dāng)任務(wù)真正到達(dá)計(jì)算機(jī),無論狀態(tài)如何,目的計(jì)算機(jī)必須處理該任務(wù)。對(duì)此策略的一個(gè)簡單改進(jìn)時(shí),無論何時(shí),碰到一臺(tái)隊(duì)列長度為0的計(jì)算機(jī)時(shí),不再繼續(xù)探測(cè),因?yàn)榭梢源_定此計(jì)算機(jī)是一臺(tái)可以接受的目的計(jì)算機(jī)。④保留策略。當(dāng)一個(gè)任務(wù)從一臺(tái)計(jì)算機(jī)離開時(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é)論是:以簡單(計(jì)算不昂貴)的方式,利用少量狀態(tài),第②中方法往往獲得比第③種方法更好的效果。第③中方法比較復(fù)雜,它必須用性能的改善來補(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算法來確定是否應(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堆棧間的過濾器,以便在主機(jī)間分配通信。在配置負(fù)載均衡的時(shí)候步驟主要有三個(gè)(1)啟用網(wǎng)絡(luò)負(fù)載平衡;(2)連接到現(xiàn)存的群集;(3)添加主機(jī)到群集。.啟用網(wǎng)絡(luò)負(fù)載平衡:在開始——運(yùn)行中輸入nlbmgr,單擊“確定”按鈕,打開“網(wǎng)絡(luò)負(fù)載平衡管理器”窗口。如圖所示網(wǎng)絡(luò)負(fù)載均衡管理器.右擊“網(wǎng)絡(luò)負(fù)載均衡群集”,然后單擊“新建群集”命令,然后在彈出如圖5-2的對(duì)話框中的IP地址和其他群集信息,選擇群集操作模式為“多播”,然后單擊“下一步”按鈕。在這里添加的IP地址是和DC所在在同一個(gè)網(wǎng)段的,在這里使用一個(gè)多播的原因是在客戶端是同時(shí)能收到信息。.在“群集IP地址”的對(duì)話框中可以添加IP地址,如果有多個(gè)群集的IP地址也可以來添加多個(gè)IP地址,如圖5-3是添加的端口的IP地址,在本次實(shí)驗(yàn)中只有一個(gè)網(wǎng)絡(luò)群集的IP地址所以在下面選擇自動(dòng)添加而不是選擇所有的端口,而在解析的時(shí)候是通過DNS服務(wù)器解析而沒有使用其他的協(xié)議因此所采用TCP協(xié)議的端口HTTP80;所以在這里選擇80即可。.在完成上面群集IP地址的規(guī)劃之后,會(huì)出現(xiàn)如圖5-4所示的端口規(guī)則:端口規(guī)則是可以按照群集中每一個(gè)成員的負(fù)載量來分派客戶端的通信。當(dāng)然在下面如圖所示的界面中也可以來刪除端口規(guī)則。刪除端口規(guī)則也可以更加明顯的看出群集的效果,刪除端口規(guī)則可以按照端口的優(yōu)先級(jí)來響應(yīng)客戶機(jī)請(qǐng)求,假設(shè)當(dāng)優(yōu)先級(jí)高的出現(xiàn)故障那么優(yōu)先級(jí)低的主機(jī)會(huì)提供服務(wù)。當(dāng)然對(duì)于客戶機(jī)來說是感覺不到那個(gè)到底出現(xiàn)故障。.完成上面的步驟在“連接”的對(duì)話框中來輸入和服務(wù)器相連的IP地址;及,點(diǎn)擊“連接”就會(huì)彈出如圖5-5所示的對(duì)話框。然后在下面的接口中選擇服務(wù)器的網(wǎng)絡(luò)適配器(IP地址)。.完成上面的步驟基本在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。.啟動(dòng)網(wǎng)絡(luò)負(fù)載平衡后,在下圖中5-7所示:在群集中已經(jīng)有了一臺(tái)主機(jī)。根據(jù)實(shí)驗(yàn)的需求還需要添加一臺(tái)主機(jī)到群集:如果在第二臺(tái)上添加的時(shí)候首先會(huì)連接到“現(xiàn)存的群集”。.把第二臺(tái)主機(jī)連接到現(xiàn)存的群集,在這里連接時(shí)候是在第二個(gè)服務(wù)器上面添加。在第二臺(tái)服務(wù)器上(IP地址為)的開始——運(yùn)行中輸入“nlbmgr”,單擊確定單開“網(wǎng)絡(luò)負(fù)載均衡管理器”窗口,右擊“網(wǎng)絡(luò)負(fù)載均衡平衡群集”,然后“選擇連接到現(xiàn)存的”命令。在彈出的的對(duì)話框中輸入第一臺(tái)計(jì)算機(jī)的IP地址“”單擊“連接”然后完成就可了!.添加主機(jī)到群集;在使用“網(wǎng)絡(luò)負(fù)載平衡管理器",右擊"”。在彈出的對(duì)話框中選擇“添加主機(jī)到群集”,添加主機(jī)的真正原因就是達(dá)到網(wǎng)絡(luò)負(fù)載平衡的原因,如圖5-9所示:.在完成上面的配置后,在下面圖的界面中添加將要成為群集成員的IP地址(或者主機(jī)的名稱)單擊連接按鈕,將在底部的對(duì)話框中會(huì)彈出可以用的網(wǎng)絡(luò)適配器。選擇要用網(wǎng)絡(luò)負(fù)載平衡的網(wǎng)絡(luò)適配器,即可完成。.在保持主機(jī)參數(shù)為默認(rèn)狀態(tài),注意優(yōu)先級(jí)是“2”它是默認(rèn)的:一切按照默認(rèn)的即可。.添加主機(jī)到群集后,在群集中會(huì)有兩臺(tái)服務(wù)器,最多可以有32臺(tái)主機(jī)。在圖5-12中可以知道兩臺(tái)主機(jī)的IP地址是和;這樣就完成了網(wǎng)絡(luò)負(fù)載均衡的配置了。網(wǎng)絡(luò)負(fù)載均衡的最佳操作.正確保護(hù)網(wǎng)絡(luò)負(fù)載平衡主機(jī)和經(jīng)過負(fù)載平衡的應(yīng)用程序;.在每一個(gè)群集主機(jī)上至少配置兩個(gè)網(wǎng)絡(luò)適配器,但是并非必要;.在群集適配器上只使用TCP/IP協(xié)議;.保證群集中的所有主機(jī)屬于同一個(gè)子網(wǎng)并且客戶機(jī)能夠訪問該子網(wǎng);.使用網(wǎng)絡(luò)負(fù)載均衡管理器配置NLB群集;.不要啟用網(wǎng)絡(luò)負(fù)載平衡遠(yuǎn)程訪問控制;.啟用日志記錄;.獨(dú)立使用NLB群集和服務(wù)器群集。2.數(shù)據(jù)庫遷移實(shí)施一、實(shí)施概述在做SQLServer數(shù)據(jù)庫維護(hù)的時(shí)候,當(dāng)上司要求我們把幾十G的數(shù)據(jù)文件搬動(dòng)到其它服務(wù)器,并且要求最小宕機(jī)時(shí)間的時(shí)候,我們有沒什么方案可以做到這些要求呢?在這里我們假設(shè)這兩臺(tái)機(jī)器并不是在一個(gè)機(jī)房上,這樣看起來我們的解決方案才更有意義,如果你那么好運(yùn)這兩臺(tái)機(jī)器在同一個(gè)局域網(wǎng),那么恭喜你,你可以多很多的方案可以做到。二、分析與設(shè)計(jì)思路其實(shí)我們假設(shè)的環(huán)境有兩個(gè)特點(diǎn):第一個(gè)是數(shù)據(jù)庫文件比較大;第二個(gè)就是我們的傳送文件的速度可能會(huì)比較慢。也許這傳送速度我們是沒有辦法了,但是我們可以就從文件的大小這個(gè)問題出發(fā),結(jié)合SQLServer的特性,這樣就有了下面的解決方案了。為了使宕機(jī)時(shí)間最短,我們這里使用了完整備份和差異備份來遷移數(shù)據(jù)庫,在白天的時(shí)候?qū)π枰w移的數(shù)據(jù)庫進(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í)間是不是讓你感覺這時(shí)間很短呢?三、參考腳本注意修改下面腳本中數(shù)據(jù)庫的名稱,還有絕對(duì)路徑。--1:完整備份declare@dbnamevarchar(100)declare@sqlnvarchar(max)set@dbname='DataBaseName'set@sql='--'+@dbname+'_fullBACKUPDATABASE['+@dbname+']TODISK="D:\DBBackup\'+@dbname+'Jull.bak”WITHNOFORMAT,NOINIT,NAME="'+@dbname+'-完整數(shù)據(jù)庫備份”,SKIP,NOREWIND,NOUNLOAD,STATS=10GO'print@sql―生成的SQL--DataBaseName_fullBACKUPDATABASE[DataBaseName]TODISK='D:\DBBackup\DataBaseName_full.bak'WITHNOFORMAT,NOINIT,NAME='DataBaseName-完整數(shù)據(jù)庫備份',SKIP,NOREWIND,NOUNLOAD,STATS=10GO--2:完整備份還原declare@dbnamevarchar(100)declare@sqlnvarchar(max)set@dbname='DataBaseName'set@sql='--RESTORE'+@dbname+'_fullRESTOREDATABASE['+@dbname+']FROMDISK="D:\DBBackup\'+@dbname+'Jull.bak”WITHFILE=1,MOVEN"DataBase_Name"TON"D:\DataBase\'+@dbname+'.mdf",MOVEN”DataBase_Name_log"TON"D:\DataBase\'+@dbname+'_log.ldf”,NORECOVERY,NOUNLOAD,REPLACE,STATS=10GO'print@sql―生成的SQL--RESTOREDataBaseName_fullRESTOREDATABASE[DataBaseName]FROMDISK='D:\DBBackup\DataBaseName_full.bak'WITHFILE=1,MOVEN'DataBase_Name'TON'D:\DataBase\DataBaseName.mdf',MOVEN'DataBase_Name_log'TON'D:\DataBase\DataBaseName_log.ldf',NORECOVERY,NOUNLOAD,REPLACE,STATS=10GO--3:差異備份declare@dbnamevarchar(100)declare@sqlnvarchar(max)set@dbname='DataBaseName'set@sql='--'+@dbname+'_diffBACKUPDATABASE['+@dbname+']TODISK=N"D:\DBBackup\'+@dbname+'_diff.bak”WITHDIFFERENTIAL,NOFORMAT,NOINIT,NAME=N”'+@dbname+T異數(shù)據(jù)庫備份”,SKIP,NOREWIND,NOUNLOAD,STATS=10GO'print@sql―生成的SQL--DataBaseName_diffBACKUPDATABASE[DataBaseName]TODISK=N'D:\DBBackup\DataBaseName_diff.bak'WITHDIFFERENTIAL,NOFORMAT,NOINIT,NAME=N'DataBaseName-差異數(shù)據(jù)庫備份‘,SKIP,NOREWIND,NOUNLOAD,STATS=10GO--4:差異備份還原declare@dbnamevarchar(100)declare@sqlnvarchar(max)set@dbname='DataBaseName'set@sql='--RESTORE'+@dbname+'_fullRESTOREDATABASE['+@dbname+']FROMDISK="D:\DBBackup\'+@dbname+'_diff.bak”WITHFILE=1,NOUNLOAD,STATS=10GO'print@sql―生成的SQL--RESTOREDataBaseName_fullRESTOREDATABASE[DataBaseName]FROMDISK='D:\DBBackup\DataBaseName_diff.bak'WITHFILE=1,NOUNLOAD,STATS=10GO四、后記以測(cè)試的700G的數(shù)據(jù)文件,我是通過數(shù)據(jù)庫的作業(yè)進(jìn)行愚公移山的,搬數(shù)據(jù)到新的服務(wù)器上的,這樣的好處就是對(duì)之前的數(shù)據(jù)庫進(jìn)行優(yōu)化,比如進(jìn)行數(shù)據(jù)庫參數(shù)的設(shè)置,比如表分區(qū),在對(duì)之前數(shù)據(jù)庫影響盡量小的情況進(jìn)行數(shù)據(jù)搬遷。四、遷移重難點(diǎn)分析及措施1.如何保證數(shù)據(jù)遷移過程中的安全性和操作可審計(jì)性?回答:數(shù)據(jù)遷移中的安全性不可忽略,我們基于多重?cái)?shù)據(jù)審計(jì)功能實(shí)現(xiàn)遷移安全性和操作審計(jì)性。若要將登錄和密碼從服務(wù)器A上的SQLServer實(shí)例傳輸?shù)椒?wù)器B上的SQLServer實(shí)例,請(qǐng)執(zhí)行以下步驟:1在服務(wù)器A上,啟動(dòng)SQLServerManagementStudio,然后連接到要從中移動(dòng)數(shù)據(jù)庫的SQLServer實(shí)例。2打開新的查詢編輯器窗口,然后運(yùn)行以下腳本。USEmasterGOIFOBJECT_ID('sp_hexadecimal')ISNOTNULLDROPPROCEDUREsp_hexadecimalGOCREATEPROCEDUREsp_hexadecimal@binvaluevarbinary(256),@hexvaluevarchar(514)OUTPUTASDECLARE@charvaluevarchar(514)DECLARE@iintDECLARE@lengthintDECLARE@hexstringchar(16)SELECT@charvalue='0x'SELECT@i=1SELECT@length=DATALENGTH(@binvalue)SELECT@hexstring='0123456789ABCDEF'WHILE(@i<=@length)BEGINDECLARE@tempintintDECLARE@firstintintDECLARE@secondintintSELECT@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+1ENDSELECT@hexvalue=@charvalueGOIFOBJECT_ID('sp_help_revlogin')ISNOTNULLDROPPROCEDUREsp_help_revloginGOCREATEPROCEDUREsp_help_revlogin@login_namesysname=NULLASDECLARE@namesysnameDECLARE@typevarchar⑴DECLARE@hasaccessintDECLARE@denyloginintDECLARE@is_disabledintDECLARE@PWD_varbinaryvarbinary(256)DECLARE@PWD_stringvarchar(514)DECLARE@SID_varbinaryvarbinary(85)DECLARE@SID_stringvarchar(514)DECLARE@tmpstrvarchar(1024)DECLARE@is_policy_checkedvarchar(3)DECLARE@is_expiration_checkedvarchar(3)DECLARE@defaultdbsysnameIF(@login_nameISNULL)DECLARElogin_cursCURSORFORSELECTp.sid,,p.type,p.is_disabled,p.default_database_name,l.hasaccess,l.denyloginFROMsys.server_principalspLEFTJOINsys.sysloginslON(=)WHEREp.typeIN('S','G','U')AND<>'sa'ELSEDECLARElogin_cursCURSORFORSELECTp.sid,,p.type,p.is_disabled,p.default_database_name,l.hasaccess,l.denyloginFROMsys.server_principalspLEFTJOINsys.sysloginslON(=)WHEREp.typeIN('S','G','U')AND=@login_nameOPENlogin_cursFETCHNEXTFROMlogin_cursINTO@SID_varbinary,@name,@type,@is—disabled,@defaultdb,@hasaccess,@denyloginIF(@@fetch_status=-1)BEGINPRINT'Nologin(s)found.'CLOSElogin_cursDEALLOCATElogin_cursRETURN-1ENDSET@tmpstr='/*sp_help_revloginscript'PRINT@tmpstrSET@tmpstr='**Generated'+CONVERT(varchar,GETDATE())+'on'+@@SERVERNAME+'*/'PRINT@tmpstrPRINT''WHILE(@@fetch_status<>-1)BEGINIF(@@fetch_status<>-2)BEGINPRINT”SET@tmpstr='--Login:'+@namePRINT@tmpstrIF(@typeIN('G','U'))BEGIN-NTauthenticatedaccount/groupSET@tmpstr='CREATELOGIN'+QUOTENAME(@name)+'FROMWINDOWSWITHDEFAULT_DATABASE=['+@defaultdb+']'ENDELSEBEGIN-SQLServerauthentication一obtainpasswordandsidSET@PWD_varbinary=CAST(LOGINPROPERTY(@name,'PasswordHash')ASvarbinary(256))EXECsp_hexadecimal@PWD_varbinary,@PWD_stringOUTEXECsp_hexadecimal@SID_varbinary,@SID_stringOUT一obtainpasswordpolicystateSELECT@is_policy_checked=CASEis_policy_checkedWHEN1THEN'ON'WHEN0THEN'OFF'ELSENULLENDFROMsys.sql_loginsWHEREname=@nameSELECT@is_expiration_checked=CASEis_expiration_checkedWHEN1THEN'ON'WHEN0THEN'OFF'ELSENULLENDFROMsys.sql_loginsWHEREname=@nameSET@tmpstr='CREATELOGIN'+QUOTENAME(@name)+'WITHPASSWORD='+@PWD_string+'HASHED,SID='+@SID_string+',DEFAULT_DATABASE=['+@defaultdb+']'IF(@is_policy_checkedISNOTNULL)BEGINSET@tmpstr=@tmpstr+',CHECK_POLICY='+@is_policy_checkedENDIF(@is_expiration_checkedISNOTNULL)BEGINSET@tmpstr=@tmpstr+',CHECK_EXPIRATION='+@is_expiration_checkedENDENDIF(@denylogin=1)BEGIN--loginisdeniedaccessSET@tmpstr=@tmpstr+';DENYCONNECTSQLTO'+QUOTENAME(@name)ENDELSEIF(@hasaccess=0)BEGIN--loginexistsbutdoesnothaveaccessSET@tmpstr=@tmpstr+';REVOKECONNECTSQLTO'+QUOTENAME(@name)ENDIF(@is_disabled=1)BEGIN--loginisdisabledSET@tmpstr=@tmpstr+';ALTERLOGIN'+QUOTENAME(@name)+'DISABLE'ENDPRINT@tmpstrENDFETCHNEXTFROMlogin_cursINTO@SID_varbinary,@name,@type,@is_disabled,@defaultdb,@hasaccess,@denyloginENDCLOSElogin_cursDEALLOCATElogin_cursRETURN0GO3注意:此腳本會(huì)在“master”數(shù)據(jù)庫中創(chuàng)建兩個(gè)存儲(chǔ)過程。兩個(gè)存儲(chǔ)過程分別命名為“sp_hexadecimal”存儲(chǔ)過程和"sp_help_revlogin”存儲(chǔ)過程。4運(yùn)行下面的語句。EXECsp_help_revlogin5由“sp_help_revlogin”存儲(chǔ)過程生成的輸出腳本是登錄腳本。此登錄腳本創(chuàng)建具有原始安全標(biāo)識(shí)符(SID)和原始密碼的登錄。6在服務(wù)器B上,啟動(dòng)SQLServerManagementStudio,然后連接到您將數(shù)據(jù)庫移動(dòng)到的SQLServer實(shí)例。重要信息:在執(zhí)行步驟5之前,請(qǐng)檢查“備注”一節(jié)中的信息。7打開新的查詢編輯器窗口,然后運(yùn)行步驟3中生成的輸出腳本。備注在對(duì)服務(wù)器B的實(shí)例上運(yùn)行輸出腳本之前,請(qǐng)檢查以下信息:?仔細(xì)檢查輸出腳本。如果服務(wù)器A和服務(wù)器B處在不同的域中,則必須修改輸出腳本。然后,必須在CREATELOGIN語句中使用新的域名來替換原始域名。新的域中授予訪問權(quán)限的集成登錄不會(huì)具有與原始域中的登錄相同的SID。因此,用戶會(huì)從這些登錄中孤立出來。有關(guān)如何解決這些孤立用戶的更多信息,請(qǐng)單擊下面的文章編號(hào),以查看Microsoft知識(shí)庫中相應(yīng)的文章:240872(/kb/240872/)如何解決在運(yùn)行SQLServer的服務(wù)器之間移動(dòng)數(shù)據(jù)庫時(shí)的權(quán)限問題如果服務(wù)器A和服務(wù)器B處于同一域中,則使用相同的SID。因此,用戶不可能是孤立的。在輸出腳本中,通過使用加密密碼來創(chuàng)建登錄。這是因?yàn)镃REATELOGIN語句中使用了HASHED參數(shù)。此參數(shù)指定在PASSWORD參數(shù)后輸入的密碼已經(jīng)過哈希處理。默認(rèn)情況下,只有sysadmin”固定服務(wù)器角色的成員可以從“sys.server_principals”視圖運(yùn)行SELECT語句。除非"sysadmin”固定服務(wù)器角色的成員授予用戶必需的權(quán)限,否則用戶無法創(chuàng)建或運(yùn)行輸出腳本。本文中的步驟不會(huì)為特定登錄傳輸默認(rèn)數(shù)據(jù)庫信息。這是因?yàn)槟J(rèn)數(shù)據(jù)庫不可能總是存在于服務(wù)器B上。若要定義某個(gè)登錄的默認(rèn)數(shù)據(jù)庫,請(qǐng)使用ALTERLOGIN語句,并傳入登錄名和默認(rèn)數(shù)據(jù)庫作為參數(shù)。服務(wù)器A的排序順序可能不區(qū)分大小寫,而服務(wù)器B的排序順序可能區(qū)分大小寫。在此情況下,當(dāng)您將登錄和密碼傳輸?shù)椒?wù)器B上的實(shí)例之后,必須以大寫字母的形式來鍵入密碼中的所有字母?;蛘撸?wù)器A的排序順序可能區(qū)分大小寫,而服務(wù)器B的排序順序可能不區(qū)分大小寫。在此情況下,您將無法使用傳輸?shù)椒?wù)器B上的實(shí)例的登錄和密碼進(jìn)行登錄,除非滿足下面的條件之一:o原始密碼不包含字母。o原始密碼中的所有字母都是大寫字母。服務(wù)器A和服務(wù)器B的排序順序可能都區(qū)分大小寫,或者可能都不區(qū)分大小寫。在這些情況下,用戶不會(huì)遇到問題。已經(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ò)誤消息。?在SQLServer2005中,登錄的SID用作實(shí)現(xiàn)數(shù)據(jù)庫級(jí)別訪問的基礎(chǔ)。一個(gè)登錄可能在服務(wù)器的兩個(gè)不同數(shù)據(jù)庫中具有兩個(gè)不同的SID。在此情況下,該登錄只可以訪問具有與“sys.server_principals”視圖中的SID匹配的SID的數(shù)據(jù)庫。在從兩個(gè)不同的服務(wù)器合并這兩個(gè)數(shù)據(jù)庫時(shí),可能會(huì)出現(xiàn)此問題。若要解決此問題,可使用DROPUSERT語句,從具有不匹配的SID的數(shù)據(jù)庫中手動(dòng)刪除相應(yīng)的登錄。然后,通過使用CREATEUSER語句再次添加該登錄。2.如何保證數(shù)據(jù)庫遷移0停機(jī),實(shí)時(shí)遷移?回答:我們基于CDC技術(shù)+數(shù)據(jù)庫鏡像技術(shù)來實(shí)現(xiàn)遷移0停機(jī)。在常見的企業(yè)數(shù)據(jù)平臺(tái)管理中有一項(xiàng)任務(wù)是一直困擾SQLServerDBA們的,這就是對(duì)數(shù)據(jù)更新的監(jiān)控。很多數(shù)據(jù)應(yīng)用都需要捕獲對(duì)業(yè)務(wù)數(shù)據(jù)表的更新。筆者見過幾種解決方案:1、在數(shù)據(jù)表中加入特殊的標(biāo)志列;2、通過在數(shù)據(jù)表上創(chuàng)建觸發(fā)器;3、通過第三方產(chǎn)品,例如舊M的LogExplorer。其實(shí)第1種和第2中方案都不好,因?yàn)榈?種方法需要在應(yīng)用程序編碼的時(shí)候尤為小心,如果有一段數(shù)據(jù)訪問邏輯忘了更新標(biāo)志位就會(huì)導(dǎo)致遺漏某些數(shù)據(jù)更新,而第2種方法對(duì)性能影響過于明顯,因?yàn)橛|發(fā)器的性能開銷是眾所周知的。第3種方法其實(shí)屬于一種叫做LogAudit的方案體系。因?yàn)镾QLServer同其他關(guān)系型數(shù)據(jù)庫一樣,所有數(shù)據(jù)操作都會(huì)在日志中記錄,因此通過分析日志就可以獲得完整的數(shù)據(jù)操作歷史。SQLServer其實(shí)早就有內(nèi)部的API可供ISV開發(fā)者中LogAudit的方案,不過微軟對(duì)這套API控制比較嚴(yán)格,只有簽署了一堆協(xié)議的核心級(jí)合作伙伴才能了解這套API。因此,現(xiàn)對(duì)業(yè)務(wù)數(shù)據(jù)更新的跟蹤在SQLServer平臺(tái)上一直是一件非常頭疼的事情,用戶需要在投入大量開發(fā)精力和投入額外采購成本之間做出選擇。幸運(yùn)的事,微軟終于在SQLServer2008中提供了一套半公開的LogAudit機(jī)制,就是我們所說的ChangeDataCapture,我們后面簡稱CDC。CDC的工作原理我們前面說過CDC是通過分析日志獲得數(shù)據(jù)操作歷史信息的,那么CDC的工作原理到底是怎么樣的呢?下圖可以非常貼切地說明這個(gè)功能的原理:圖1?當(dāng)DML提交到應(yīng)用數(shù)據(jù)庫時(shí),SQLServer必須寫入日志,并在緩存中更新數(shù)據(jù),然后在檢查點(diǎn)將內(nèi)存中的數(shù)據(jù)刷回?cái)?shù)據(jù)文件。?CDC的內(nèi)部進(jìn)程根據(jù)CDC的設(shè)置,在日志文件中提取更新歷史信息,并將這些個(gè)更新信息寫入對(duì)應(yīng)的更新跟蹤表。?DBA或開發(fā)人員通過調(diào)用CDC的函數(shù)來訪問更新跟蹤表,提取感興趣的更新歷史信息,并通過ETL應(yīng)用程序更新數(shù)據(jù)倉庫。?理論上面更新跟蹤表事會(huì)無限制增長的,因此CDC內(nèi)部有一個(gè)清理進(jìn)程,在默認(rèn)情況下更新跟蹤信息在寫入跟蹤表三天后會(huì)被自動(dòng)清理。CDC的配置由于CDC是一項(xiàng)比較高端的功能,因此只有在SQLServer2008的企業(yè)版、開發(fā)版和評(píng)估版中才能找到CDC功能。啟用數(shù)據(jù)庫級(jí)別的CDC要啟用CDC功能,首先需要一個(gè)sysadmin服務(wù)器角色的成員用戶激活數(shù)據(jù)庫級(jí)別的CDC,這個(gè)過程可以通過sys.spcdcenabledbchangedatacapture存儲(chǔ)過程來完成。如果想知道一個(gè)數(shù)據(jù)庫是否啟用了CDC功能,可以通過查詢sys.databases系統(tǒng)目錄的is_cdc_enabled字段。當(dāng)一個(gè)數(shù)據(jù)庫啟用CDC功能后,SQLServer會(huì)自動(dòng)在這個(gè)數(shù)據(jù)庫中創(chuàng)建cdc架構(gòu)和cdc用戶,所有CDC相關(guān)的數(shù)據(jù)表和用戶函數(shù)都會(huì)存放在cdc架構(gòu)下。CDC功能啟用后,SQLServer會(huì)首先在cdc架構(gòu)下創(chuàng)建五張表用于記錄一些CDC的原數(shù)據(jù),分別是ddl_history,change_tables,captured_columns,index_columns和lsn_time_mapping。在數(shù)據(jù)庫啟用了CDC后,接下來我們就需要在數(shù)據(jù)表上啟用CDC了。屬于db_owner角色的用戶可以通過存儲(chǔ)過程sys.sp_cdc_enable_table_change_data_capture來啟用對(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í)例后,SQLServer會(huì)在cdc架構(gòu)下創(chuàng)建一張數(shù)據(jù)表用于記錄從日志中解析出來的更新歷史信息。一段CDC的評(píng)估腳本為了評(píng)估CDC功能,我特地寫了一段腳本如下:1、首先創(chuàng)建一個(gè)測(cè)試數(shù)據(jù)庫;2、然后激活TestCDC數(shù)據(jù)庫上的更新捕獲功能;USETestCDCGOEXECspcdcenabledbchangedatecapture;GO執(zhí)行了存儲(chǔ)過程sp_cdc_enable_db_change_data_capture后,就會(huì)在數(shù)據(jù)庫TestCDC中看到有一些新的表被創(chuàng)建了,分別是ddl_history,change_tables,captured_columns,index_columns和lsn_time_mapping,并且這5張表都是在cdc架構(gòu)下。3、然后在TestCDC數(shù)據(jù)庫中創(chuàng)建測(cè)試表USETestCDCGOCREATETABLEdbo.Product(ProductIDintPRIMARYKEYNOTNULL,ProductNamenvarchar(100),Categorynvarchar(50))GO4、在dbo.Product表上激活更新跟蹤EXECsp_cdc_enable_table_change_data_captu
re'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表中還增加了_$512汁_舊『,_$end_lsn,_$seqval,_$operationff_$update_mask五個(gè)新的字段。-hU:iB%P%B&X其實(shí)在存儲(chǔ)過程sp_cdc_enable_table_change_data_capture中有一系歹列的參數(shù),在這里我們?yōu)榱撕喕雎粤艘粋€(gè)參數(shù)就是@captured_column_list,這個(gè)參數(shù)可以對(duì)表中特定的某些字段啟用更新跟蹤。5、在Product表上提交INSERT語句INSERTINTOdbo.ProductVALUES(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,而沒有更新的字段位為0。在本例中Product表一共有三列被跟蹤,所以應(yīng)該是一個(gè)三位的二進(jìn)制數(shù),右邊低位第一位是第一列ProductID,低位第二位是第二列ProductName,第三位就是Category了。因?yàn)檫@是一次INSERT,所以更新涉及到了所有的三列,所以_$update_mask字段就應(yīng)該是0x7了。6、繼續(xù)在Product表上提交UPDATE語句UPDATEdbo.ProductSETCategory=N'B'WHEREProd
uctID=1;提交完這條命令后,當(dāng)然也會(huì)在lsn_time_mapping和dbo_Product_CT中看到新記錄了。不過這次lsn_time_mapping中是一條,而dbo_Product_CT中則是兩條。(為什么會(huì)這樣呢?建議大家自己試一下咯,一試就明白了。)其中dbo_Product_CT表中的_$operation字段的值是第一條是3,第二條是4,_$update_mask字段的值兩條都是0x04。在這次操作中我們更新的是第三列,所以_$update_mask字段就應(yīng)該是0x4了。(如果我們更新的是ProductID會(huì)發(fā)%_$update_mask并非是0x1,而同樣是0x7,這估計(jì)是因?yàn)镻roductID是主鍵,更新主鍵應(yīng)該視同一條新的記錄。)7、再來一次UPDATEUPDATEdbo.ProductSETCategory=N'A'WHEREProductID=1;提交完這條命令后,在dbo_Product_CT中又看到兩條新記錄了。其中dbo_Product_CT表中的_$operation字段的值是第一條是3,第二條是4,_$update_mask字段的值兩條都是0x04。(看來CDC確實(shí)會(huì)記錄下數(shù)據(jù)的每次修改。)8、繼續(xù)在Product表上提交DML語句DELETEdbo.ProductWHEREProductID=1;提交完了這條命令后,就會(huì)在lsn_time_mapping和dbo_Product_CT中分別看到一條新記錄。其中dbo_Product_CT表中的_$operation字段的值是1,_$update_mask字段的值是0x07。9、提交一個(gè)DDL試試看ALTERTABLEdbo.ProductADDDescriptionnvarc
har(100);提交完這句命令后,只會(huì)在ddl_history表中看到一條新的記錄。10、然后再試試DMLUPDATEdbo.ProductSETDescription=N'NA';提交完這句語句后,所有cdc架構(gòu)下的表中都沒有看到新記錄。說明新增的列Description不跟蹤更新了......估計(jì)有人會(huì)說(細(xì)心的人哦!”“這次當(dāng)然看不到新記錄了,因?yàn)樵谇懊娴?步我們已經(jīng)刪除了所有的記錄,因此這次的UPDATE語句沒有影響到任何記錄,當(dāng)然CDC的表中不會(huì)有任何記錄了?!蹦敲吹降讓?duì)Description更新會(huì)不會(huì)記錄呢,經(jīng)過測(cè)試確實(shí)是不記錄的。那么如果我們想對(duì)Description也進(jìn)行更新跟蹤應(yīng)該怎么辦呢?很簡單的,由另外一個(gè)存儲(chǔ)過程叫做sp_cdc_disable_table_change_data_capture可以禁用對(duì)某張表的更新跟蹤,可以使用這個(gè)存儲(chǔ)過程先對(duì)Product表禁用更新跟蹤,然后再重新啟用對(duì)Product表的更新跟蹤就可以了。11、最后試一下DROP命令DROPTABLEdbo.Product;dbo.Product表消失了,同時(shí)cdc.dbo_Product_CT表也消失了。12.評(píng)估結(jié)束。一定有人問,捕獲到的更新怎么用呢,還有一堆系統(tǒng)函數(shù)和存儲(chǔ)過程可以幫助用戶,但是那段測(cè)試的過程就不詳細(xì)寫了。其中最重要的應(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_則是用于獲取精簡后的更新,在精簡的更新中有一些重復(fù)的更新就會(huì)被合并成一條記錄,比如說我們把產(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é)果集的函數(shù)運(yùn)算相當(dāng)慢,至少在CTP4中是這樣的,不知道以后的版本會(huì)不回有改進(jìn)):SELECT*FROMcdc.fn_cdc_get_all_changes_dbo_Product(0x00000048000001760004
,0X00000048000001F70004,'all');SELECT*FROMcdc.fn_cdc_get_net_changes_dbo_Product(0x00000048000001760004,0X00000048000001F70004,'all');CDC功能的IO開銷很明顯,CDC功能是會(huì)產(chǎn)生一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國多功能高效平膜拉絲機(jī)組行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2030年中國高密度聚乙烯壓濾機(jī)濾板數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國扶手?jǐn)?shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 美發(fā)沙龍門頭裝修協(xié)議
- 機(jī)場(chǎng)車站裝修延期協(xié)議
- 2025至2030年中國10-羥基癸酸數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025年中國金箔畫吊牌市場(chǎng)調(diào)查研究報(bào)告
- 汽車美容店裝修解約協(xié)議書
- 2025年中國水煤漿熱風(fēng)爐市場(chǎng)調(diào)查研究報(bào)告
- 2025年中國服裝染色劑市場(chǎng)調(diào)查研究報(bào)告
- 2024版塑料購銷合同范本買賣
- 【高一上】【期末話收獲 家校話未來】期末家長會(huì)
- JJF 2184-2025電子計(jì)價(jià)秤型式評(píng)價(jià)大綱(試行)
- GB/T 44890-2024行政許可工作規(guī)范
- 有毒有害氣體崗位操作規(guī)程(3篇)
- 兒童常見呼吸系統(tǒng)疾病免疫調(diào)節(jié)劑合理使用專家共識(shí)2024(全文)
- 二年級(jí)下冊(cè)加減混合豎式練習(xí)360題附答案
- TSG11-2020 鍋爐安全技術(shù)規(guī)程
- 汽輪機(jī)盤車課件
- 異地就醫(yī)備案?jìng)€(gè)人承諾書
- 蘇教版五年級(jí)數(shù)學(xué)下冊(cè)解方程五種類型50題
評(píng)論
0/150
提交評(píng)論