程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 如何提高SQL Server復制的向後兼容性

如何提高SQL Server復制的向後兼容性

編輯:關於SqlServer


  雖然說SQLServer2008到目前為止已經算是新版本的數據庫系統了。但是其以後還會不斷的更新換代。為此在部署SQLServer2008的時候,數據庫管理員仍然需要考慮到向後兼容性的問題。為了減少以後升級的麻煩,數據庫管理員有必要了解這個話題。具體來說,就是要了解SQLServer2008的數據庫版本中,哪些功能可能在以後的數據庫版本中會被拋棄。然後數據庫管理員在部署這些功能時,要慎重。能夠不用就不用,或者用其他功能來代替。免得在以後數據庫升級過程中,再來進行調整。筆者現在就以數據復制功能為例,談談如何做好這個向後的兼容性。

  一、 在SQLServer2008中不推薦使用事務復制的訂閱過期。

  其實這個訂閱保持期就好像是一個“有效期”或者叫做“質保期”。如果數據庫系統未能夠在有效的“質保期”內完成同步訂閱工作,則這訂約作業就會停用或者過期。如假設最大的分發保持期為72小時(這是SQLServer數據庫的默認設置,管理員可以根據實際情況來調整),如果訂閱未能夠在72小時內同步的話,而且分發數據庫中還存在尚未傳遞到訂閱服務器的更改,則訂閱作業將會被分發服務器上運行的“清除分發”作業標記為停用。此時數據庫管理員如果要重新啟用這個訂閱功能的話,那麼就必須重新初始化訂閱。

  而在數據庫中,主要是這個sp_addpublication過程來控制這個訂閱周期。在這個存儲過程中,有一個@retention 屬性。這個屬性主要用來設置訂閱活動的保持期。默認情況下這個屬性的值為336小時。如果訂閱活動在保持期內不活動的話,則過期後系統就會將其自動刪除。一般來說,這個值可以大於發布服務期使用的分發數據庫的最大保持期。也就是說,他們具有一定的獨立性。如果數據庫管理員想讓訂閱永遠不過期的話,則只需要將這個參數設置為0即可。不過根據微軟的官方資料可以知道,這個參數的話在以後的版本中可能會被逐漸的淘汰。因為這個屬性如果設置不當的話,會給合並復制造成一系列的不利影響,影響合並復制作業的穩定性。為此數據庫管理員在部署復制作業時,最好不要使用這個參數,以免跟後續的數據庫版本不兼容。

  如果一定要使用這個參數的話,那麼最好能夠遵循下面的一些建議。

  一是如果采用合並復制,那麼合並發布的保持期最好給一個寬限期。因為可能數據庫部署在不同的時區,如果沒有寬限期的話,那麼這些分布在不同時區中的訂閱服務器,運行起來就可能會出現問題。為此筆者建議,通常情況下需要給其一個24小時的寬限期。即使現在企業用不到,但是隨著後續規模的擴大,很有可能要在不同的國家設置數據庫服務器。如美國的企業,可能會在國內的辦事處設置一台訂閱服務器,以提高辦公的效率。此時就應該為其設置24小時的寬限期。

  二是盡量不要將這個參數設置為0。如果把這個參數設置為0,就表示沒有保持期的限制。雖然這從某個程度來講,可以簡化數據庫管理員的維護工作。但是將這個參數的值設置為0,可能會產生一系列的負面效應。如此時數據庫系統將無法刪除元數據等等。

  為此,筆者的建議時,在實現復制服務時,最好不要采用這個參數。如果一定要用的話,那麼要給其設置一個合理的寬限期;並且最好不要將這個參數設置為0。雖然這不是強制性的規定,但是為了復制服務能夠穩定運行,各位數據庫管理員最好還是好好考慮筆者的這個建議。

  二、 非SQLServer訂閱服務器的處理。

  SQL Server數據庫在橫向的兼容性上表現還是不錯的。其不但可以支持SQL Server訂閱服務器,還能夠支持非SQLServer的訂閱服務器。如果企業需要采用非SQLServer的訂閱服務器,那麼有兩個實現的渠道,分別為ODBC與OLE DB。不過由於ODBC其在性能、安全上都不如OLE DB接口,為此在後續的版本中,微軟數據庫可能不會再支持ODBC接口。所以在2008版本中實現訂閱服務器的話,那麼最好不要再使用這個ODBC接口,而改用OLE DB接口。

  到目前為止,SQLServer數據庫支持Oracle與IBMDB2兩個產品的訂閱服務期。如果要支持者兩個數據庫服務器的話,SQLServer現在已經提供了比較完備的OLE DB訪問接口。為此數據庫管理員也不用再擔心接口不兼容的問題。不過采用這個非微軟的訂閱服務器,有比較多的限制條件。作為數據庫管理員要了解這些限制條件,並且在實際工作中一絲不苟的遵守它。類似的限制條件主要有以下幾個方面。

  如果訂閱服務器即有SQLServer定於服務器,也有Oracle訂閱服務器或者其他非微軟的訂閱服務器,那麼必須先為Oracle等非微軟的訂閱服務期啟用發布,然後再創建SQLServer訂閱服務器。數據庫管理員只要用四個字就可以記住這個規則,即客人優先。另外,如果在這種混合型的訂閱服務器,則必須要使用OLE DB訪問接口,而不能夠采用ODBC訪問接口。而且運行分發代理時所使用的帳戶必須對OLE DB訪問接口的安裝目錄具有讀取的權限。這也是為什麼筆者強烈推薦使用OLE DB訪問接口的原因。因為采用了這個接口之後,則以後如果要兼容其它訂閱服務器,就是一個水到渠成的事情。不需要經過額外的調整與配置,就可以在對現有架構影響不大的情況下部署非SQL Server的訂閱服務器。

  另外需要注意的是,不同的數據庫處理NULL值的方式不同。為此采用不同牌子的訂閱服務器,可能會影響到空值、空字符串和NULL值的顯示方式,而且這個顯示方式又會影響在定義了唯一約束的列中插入值的行為。如在Oracle數據庫中,如果在某一列中設置為了唯一行約束,那麼這個列仍然可以具有多個NULL值。但是在SQL Servre數據庫中則不同。只要這個列設置了唯一行約束,那麼這個列就職能夠有一個Null值。所以,在混合型的訂閱服務器中,有時候還需要通過應用程序或者其他手段來消除這種差異。或者在數據庫設計時,要有意識的避免這種情況,如禁用NULL值等等。或者可以跟Oracle或者IBM DB2的數據庫管理員聯系。往往這些大牌的數據庫為了相互之間實現兼容,都會在數據庫中預先實現了一些措施,來防止各個操作系統處理機制不同所導致的兼容問題。

  三、 合並復制過程中同時更新多列。

  在合並復制到過程中,可能需要對目標列同時進行更新。合並復制是支持這個功能的。在合並復制執行更新時,數據庫會更新一個Update語句中指定的所有列,並將沒有更改的列重置為原先的值。不過合並復制更新往往涉及到比較多的記錄,為此其執行速度會比較慢。為了提高這個執行的速度,在2008以前的數據庫系統匯總,為此專門設置了一個fase_multicol_updateproc。如需要合並復制時,會建議數據庫管理員將這個選項設置為false,以提高合並復制更新的執行效率。

  不過在SQLServer2008中,通過優化器數據庫系統會自動對相關的合並復制更新語句進行優化。而且這個優化的效果比這個選賢設置為False還要明顯。雖然在2008數據庫中,為了向前兼容還存在這個參數,不過其存在的實際意義已經不大。為此數據庫管理員在需要各並復制更新時,不用為了提高其操作性能而再單獨的去設置這個參數。在以後的版本中,即使數據庫管理員設置了這個參數,數據庫系統也會忽略掉。

  可見無論是在對數據庫進行升級又或者部署最新版本的數據庫時,管理員不僅需要考慮到向前兼容的問題(原有的設計要能夠在新版數據庫中實現),同時也要考慮到數據庫系統的向後兼容(盡量避免使用過時的功能或者即將不用的參數)。畢竟企業使用數據庫是一個長久的過程,如往往一用就是幾十年。在這麼大的事件跨度內,不知道會出現多少個數據庫的版本。所以,數據庫的向後兼容與數據庫向前兼容一樣的重要。不過相對來說,向後兼容可能實現起來相對容易一點。只要數據庫管理員了解哪些參數或者功能可能在後續版本中被淘汰,就可以做好這個向後兼容性的工作。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved