通常情況下,快照式複寫有如下特點。
一是從快照這個名詞中,我們也可以看出,照片是一個靜態過程,即只反映資料庫某個時刻的狀態,而不會反映資料庫的一個變化過程。快照式複寫知識對資料庫某個設定的時間的資料進行複製,而不會對一段時間內的資料更改進行連續監視。這跟其另一個兄弟“事務複製”有本質的區別。若把快照式複寫比喻成完全備份的話,則事務複製就是一個差異備份。
二是快照式複寫所需要的資源比較大。快照式複寫是對整個資料庫進行複製,而不管其是否發生了變化。無疑,這複製的時間、傳輸的時間都會比較長,其耗費的伺服器與網路資源也會比較多。所以,快照式複寫的成本是比較高的。但是,在某些特定的情況下,快照式複寫反而可以提高效率。如對於不經常更改當資料,或者不要求保持高同步性的資料的情況下,利用快照式複寫來協調多個資料庫之間的資料一致性反而使比較合理的選擇。
快照式複寫雖然是一門比較先進的技術,但是,並不是在所有應用情境中,其都可以起到很好的效果。若使用不當,快照式複寫技術反而會拖資料庫管理員的後腿。根據筆者的經驗,一般在以下情況下,最好採用快照式複寫。
一是當資料更改量大但是不經常發生時,可以採用快照式複寫。如筆者有一個客戶,在全國各地都有服裝門市店,各個店面的銷售價格基本一致。由於經濟危機的影響,在年底為了儘可能的收回現金,決定在12月24日到1月3日之間下調各個門市店的銷售價格。由於他們的銷售系統都是全國連網的。價格的下調需要總部的系統來完成。此時,就可以採用快照技術,讓這個價格表跟各個地方的資料庫同步。在價格更改完成後,複製完成的資料庫快照集。一般來說,某個表的資料主要是待用資料,不經常更改。當資料在一個時間發生更改時,將一個全新的資料庫快照集發布到伺服器上,其效果會更好。
二是在某些決策支援系統中,採用快照式複寫技術的比較多。因為決策支援系統,他們只需要查詢資料,而很少對資料變更。同時,往往對資料庫的及時性要求也不高。如一個銷售決策系統,他們可能只需要到上個月月底的銷售資料,而不需要到當天的銷售資料。在這種情況下,採用快照式複寫技術,比起其他的資料同步技術,如事務複製技術,效果會更加的好。通常情況下,在某個時期,如果允許有過時的資料副本,也就是說,對資料的及時性要求不怎麼高的系統,可以考慮採用快照技術。
三是複製資料比較少的情況下,可以採用快照式複寫技術。因為快照式複寫是一次複製整個資料庫,如果資料量比較大的話,則每次複製、傳輸的時間都會比較長。此時,採用事務複製會比較合理。其實,這跟完全備份與差異備份類似。當資料庫容量比較小時,採用完全備份反而比差異備份更加實際。因為維護起來方便。
四是可以利用快照式複寫來實現對SQL Server資料庫的異地備份。SQL Server伺服器本身沒有異地備份功能。往往是先在本地進行備份,然後把備份檔案拷貝到其他主機上。有了快照式複寫的話,可以解決這個問題。即先建立一個散發者,然後每天晚上在空餘的時候,對發行伺服器進行快照式複寫,傳輸給散發者。如此的話,散發者的內容就跟發行伺服器上的內容保持一致。再對散發者執行備份,就可以完成異地備份的策略了。
所以,通常情況下,如果企業的應用情境符合上面四種情況的話,採用快照式複寫的效果會比較好。反之,則就需要考慮採用事務複製等其他的資料同步技術。
在使用快照式複寫技術的時候,筆者還有幾個善意的提醒。
一是快照式複寫技術可以在一定程度上實現網路資料庫的功能。SQL Server資料庫到現在的版本為止,都不支援資料庫橫向的擴充。也就是說,不主張採用多個伺服器來分擔主伺服器的負擔。微軟一直強調的是伺服器的縱向拓展,如增加伺服器的CPU數、增加記憶體等等,來改善伺服器的效能。使用快照式複寫技術可以使得資料的分布過程實現自動化,讓多個伺服器之間自動實現資料的同步,以適應企業不同程度的需要。當企業擴充時,可以增加額外的資料庫伺服器,來減輕主伺服器的工作負載並提高資料的使用效率。這也就在一定程度上實現了多伺服器(網路資料庫)的功能。不過這個功能有個限制,請看下面一個注意點。
二是快照式複寫技術基本上是單向的。也就是說,只可以從主伺服器上對資料進行快照式複寫,然後傳遞給其他的資料庫伺服器。其他的資料庫伺服器只能夠被動的接收主伺服器過來的快照。而不能夠把自己伺服器的資料的變化情況反饋給主伺服器。這就跟我們通常所說的網路伺服器有一個本質的區別。網路伺服器的話,各個子伺服器上更改的資料,可以在相互的伺服器上進行同步。所以,若要利用快照伺服器來實現網路伺服器的功能,以減輕主伺服器的負荷,這裡往往有一個部署上的技巧。就是對於子伺服器來說,只接受查詢的功能。也就是說,把一些報表產生、資料查詢的任務交給子伺服器來做。而把資料更新等任務則仍然交給主伺服器來完成。
三是對一些資料突然變更的情況,可以採用強制複製與強制訂閱。如在發行伺服器上(發行伺服器是快照式複寫中對於主伺服器的專業稱呼)資料發生了變更,則不管資料庫管理員設定的時間有沒有到,可以強制對發行伺服器執行快照式複寫。並且把它傳輸到散發者上,強制採用更新後的資料。這就是強制訂閱。強制訂閱通常用在發生資料更改時必須立即發送更改到訂閱伺服器的這種類型的應用中。如在08年1月1日早上1點某個超市要對所有的商品價格進行調價。此時,調價完成後,就必須採用強制訂閱業務,同步其他的一些價格查詢服務器上的資料。當客戶在查詢機上查詢價格的時候,查到的是其調整後的價格。這就是強制訂閱的一種典型應用。但是,若資料變更比較頻繁,則採用這種強制訂閱的話,很可能造成系統或者網路的癱瘓。資料庫管理員在這一點上要引起重視。
四是從2005以後的版本中,包括剛推出的2008版本,引入了對Internet技術的支援。通過複製,可以把資料發布到Internet上,提高了資料庫中資料的使用效率。不過在Internet上複製資料時,要注意幾個問題。一是要保證發行伺服器和散發者在網路防火牆的同一端,而不能夠位於防火牆的兩側,負責的話,資料複製將不會成功。二是要保證發行伺服器和散發者有直接的串連,而並發只有互連網這一種串連方式。三是目前它支援TCP/IP協議。只有這個協議正常運行,才可以進行互連網上的複製。同時要注意的問題就是互連網的頻寬問題。頻寬的多少,直接影響著資料複製的效率問題。
總之,快照式複寫的出現,為SQL Server各個資料庫之間資料的同步提供了一種捷徑,是保障SQL Server資料一致性的法寶。