SQL Server中的複製(Replication)是SQL Server高可用性的核心功能之一,在我看來,複製指的並不只僅是一項技術,而是一些列技術的集合,包括從存儲轉發數據到同步數據到維護數據一致性。使 用複製功能不只僅須要你對業務的熟悉,還須要對複製功能的總體有一個全面的瞭解,本系列文章旨在對SQL Server中的複製進行一個簡單全面的探討。(PS:在個人上篇文章中我發現某些文章的圖片使用mspaint手繪更有感受,但被不少人吐槽,所以在不 考慮我的羞恥感的前提下,本系列文章中的一些圖片繼續使用mspaint)。數據庫
複製,英文是Replication,這個詞源自於拉丁文replicare,原意是重複。SQL Server中的複製也是這個意思,複製的核心功能是存儲轉發,意味着在一個在一個位置增刪改了數據之後,重複這個動做到其餘的數據源,概念如圖1所示。安全
圖1.複製的基本概念服務器
固然,上面的這個模型是複製最簡單的模型,實際中的模型可能會複雜不少,可是大多數使用複製的緣由能夠分爲以下幾類:網絡
1.負載均衡----經過將數據複製到其它數據庫服務器來減小當前服務器的負載,好比說最典型的應用就是分發數據來分離OLTP和OLAP環境。負載均衡
2.分區----將常用的數據和歷史數據隔離,將歷史數據複製到其它數據庫中函數
3.受權----將一部分數據提供給須要使用數據的人,以供其使用post
4.數據合併-每一個區域都有其各自的數據,將其數據進行合併。好比一個大公司,每一個地區都有其各自的銷售數據,總部須要彙總這些數據。測試
5.故障轉移----複製全部數據,以便故障時進行轉移。spa
雖然須要使用複製的緣由多種多樣,可是在使用以前你首先要了解複製技術所需的組成元素。3d
複製的概念很像發行雜誌的模型,從發行商那裏出版後,須要經過報刊亭等地方分發到訂閱雜誌的人手裏。對於SQL Server複製來講,這個概念也是如此。對於SQL Server複製來講,發行商,報刊亭,訂閱者分別對應的是發佈服務器,分發服務器,訂閱服務器。概念如圖2所示。
圖2.發佈分發訂閱的基本概念
發佈服務器
圖2中的發佈服務器包含了須要被髮布的數據庫。也就是須要向其它數據源分發內容的源數據庫。固然,被髮布的數據首先須要被容許發佈。關於這裏的詳細設置會在文章後面提到。
分發服務器
圖2中的分發服務器包含了分發數據庫,分發數據庫的做用是存儲轉發發佈服務器發過來的數據。一個分發服務器支持多個發佈服務器,就像一個報刊亭能夠出售多 個出版社所出的雜誌同樣。同理,分發服務器也能夠和發佈服務器是同一個實例,這就像出版商不經過報刊亭,本身直接販賣雜誌同樣。
訂閱服務器
圖2中的訂閱服務器包含了發佈服務器所發佈的數據的副本。這個副本能夠是一個數據庫,或者一個表,甚至是一個表的子集。根據不一樣的設置,有些發佈服務器發 布的更新到訂閱服務器就是隻讀的(好比說用於出報表的OLAP環境),或者是訂閱服務器也能夠進行更新來將這些改變提交到發佈服務器。
發佈和文章
發佈指的是能夠發佈的文章的集合,這些文章包括表,存儲過程,視圖和用戶自定義函數,如圖3所示。
圖3.能夠發佈的內容
當咱們發佈表時,還能夠根據限定條件只發布表的子集。
訂閱
訂閱是相對發佈的一個概念,訂閱定義了訂閱服務器從哪一個分發服務器接收發布。有兩類訂閱方式,推送訂閱(Push)和請求訂閱(Pull),根據名字就可 以望文生義的知道,在推送訂閱的狀況下,當發佈服務器產生更新時,分發服務器直接更新訂閱的內容,而請求訂閱須要訂閱服務器按期查看分發服務器是否有可用 更新,若是存在可用更新,則訂閱服務器更新數據。
SQL Server將複製方式分爲三大類,每個發佈只能有一種複製類型,分別爲:快照複製,事務複製和合並複製。
快照複製
快照複製將發佈的全部表作成一個鏡像,而後一次性複製到訂閱服務器。中間的更新不會像其它複製類型那樣自動傳送到訂閱服務器。由這個概念不難看出,快照複製的特色會是:
1.佔用網絡寬帶,由於一次性傳輸整個鏡像,因此快照複製的內容不該該太大。
2.適合那些更新不頻繁,但每次更新都比較大的數據。好比企業員工信息表,每半年更新一次這類的業務場景。
3.適合訂閱服務器是OLAP只讀的環境。
來自MSDN的配圖能很好的闡述快照複製,如圖4所示。
圖4.快照複製
事務複製
事務複製就像其名字同樣,複製事務。在第一次設置好事務複製後,發佈的表、存儲過程等將會被鏡像,以後每次對於發佈服務器所作的改動都會以日誌的方式傳送到訂閱服務器。使得發佈服務器和訂閱服務器幾乎能夠保持同步。所以,能夠看出事務複製的特色是:
1.發佈服務器和訂閱服務器內容基本能夠同步
2.發佈服務器,分發服務器,訂閱服務器之間的網絡鏈接要保持暢通。
3.訂閱服務器也能夠設置成請求訂閱,使得訂閱服務器也能夠不用一直和分發服務器保持鏈接。
4.適用於要求實時性的環境。
來自MSDN的配圖能很好的闡述事務複製,如圖5所示
圖5.事務複製
合併複製
合併複製即容許發佈服務器更新數據庫,也容許訂閱服務器更新數據。按期將這些更新進行合併,使得發佈的數據在全部的節點上保持一致。所以,有可能發佈服務 器和訂閱服務器更新了一樣的數據,當衝突產生時,並非徹底按照發布服務器優先來處理衝突,而是根據設置進行處理,這些會在後續文章中講到。
來自MSDN的配圖能很好的闡述合併複製,如圖6所示。
圖6.合併複製
下面我進行一個簡單的事務複製。首先,在本地安裝兩個SQL Server實例,我本機安裝的兩個實例分別爲SQL Server 2008R2和SQL Server 2012,其中,SQL Server 2008R2做爲發佈和分發服務器,SQL Server 2012做爲訂閱服務器,如圖7所示。
圖7.複製的兩個實例
首先在SQL Server 2008R2上配置發佈服務器和分發服務器,選擇配置分發,如圖8所示。
圖8.配置分發
將發佈服務器和分發服務器選擇爲同1臺,如圖9所示。
圖9.設置發佈服務器和分發服務器爲同一臺服務器
設置快照文件夾,由上面MSDN的圖可知,快照代理是須要在分發服務器上暫存快照的,設置這個目錄,如圖10所示。
圖10.設置快照文件夾
這裏值得注意的是,須要給這個目錄對於Everyone設置讀取權限,如圖11所示。
圖11.設置讀取權限
下一步配置分發嚮導就按照默認值來,如圖12所示。
圖12.配置分發嚮導
剩下的步驟都保持默認值,最後成功在SQL Server 2008R2實例上配置發佈服務器和分發服務器,如圖13所示。
圖13.成功配置發佈和分發服務器
下面就要創建一個發佈了,選擇新建發佈,如圖14所示。
圖14.新建發佈
一路next,在選擇發佈類型時選擇事務發佈,如圖15所示。
圖15.選擇事務發佈
發佈用於測試的一個表,只有兩個列,一個爲自增的int型主鍵id,另外一個爲隨便設置的列,如圖16所示。
圖16.設置發佈的表(文章)
下一個頁面不過濾文章,直接保持默認值下一步。在下一個窗口中選擇當即建立快照並初始化..如圖17所示。
圖17.當即創造快照並初始化
安全設置保持和SQL Server Agent同樣的帳戶,如圖18所示。
圖18.快照代理和日誌讀取代理設置和SQL Server Agent同一個帳戶
剩下的步驟一路下一步,設置好發佈名稱後,成功建立發佈,如圖19所示。
圖19.成功建立發佈
下面咱們來在SQL Server 2012的實例上建立訂閱,選擇新建訂閱,如圖20所示。
圖20.新建訂閱
在歡迎界面選擇下一步後,選擇剛剛建立的發佈,如圖21所示。
圖21.選擇發佈服務器
下一步選擇推送訂閱,以便發佈服務器所作的改動能自動更改到訂閱服務器,如圖22所示。
圖23.選擇推送訂閱
選擇保持鏈接,下一步保持默認值,而後在分發代理安全性下選擇模擬進程帳戶。如圖24所示。
圖24.選擇模擬進程帳戶
保持默認值,一路下一步直到訂閱建立完成,如圖25所示。
圖25.建立訂閱成功
如今咱們進行測試,向表中插入100條數據,監視狀態,發現100個事務已經成功傳到了訂閱服務器,如圖26所示。
圖26.插入的100條數據已經成功傳送到訂閱服務器
如今咱們再來看訂閱服務器(SQL Server 2012),在發佈服務器插入的100條數據已經成功存在於訂閱服務器,如圖27所示。
圖27.100條數據已經成功發佈到了訂閱服務器
本文對SQL Server的複製進行了大體的講解,並實現了一個簡單的複製。複製的概念須要對SQL Server的各個方面都要有所涉獵,本系列文章的下一篇將會將複製應用的一些模式。