我們可以通過資料複製跨區域網路、Internet在不同的資料庫伺服器上面維護多個資料的多個拷貝,同時以同步或非同步方式保證各個拷貝之間的資料一致性。
SQL Server提供完善的內建資料複製能力,它是SQL Server核心引擎非常重要的一部分。
SQL Server的複製分為三種方式:
快照式複寫:在某個時間點對於出版資料庫中的資料照相,然後將其複製到定購伺服器上。一般用於複製靜態表。
事務複製:複製的內容是多條語句和預存程序,這樣定購資料庫只是讀取資料庫的資料修改方式,並且反映這種修改。一般使用者更新頻率較高的資料庫。
合併式複寫:允許定購者和出版者的雙向修改,並將修改反映到雙方資料庫上。如果資料有衝突,將會按照一定規則處理該衝突。
目前單位有用到一個web網站,資料庫分別位於美國,荷蘭和深圳。在網站基礎架構上,我們使用的是3DNS和BigIP實現智能網域名稱解析和負載平衡。但由於三地具備各自的資料庫(SQL Server),需要保證各個資料庫的資料一致。我們就需要做資料複製。根據使用者的要求我們做的是事務複製,在網站的前兩個版本都很正常,但在上兩周更新了web頁面版本後,發現事務複製經常出現錯誤。重新做事務複製在間隔不長的時間後仍然出現。後檢查錯誤記錄檔發現提示:
The query processor could not produce a query plan from the optimizer because a query cannot update a text, ntext, or image column and a clustering key at the same
檢查資料庫表格,經過排查,確定存在問題的一個表格(XXX_article)。和程式員確認後發現此表格屬性變更為ntext類型,而且會同時更新此欄位和此表的叢集索引欄位。
因此,懷疑是由於在做事務複製時會同時修改這兩處位置造成,查閱相關的資料未能找到明確的官方說明,但是有其他程式的人員在程式編碼中發現類似問題,其解決方案是分成兩次update這個兩個欄位。具體的技術細節,未能得到明確的說明。在事務複製上我們無法幹擾其過程,因此我們將不對xxx_article做事務複製。然後對於xxx_article做快照式複寫,這樣可以避免此問題的產生。經過測試和應用,此問題已經得到解決。