SQL Server 復制及常見錯誤處理
SQL Server 復制
復制是一組技術的組合,可以用此組合對數據和數據庫對象進行復制由一個數據庫移動到另一個數據庫。
復制的英文是Replication,重復的意思,而不是Copy。復制的核心功能是存儲轉發,在源數據庫中進行增、刪、改之后,重復這個動作到其他數據庫。
使用復制的原因
1、負載均衡:通過將數據復制到其他數據庫服務器來減少當前服務器的負載。
2、分區:將經常使用的數據和歷史數據進行隔離。
3、授權:將一部分數據提供給需要使用數據的人。
4、數據合并:每個區域都有各自的數據,將其數據進行合并。
5、故障轉移:源數據庫無法連接時,可連接備用數據庫。或源數據庫保持鏈接情況下,用備用數據庫進行測試存儲過程等。
復制的組成
復制的概念類似發行雜志,發行商出版后,通過報刊亭等地方分發到訂閱雜志的人手里。在復制中,發行商,報刊亭,訂閱人 分別對應 發布服務器,分發服務器,訂閱服務器。
發布服務器
包含需要被發布的源數據庫。
分發服務器
包含分發數據庫,作用于存儲轉發發布服務器發過來的數據。一個分發服務器支持多個發布服務器,類似報刊亭可以出售多個出版社的雜志。分發服務器也可以和發布服務器是同一個實例,出版商不通過報刊亭自己直接賣。
訂閱服務器
包含發布服務器所發布的數據副本,這個副本可以是一個數據庫,或者一個表,甚至是一個表的子集。
發布和文章
發布指的是可以發布的文章的集合,這些文章包括表,存儲過程,視圖和用戶自定義函數。
發布表時,還可以根據限定條件只發布表的子集。
訂閱
訂閱是相對發布的一個概念,訂閱定義了訂閱服務器從哪個分發服務器接收發布。有兩類訂閱方式,推薦訂閱push和請求訂閱pull,在推薦訂閱情況下,當發布服務器產生更新時,分發服務器直接更新訂閱內容,而請求訂閱需要訂閱服務器定期查看分發服務器是否有可用更新,如果存在可用更新,則訂閱服務器更新數據。
復制類型
SQL Server 共有3種復制類型,每一個發布只能有一種復制類型,分別為:快照復制,事務復制,合并復制。
快照復制
快照復制將發布的所有表做成一個鏡像(數據庫對象的快照),然后一次性復制到訂閱服務器。由于發送的是整個數據集,所以中間發生的DML(增刪改)不會像其他復制那樣自動傳送到訂閱服務器。
快照復制的特點是:
1、占用網絡寬帶,因為一次性傳輸整個鏡像,所以快照復制的內容不要太大。
2、適合更新不頻繁,但每次更新都比較大的數據。
3、訂閱服務器是只讀的環境。
事務復制
事務復制也是由快照開始的,在第一次設置好事務復制后,發布的表、存儲過程等將會被鏡像,之后每次對于發布服務器所做的改動都會以日志的方式傳送到訂閱服務器。使發布服務器和訂閱服務器幾乎可以保持同步。
事務復制的特點是:
1、發布服務器和訂閱服務器內容基本可以同步。
2、發布服務器,分發服務器,訂閱服務器之間的網絡連接要保持暢通。
3、訂閱服務器也可以設置成請求訂閱,使訂閱服務器可以不用一直和分發服務器保持鏈接。
4、數據量有持續的增長,更新頻繁。
合并復制
合并復制是允許發布服務器更新數據庫,也允許訂閱服務器更新數據。定期將這些更新進行合并,使發布的數據在所有的節點上保持一致。因此,有可能發布服務器和訂閱服務器更新了同樣的數據,當產生沖突時,并不是完全按照發布服務器優先來處理。而是根據設置進行處理。
#p#
配置復制
首先在本地創建兩個實例,其中MSSQLSERVER默認實例作為發布服務器和分發服務器,MYSQLSERVER作為訂閱服務器。
重新安裝一次sqlserver,選擇新實例,不選擇默認實例即可。
1、在MSSQLSERVER實例中配置發布服務器和分發服務器
將發布服務器和分發服務器用作同一臺
設置存儲快照文件夾
需要對此目錄增加Everyone的讀寫權限,否則無法寫入會創建失敗。
配置分發數據庫
然后完成即可。
這樣發布服務器和分發服務器就配置完成了。
2、建立一個發布
選擇要發布的數據庫
發布類型選擇事物發布
選擇需要復制的表
選擇立即創建并保持可用狀態
代理安全性選擇默認代理賬戶即可
點擊完成
發現發布成功了,但是有一個警告。這是因為代理服務默認是關閉的,需要啟動它。
啟動代理服務后,去查看快照代理狀態
啟動就可以了。
這樣發布就創建完畢了。
3、在MYSQLSERVER實例中創建訂閱。
選擇查找SQL Server服務器
連接MSSQLSERVER實例
選擇剛剛建立的發布
然后選擇推送訂閱,這樣每次發布服務器存在更新就會自動推送到訂閱服務器上。
在本地新建一個數據庫用于接收數據。
分發代理安全性,選擇模擬進程賬戶,這里有個問題一會說。
然后點擊完成即可
到此訂閱創建完成
然后查看同步狀態
出現這個錯誤時,在MSSQLSERVER實例中,找到代理->作業->該作業停止。
使用復制監視器
進程無法連接到訂閱服務器,用戶NT SERVICE\SQLSERVERAGENT登陸失敗,這是因為MSSQLSERVER實例在嘗試用自己的SQLSERVER代理賬號進行連接,但是在MYSQLSERVER實例中,代理的賬號是不對的。所以要修改一下訂閱服務器的連接方式。
在訂閱服務器中本地訂閱是查看不到的,可以在發布服務器中本地發布中對應發布下查看。
這里修改下訂閱服務器的連接方式,再次查看同步狀態。
已經開始進行傳遞事物了,查看復制監視器
查看訂閱服務器該表數量
在發布服務器中添加測試數據
再次查詢訂閱服務器數量
可以發現,訂閱服務器和發布服務器幾乎是保持同步的。