資料庫複製(一)–複製介紹

aa按時發生發表於2018-09-04

介紹:

在執行著的資料庫驅動的應用程式中,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

快照資料夾可以被放置在你的機器上或者網路上。當然,在分發伺服器上建立一個網路共享是很有價值的。這裡的例子就是使用了這個WIN2008AReplicationSnapshotFolder 地址。

快照資料夾的設定也需要適當的許可權去授權。這裡沒必要太多去研究細節,我們授予寫許可權給”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: 比較訂閱者和釋出者

總結

在資料庫中的物件被稱為釋出者,就是在被標記為複製的釋出者被叫做文章。文章就是組合在一起的複製。訂閱者就是獲取發生在文章中的更新通過訂閱的方式。資料流通過存在於分發者的分發資料庫分發。釋出者,分發者和訂閱者能是相同的例項,也可以是獨立的例項在相同或者不同的機器上都可以。源和目的資料庫能是相同的,但是分發的資料庫必須是獨立的。


相關文章