淺析SQL Server復(fù)制的向后兼容性
掃描二維碼
隨時(shí)隨地手機(jī)看文章
一、 在SQL Server 2008中不推薦使用事務(wù)復(fù)制的訂閱過(guò)期。
其實(shí)這個(gè)訂閱保持期就好像是一個(gè)“有效期”或者叫做“質(zhì)保期”。如果數(shù)據(jù)庫(kù)系統(tǒng)未能夠在有效的“質(zhì)保期”內(nèi)完成同步訂閱工作,則這訂約作業(yè)就會(huì)停用或者過(guò)期。如假設(shè)最大的分發(fā)保持期為72小時(shí)(這是SQLServer數(shù)據(jù)庫(kù)的默認(rèn)設(shè)置,管理員可以根據(jù)實(shí)際情況來(lái)調(diào)整),如果訂閱未能夠在72小時(shí)內(nèi)同步的話,而且分發(fā)數(shù)據(jù)庫(kù)中還存在尚未傳遞到訂閱服務(wù)器的更改,則訂閱作業(yè)將會(huì)被分發(fā)服務(wù)器上運(yùn)行的“清除分發(fā)”作業(yè)標(biāo)記為停用。此時(shí)數(shù)據(jù)庫(kù)管理員如果要重新啟用這個(gè)訂閱功能的話,那么就必須重新初始化訂閱。
而在數(shù)據(jù)庫(kù)中,主要是這個(gè)sp_addpublication過(guò)程來(lái)控制這個(gè)訂閱周期。在這個(gè)存儲(chǔ)過(guò)程中,有一個(gè)@retention 屬性。這個(gè)屬性主要用來(lái)設(shè)置訂閱活動(dòng)的保持期。默認(rèn)情況下這個(gè)屬性的值為336小時(shí)。如果訂閱活動(dòng)在保持期內(nèi)不活動(dòng)的話,則過(guò)期后系統(tǒng)就會(huì)將其自動(dòng)刪除。一般來(lái)說(shuō),這個(gè)值可以大于發(fā)布服務(wù)期使用的分發(fā)數(shù)據(jù)庫(kù)的最大保持期。也就是說(shuō),他們具有一定的獨(dú)立性。如果數(shù)據(jù)庫(kù)管理員想讓訂閱永遠(yuǎn)不過(guò)期的話,則只需要將這個(gè)參數(shù)設(shè)置為0即可。不過(guò)根據(jù)微軟的官方資料可以知道,這個(gè)參數(shù)的話在以后的版本中可能會(huì)被逐漸的淘汰。因?yàn)檫@個(gè)屬性如果設(shè)置不當(dāng)?shù)脑?,?huì)給合并復(fù)制造成一系列的不利影響,影響合并復(fù)制作業(yè)的穩(wěn)定性。為此數(shù)據(jù)庫(kù)管理員在部署復(fù)制作業(yè)時(shí),最好不要使用這個(gè)參數(shù),以免跟后續(xù)的數(shù)據(jù)庫(kù)版本不兼容。
如果一定要使用這個(gè)參數(shù)的話,那么最好能夠遵循下面的一些建議。
一是如果采用合并復(fù)制,那么合并發(fā)布的保持期最好給一個(gè)寬限期。因?yàn)榭赡軘?shù)據(jù)庫(kù)部署在不同的時(shí)區(qū),如果沒有寬限期的話,那么這些分布在不同時(shí)區(qū)中的訂閱服務(wù)器,運(yùn)行起來(lái)就可能會(huì)出現(xiàn)問(wèn)題。為此筆者建議,通常情況下需要給其一個(gè)24小時(shí)的寬限期。即使現(xiàn)在企業(yè)用不到,但是隨著后續(xù)規(guī)模的擴(kuò)大,很有可能要在不同的國(guó)家設(shè)置數(shù)據(jù)庫(kù)服務(wù)器。如美國(guó)的企業(yè),可能會(huì)在國(guó)內(nèi)的辦事處設(shè)置一臺(tái)訂閱服務(wù)器,以提高辦公的效率。此時(shí)就應(yīng)該為其設(shè)置24小時(shí)的寬限期。
二是盡量不要將這個(gè)參數(shù)設(shè)置為0。如果把這個(gè)參數(shù)設(shè)置為0,就表示沒有保持期的限制。雖然這從某個(gè)程度來(lái)講,可以簡(jiǎn)化數(shù)據(jù)庫(kù)管理員的維護(hù)工作。但是將這個(gè)參數(shù)的值設(shè)置為0,可能會(huì)產(chǎn)生一系列的負(fù)面效應(yīng)。如此時(shí)數(shù)據(jù)庫(kù)系統(tǒng)將無(wú)法刪除元數(shù)據(jù)等等。
為此,筆者的建議時(shí),在實(shí)現(xiàn)復(fù)制服務(wù)時(shí),最好不要采用這個(gè)參數(shù)。如果一定要用的話,那么要給其設(shè)置一個(gè)合理的寬限期;并且最好不要將這個(gè)參數(shù)設(shè)置為0。雖然這不是強(qiáng)制性的規(guī)定,但是為了復(fù)制服務(wù)能夠穩(wěn)定運(yùn)行,各位數(shù)據(jù)庫(kù)管理員最好還是好好考慮筆者的這個(gè)建議。
二、 非SQL Server訂閱服務(wù)器的處理。
SQL Server數(shù)據(jù)庫(kù)在橫向的兼容性上表現(xiàn)還是不錯(cuò)的。其不但可以支持SQL Server訂閱服務(wù)器,還能夠支持非SQLServer的訂閱服務(wù)器。如果企業(yè)需要采用非SQLServer的訂閱服務(wù)器,那么有兩個(gè)實(shí)現(xiàn)的渠道,分別為ODBC與OLE DB。不過(guò)由于ODBC其在性能、安全上都不如OLE DB接口,為此在后續(xù)的版本中,微軟數(shù)據(jù)庫(kù)可能不會(huì)再支持ODBC接口。所以在2008版本中實(shí)現(xiàn)訂閱服務(wù)器的話,那么最好不要再使用這個(gè)ODBC接口,而改用OLE DB接口。
到目前為止,SQL Server數(shù)據(jù)庫(kù)支持Oracle與IBMDB2兩個(gè)產(chǎn)品的訂閱服務(wù)期。如果要支持者兩個(gè)數(shù)據(jù)庫(kù)服務(wù)器的話,SQL Server現(xiàn)在已經(jīng)提供了比較完備的OLE DB訪問(wèn)接口。為此數(shù)據(jù)庫(kù)管理員也不用再擔(dān)心接口不兼容的問(wèn)題。不過(guò)采用這個(gè)非微軟的訂閱服務(wù)器,有比較多的限制條件。作為數(shù)據(jù)庫(kù)管理員要了解這些限制條件,并且在實(shí)際工作中一絲不茍的遵守它。類似的限制條件主要有以下幾個(gè)方面。
如果訂閱服務(wù)器即有SQL Server定于服務(wù)器,也有Oracle訂閱服務(wù)器或者其他非微軟的訂閱服務(wù)器,那么必須先為Oracle等非微軟的訂閱服務(wù)期啟用發(fā)布,然后再創(chuàng)建SQLServer訂閱服務(wù)器。數(shù)據(jù)庫(kù)管理員只要用四個(gè)字就可以記住這個(gè)規(guī)則,即客人優(yōu)先。另外,如果在這種混合型的訂閱服務(wù)器,則必須要使用OLE DB訪問(wèn)接口,而不能夠采用ODBC訪問(wèn)接口。而且運(yùn)行分發(fā)代理時(shí)所使用的帳戶必須對(duì)OLE DB訪問(wèn)接口的安裝目錄具有讀取的權(quán)限。這也是為什么筆者強(qiáng)烈推薦使用OLE DB訪問(wèn)接口的原因。因?yàn)椴捎昧诉@個(gè)接口之后,則以后如果要兼容其它訂閱服務(wù)器,就是一個(gè)水到渠成的事情。不需要經(jīng)過(guò)額外的調(diào)整與配置,就可以在對(duì)現(xiàn)有架構(gòu)影響不大的情況下部署非SQL Server的訂閱服務(wù)器。
另外需要注意的是,不同的數(shù)據(jù)庫(kù)處理NULL值的方式不同。為此采用不同牌子的訂閱服務(wù)器,可能會(huì)影響到空值、空字符串和NULL值的顯示方式,而且這個(gè)顯示方式又會(huì)影響在定義了唯一約束的列中插入值的行為。如在Oracle數(shù)據(jù)庫(kù)中,如果在某一列中設(shè)置為了唯一行約束,那么這個(gè)列仍然可以具有多個(gè)NULL值。但是在SQL Servre數(shù)據(jù)庫(kù)中則不同。只要這個(gè)列設(shè)置了唯一行約束,那么這個(gè)列就職能夠有一個(gè)Null值。所以,在混合型的訂閱服務(wù)器中,有時(shí)候還需要通過(guò)應(yīng)用程序或者其他手段來(lái)消除這種差異?;蛘咴跀?shù)據(jù)庫(kù)設(shè)計(jì)時(shí),要有意識(shí)的避免這種情況,如禁用NULL值等等?;蛘呖梢愿鶲racle或者IBM DB2的數(shù)據(jù)庫(kù)管理員聯(lián)系。往往這些大牌的數(shù)據(jù)庫(kù)為了相互之間實(shí)現(xiàn)兼容,都會(huì)在數(shù)據(jù)庫(kù)中預(yù)先實(shí)現(xiàn)了一些措施,來(lái)防止各個(gè)操作系統(tǒng)處理機(jī)制不同所導(dǎo)致的兼容問(wèn)題。
三、 合并復(fù)制過(guò)程中同時(shí)更新多列。
在合并復(fù)制到過(guò)程中,可能需要對(duì)目標(biāo)列同時(shí)進(jìn)行更新。合并復(fù)制是支持這個(gè)功能的。在合并復(fù)制執(zhí)行更新時(shí),數(shù)據(jù)庫(kù)會(huì)更新一個(gè)Update語(yǔ)句中指定的所有列,并將沒有更改的列重置為原先的值。不過(guò)合并復(fù)制更新往往涉及到比較多的記錄,為此其執(zhí)行速度會(huì)比較慢。為了提高這個(gè)執(zhí)行的速度,在2008以前的數(shù)據(jù)庫(kù)系統(tǒng)匯總,為此專門設(shè)置了一個(gè)fase_multicol_updateproc。如需要合并復(fù)制時(shí),會(huì)建議數(shù)據(jù)庫(kù)管理員將這個(gè)選項(xiàng)設(shè)置為false,以提高合并復(fù)制更新的執(zhí)行效率。 [!--empirenews.page--]
不過(guò)在SQL Server 2008中,通過(guò)優(yōu)化器數(shù)據(jù)庫(kù)系統(tǒng)會(huì)自動(dòng)對(duì)相關(guān)的合并復(fù)制更新語(yǔ)句進(jìn)行優(yōu)化。而且這個(gè)優(yōu)化的效果比這個(gè)選賢設(shè)置為False還要明顯。雖然在2008數(shù)據(jù)庫(kù)中,為了向前兼容還存在這個(gè)參數(shù),不過(guò)其存在的實(shí)際意義已經(jīng)不大。為此數(shù)據(jù)庫(kù)管理員在需要各并復(fù)制更新時(shí),不用為了提高其操作性能而再單獨(dú)的去設(shè)置這個(gè)參數(shù)。在以后的版本中,即使數(shù)據(jù)庫(kù)管理員設(shè)置了這個(gè)參數(shù),數(shù)據(jù)庫(kù)系統(tǒng)也會(huì)忽略掉。
可見無(wú)論是在對(duì)數(shù)據(jù)庫(kù)進(jìn)行升級(jí)又或者部署最新版本的數(shù)據(jù)庫(kù)時(shí),管理員不僅需要考慮到向前兼容的問(wèn)題(原有的設(shè)計(jì)要能夠在新版數(shù)據(jù)庫(kù)中實(shí)現(xiàn)),同時(shí)也要考慮到數(shù)據(jù)庫(kù)系統(tǒng)的向后兼容(盡量避免使用過(guò)時(shí)的功能或者即將不用的參數(shù))。畢竟企業(yè)使用數(shù)據(jù)庫(kù)是一個(gè)長(zhǎng)久的過(guò)程,如往往一用就是幾十年。在這么大的事件跨度內(nèi),不知道會(huì)出現(xiàn)多少個(gè)數(shù)據(jù)庫(kù)的版本。所以,數(shù)據(jù)庫(kù)的向后兼容與數(shù)據(jù)庫(kù)向前兼容一樣的重要。不過(guò)相對(duì)來(lái)說(shuō),向后兼容可能實(shí)現(xiàn)起來(lái)相對(duì)容易一點(diǎn)。只要數(shù)據(jù)庫(kù)管理員了解哪些參數(shù)或者功能可能在后續(xù)版本中被淘汰,就可以做好這個(gè)向后兼容性的工作。