SQL Server資料庫複寫
介紹:
在運行著的資料庫驅動的應用程式中,SQL複製能解決許多問題。由於發送/訂閱的模式不是十分容易理解,複雜的指令碼語言和監視複製系統也是需要一定的思想在裡面。希望在接下來的幾個章節中能盡量將基本原理和操作闡述的詳細完整些,便於大家理解。
在SQL Server中,複製就是產生或複製資料;比如你需要去建立一個你資料的副本,或者複製一個那份資料的改變,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;GOEXECUTE AS LOGIN = 'SA';GOCREATE DATABASE ReplA;GOUSE ReplA;GOIF OBJECT_ID('dbo.Test') IS NOT NULL DROP TABLE dbo.Test;GOCREATE TABLE dbo.Test( Id INT IDENTITY(1,1) PRIMARY KEY, Data INT CONSTRAINT Test_Data_Dflt DEFAULT CHECKSUM(NEWID()));GOINSERT INTO dbo.Test DEFAULT VALUES;GO 1000USE MASTER;GOREVERT;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 AFULL OUTER JOIN ReplB.dbo.Test BON A.Id = B.IdORDER BY A.Id DESC
指令碼 3: 比較訂閱者和發行者
總結
在資料庫中的對象被稱為發行者,就是在被標記為複製的發行者被叫做文章。文章就是組合在一起的複製。訂閱者就是擷取發生在文章中的更新通過訂閱的方式。資料流通過存在於分發者的散發資料庫分發。發行者,分發者和訂閱者能是相同的執行個體,也可以是獨立的執行個體在相同或者不同的機器上都可以。源和目的資料庫能是相同的,但是分發的資料庫必須是獨立的。
本篇簡答的介紹了複製相關的概念和簡單的事務複製的配置和測試。接下來我們將進一步瞭解更複雜的複製等情況。
更多詳情見請繼續閱讀下一頁的精彩內容:
【內容導航】 |
第1頁:複製介紹 |
第2頁:事務代理作業 |