介紹:
在運行着的數據庫驅動的應用程序中,SQL復制能解決許多問題。由於發送/訂閱的模式不是十分容易理解,復雜的腳本語言和監視復制系統也是需要一定的思想在里面。希望在接下來的幾個章節中能盡量將基本原理和操作闡述的詳細完整些,便於大家理解。
在SQLServer中,復制就是產生或復制數據;比如你需要去創建一個你數據的副本,或者復制一個那份數據的改變,SQL復制就派上用場了。
復制的副本可以在同一個數據庫中也可以在遠程的分隔的服務器上。
副本與源數據保持實時同步,或者在規定時間間隔內保持同步。單步同步方式,就像雙向同步一樣都是可行的,復制甚至能被用來保持多個數據集之間彼此的同步。既然有這么多優點,那我們就迫不及待的開始學習復制吧,當然一開始先要描述一些基礎信息,比如基本的復制組件和這些組件如何組合在一起來實現復制。Come on!
復制的組成:
SQL Server 復制主要由三部分組成:出版商,經銷商和訂閱者,這些組件作用於發行和訂閱服務器內部的文章上。
通過命名我們就能推想出來,復制很像報紙雜志的發行,可以簡單理解它的一般流程:出版--》經銷--》訂閱。
文章(復制的對象)
對於每個應該被復制的對象,一個復制文章需要被定義。每個文章對應着一個見得SQLServer對象或者一個對象的子集。這個被復制的對象通常就是表、視圖、或者存儲過程。當然也可以在單個文章中創建多個對象。
出版物(對象的集合)
一組在邏輯上在一起的文章(復制的對象)被混合成一個出版物。這個出版物有公共的被定義的可選項,主要的選項就是復制的類型。
出版商(發布服務器)
一個提供復制的出版物的SQL Server 實例被叫做出版商。出版商監視所有改變的文章,並且將這些改變通知給經銷商。
經銷商(分發服務器)
經銷商是既要追蹤所有的訂閱者又追蹤所有的發布者的改變,同時要保證任何一個改變都會被每一個訂閱者知曉。絕大多數的改變在分發服務器中被追蹤到。盡管經銷商能作為一個獨立的數據庫實例,但是通常情況下分發服務器會運行在出版商的機器上。
訂閱者(訂閱服務器)
訂閱者可以看做是能夠通過訂閱的方式接收發布的所有信息的數據庫實例。
訂閱
訂閱是相對於發布而言的,訂閱定義了哪一個訂閱服務器將要去接收來自發布服務器發布的更新。每個訂閱創建了一個在發布者和訂閱者之間的鏈接。有兩種訂閱方式,推送訂閱(Push)和請求訂閱(Pull)。
在推送訂閱的情況下,分發服務器直接在訂閱服務器數據庫更新訂閱的數據;
而在請求訂閱的模式下,需要訂閱服務器定期查詢分發服務器是否有可用更新,如果存在任何的可用更新,那么訂閱服務器自己完成更新數據。
復制的類型
在SQLServer 中主要有三種可用的復制類型,它們分別是:快照復制、合並復制和事物復制。
快照復制
快照復制就是每次運行都創建一個完整復制對象和對象數據的副本。它使用數據庫的BCP 工具來寫入每個表的內容到快照文件夾中。快照文件夾是一個共享的文件夾地址,在啟動復制的時候這個地址必須被建立在分發服務器上。並且每個參與者都是有權限訪問快照復制的文件夾的,需要在設置復制的時候進行設置。
這種模式缺點是:每次快照復制運行,都要所有的一切從頭再來一遍,因此它會占用很高的帶寬和存儲。
需要了解的是,所有其他類型的復制在初始化設置的時候都要使用一個簡單的復制快照來同步給所有的訂閱者和經銷商一個復制。
事務復制
顧名思義,就是以事務為基礎。對於每一次提交的事務的變更都要被掃描到復制的文章中。事務日志讀取代理掃描這些被做的變更,它讀取發布數據庫的事務日志。假如有改變影響了發布的對象,那么這些改變將被日志記錄在分發數據庫,然后分發數據庫再選用合適的方式發送給訂閱者。
事務復制可用作接近實時的同步,同時僅僅留下一些痕跡在發布方。盡管有一些選擇項可以考慮使用雙向數據移動,但是事務復制一開始就被設計為單向的模式。
合並復制
合並復制即允許發布服務器更新數據庫,也允許訂閱服務器更新數據。定期將這些更新進行合並,使得發布的數據在所有的節點上保持一致。因此,有可能發布服務器和訂閱服務器更新了同樣的數據,當沖突產生時,並不是完全按照發布服務器優先來處理沖突,而是根據設置進行處理,這些會在后續文章中講到。
設置事務復制
這部分是一個一步一步的關於如何配置事務復制包括單邊復制的指導。為了配置復制,分發者、發布者以及訂閱者都需要被配置。復制可以通過使用T-SQL腳本來完整的配置和控制。但是會使用唱過太多繁瑣的參數,因此我們將通過使用SSMS 來配置。這里我們使用了SQLServer2008 R2 版。
配置分發
分發環節是事務復制的核心。它是其他所有組件的先決條件,因此它需要首先配置。
進入SSMS,然后在左側菜單欄右鍵點擊"Replication"文件夾,選擇配置分配,如圖1:
圖 1
配置分配的向導
圖 2: 配置向導
向其他軟件一樣,NEXT即可。接下來你想要去選擇是否在本服務器上運行分發服務還是你已經在網絡上有一個配置好的分發服務器。這里我們選擇默認的在本服務起上安裝分發服務,然后點擊"Next"。如圖3
圖 3
接下來就是對話框,要求你選擇快照文件夾的路徑。如圖4
圖4
快照文件夾可以被放置在你的機器上或者網絡上。當然,在分發服務器上創建一個網絡共享是很有價值的。這里的例子就是使用了這個\\WIN2008A\ReplicationSnapshotFolder 地址。
快照文件夾的設置也需要適當的權限去授權。這里沒必要太多去研究細節,我們授予寫權限給"Authenticated Users" (圖 5)在這個文件夾上,讀權限授予"Everyone" (圖6)共享。
圖 5
圖6
在你共享並且將網絡地址輸入到向導的輸入地址后,點擊“下一步”前往你分發數據庫的窗口 。如圖7:
圖 7
你需要制定分發數據的名字和數據及日志的放置位置。其他的默認選項就好,點擊"Next"進一步來到發布者窗口(圖8)
在發布環節需要准備好潛在的發布者來使用分發者。我們來安裝發布的在相同的實例上,在這里除了默認選項直接店家下一步到最后一個環節(圖9)
圖 8:准備發布者
圖 9
最終的問題就是你是否要去立即執行的你的選項還是你想去創建腳本在一段時間以后在執行?再一次默認配置,最后一次點擊下一步。現在你就能看到一個任務列表在圖10 中。點擊 "Finish" 開啟這個進程
圖 10:
最終,這個屏幕將展示如圖11.給出關於進度和復制配置成功的信息。
圖11
第一次發布
來創建一個發布,我們需要首先有個包含表的數據來發布。執行下面腳本中的代碼來創建一個測試數據庫
USE MASTER; GO EXECUTE AS LOGIN = 'SA'; GO CREATE DATABASE ReplA; GO USE ReplA; GO IF OBJECT_ID('dbo.Test') IS NOT NULL DROP TABLE dbo.Test; GO CREATE TABLE dbo.Test( Id INT IDENTITY(1,1) PRIMARY KEY, Data INT CONSTRAINT Test_Data_Dflt DEFAULT CHECKSUM(NEWID()) ); GO INSERT INTO dbo.Test DEFAULT VALUES; GO 1000 USE MASTER; GO REVERT; GO
Script 1:創建測試數據庫及表
現在准備好設置發布。
在SSMS對象瀏覽器中打開復制文件夾右鍵單擊"Local Publication"。在下拉菜單中選擇"New Publication..."
圖12: New Publication
在圖13中向導界面出現了
圖 13: 配置發布向導
單擊 "Next".
在發布數據庫的選擇框選擇你剛剛創建的數據庫,我這里是ReplA ,單擊下一步,選擇你要使用額度復制類型。選擇事務復制,單擊下一步在圖15
圖14:
圖15: 選擇復制類型
現在你將去選擇哪個對象組作為發布的文章。圖16.選擇表dbo.Test 單擊下一步,繼續去過濾標的行在圖17中。過濾部分的進階內容在接下來的章節介紹。到目前為止只需要單擊下一步不再做其他選擇即可。
圖16: 復制對象
圖17: 行過濾
接下來三個環節就是處理快照代理圖18,選擇"Create a snapshot immediately" 然后點擊下一步。在"Agent Security" 窗口(圖19)點擊"Security Settings" 按鈕,然后選擇"Run under the SQL Server Agent service account" 在圖20中。
圖18
圖19
圖 20: 選擇賬戶
點擊"OK"在表格中,然后選擇"Next" 在代理安全窗口。接下來就是任務向導圖21,選擇"Create the publication"。單擊下一步進入到最后的窗口圖22
圖21: 向導
圖 22
在這你需要選擇一個發布的名稱。輸入"MyFirstPublication"進入文本點擊"Finish" 來開啟這個進程。下面就是進度信息和狀態圖22
圖 23
第一個訂閱
在絕大多數情況下,訂閱方在不同的機器上,但是為了保證實例簡單我們將選擇在同一個實例上配置訂閱。使用Script 2: 創建數據ReplB
USE MASTER;
GO
EXECUTE AS LOGIN = 'SA';
GO
CREATE DATABASE ReplB;
GO
REVERT;
GO
Script 2: 創建目標數據庫
現在我們進入SSMS對象瀏覽器右擊"Local Subscriptions" 並選擇"New Subscriptions..." 如圖24
圖 24
在訂閱者向導歡迎界面,然后就是一路的下一步
圖 25
在“Publication”窗口圖26,選擇我剛剛創建的發布,點擊下一步。在"Distribution Agent Location" 的窗口選擇push 或者pull 模式的訂閱。其他默認前往訂閱窗口圖28。
圖 26
圖27: Push or Pull
圖28: 目標數據庫
這里你需要選擇你的服務並選擇ReplB 數據庫,接下來下一個窗口設置"Distribution Agent Security" (圖29).
圖29: Distribution Agent Security
點擊右側小的省略符號按鈕,然后選擇"Run under the SQL Server Agent service account" 在新打開的窗口圖30
Figure 30:
點擊“OK” 然后點擊下一步,去Synchronization Schedule" 窗口(圖31),選擇一個"Run continuously" 然后繼續去"Initialize Subscriptions"窗口(圖32).默認就行。然后立即初始化並且點擊下一步去 "Wizard Actions" 窗口(圖33)
圖31: 同步步驟
圖32: 初始化
圖33: 執行向導
正如之前,其他的都是默認就好,點擊下一步。到最后的窗體(圖34),任務列表,點擊完成 開始進程,然后等待綠色成功的標志出現在最后的頁面(圖35)。
圖 34: 向導
圖35: Status
成功
腳本1創建的dbo.Test 表在數據庫ReplA ,並且插入了1000含數據。在初始化完成快照被轉移到訂閱者處,可以在這里也發現這個表也在ReplB ,也有1000行數據。在你完成配置之后你能運行Script 3 來驗證這個復制推送所有數據給訂閱者。連接兩個表的腳本4來展示哪一個被復制了。能夠進一步運行測試,也能插入和更新ReplA.dbo.Test 然后看看這些改變是否神奇的出現在ReplB.dbo.Test 里面了,哈哈
腳本3
SELECT TOP(20) A.Id AS [ReplA.Id],A.Data AS [ReplA.Data],B.Id AS [ReplB.Id],B.Data AS [ReplB.Data] FROM ReplA.dbo.Test A FULL OUTER JOIN ReplB.dbo.Test B ON A.Id = B.Id ORDER BY A.Id DESC
腳本 3: 比較訂閱者和發布者
總結
在數據庫中的對象被稱為發布者,就是在被標記為復制的發布者被叫做文章。文章就是組合在一起的復制。訂閱者就是獲取發生在文章中的更新通過訂閱的方式。數據流通過存在於分發者的分發數據庫分發。發布者,分發者和訂閱者能是相同的實例,也可以是獨立的實例在相同或者不同的機器上都可以。源和目的數據庫能是相同的,但是分發的數據庫必須是獨立的。
本篇簡答的介紹了復制相關的概念和簡單的事務復制的配置和測試。接下來我們將進一步了解更復雜的復制等情況。