1. 程式人生 > >SQL Server複製

SQL Server複製

SQL Server複製的階梯:級別1-SQL Server複製介紹

By Sebastian Meine, 2012/12/26

原文連結:http://www.sqlservercentral.com/articles/Stairway+Series/72274/

系列

本文是Stairway系列文章的一部分:Stairway to SQL Server複製

SQL Replication可以解決執行資料庫驅動應用程式中的許多問題。釋出/訂閱者模型並不完全容易理解,需要考慮指令碼編寫和監控複製系統的複雜性。最後,這裡是一系列文章,這些文章致力於為所有型別的SQL Server複製生成一種無術語的方法。

級別1:SQL Server複製介紹

 

主要入口:rep-li-ca-tion

發音:瑞皮凱迅

函式:名詞

日期:14世紀

單詞replication來自拉丁單詞replicare,意思是重複。複製描述了複製或複製的過程(www.merriam-webster.com)。

SQL Server中的複製就是這樣;它複製或複製資料。任何時候您需要建立資料的副本,或者複製對該資料的更改,都可以使用複製。可以在同一個資料庫中或在單獨的伺服器上的遠端位置建立該副本。

複製可以與源資料連續保持同步,或者以預定的時間間隔進行同步。單向同步以及雙向同步是可能的。複製甚至可以用於保持多個數據集彼此同步。

在第一層中,我將介紹基本的複製元件,並描述它們如何一起工作,以允許您複製資料和資料更改。我們還將檢視設定簡單複製場景的詳細示例。

複製元件

SQL Server複製由三個元件組成:釋出者、分發者和訂閱者。這些元件作用於釋出和訂閱中定義的文章。

文章

對於應該複製的每個SQL Server物件,都需要定義一個複製文章。每篇文章對應於單個SQL Server物件或物件的子集。最常被複制的物件是表、檢視和儲存過程。有關可複製的物件的完整列表,請參閱聯機圖書中釋出資料和資料庫物件。文章的屬性確定文章是否包含整個物件,或者物件的過濾子集是否構成複製的文章。通過某些限制,可以在單個物件上建立多個條目。

出版

邏輯上屬於一起的一組文章可以組合成一個釋出。該釋出定義了適用於該釋出中所有文章的選項。釋出定義的主要選項是要使用的複製型別。

釋出伺服器

使釋出可用於複製的SQL Server例項稱為釋出者。

釋出者監視所有文章以查詢更改,並向分發者提供關於這些更改的資訊。

經銷商

分發者是SQL Server例項,它跟蹤所有訂閱者和所有已釋出的更改,並確保每個訂閱者得到每個更改的通知。大多數更改都在分發資料庫中跟蹤。分發伺服器可以是一個單獨的SQL Server例項,但是分發服務通常與釋出伺服器在同一臺機器上執行。

使用者

訂閱者是通過訂閱接收所有已釋出資訊的SQL Server例項。

訂閱

訂閱是釋出的對應部分。訂閱定義哪個伺服器(訂閱者)將接收發布中的更新。每個訂閱建立一個釋出和一個訂閱者之間的連結。訂閱有兩種型別:推送訂閱和拉送訂閱。在推送訂閱中,分發伺服器直接更新訂閱者資料庫中的資料。在拉式訂閱中,訂閱者定期詢問分發伺服器是否有任何新的更改可用,然後更新資料本身。

複製型別

SQL Server中有三種主要的複製型別。它們是快照複製、合併複製和事務複製。

快照複製

快照複製在每次執行時建立複製的物件及其資料的完整副本。它使用SQL Server的BCP實用程式將每個表的內容寫入快照資料夾。快照資料夾是共享資料夾位置,在啟用複製時必須在分發伺服器上設定該位置。複製設定中的每個參與者都需要訪問快照資料夾。

每次執行快照複製時,都會從頭重新生成所有內容,因此它具有高頻寬和儲存要求。預設情況下,所有其他型別的複製都使用單個複製快照來僅在初始設定期間將所有訂閱者與分發伺服器同步。

事務複製

正如名稱所示,事務複製在事務的基礎上工作。對每個提交的事務進行掃描,以查詢應用於複製專案的更改。通過日誌讀取器代理掃描更改,該代理讀取釋出者資料庫的事務日誌。如果存在影響已釋出物件的更改,則這些更改將記錄在分發資料庫中的分發伺服器上。從那裡他們向訂戶走去。

事務複製允許接近實時同步,並且在釋出伺服器上只留下很小的記憶體佔用。雖然有幾個選項可以允許雙向資料移動,但事務複製最初被設計為僅以一種方式工作。

合併複製

合併複製從一開始就設計成允許在釋出方和訂閱方對資料進行更改。合併複製還允許斷開連線的場景,其中訂戶在白天可能不連線。那個使用者在晚上重新連線後會同步。如果一行同時在兩個不同的地方更新,則會發生衝突。合併複製附帶了幾個內建選項來解決這些衝突。

設定事務性複製

本節將逐步介紹如何設定涉及單個複製表的事務性複製。

要設定複製,需要配置分發者、釋出者和訂閱者。可以使用T-SQL指令碼完全設定和控制複製。然而,必要的T-SQL涉及儲存過程的使用,這些儲存過程一起具有超過100個必需的引數。因此,首先使用SSMS-GUI是有意義的。這裡顯示的示例視窗截圖是在單個伺服器(WIN2008A)上進行的,其中安裝了SQL-Server例項(R2A)。這個例項是一個SQL-Server 2008R2例項。但是,您也可以遵循SQL Server 2008和2005上的示例。

建立分佈

分發伺服器是事務複製的核心。在設定所有其他元件時,它必須是可用的,因此需要首先進行配置。

首先開啟SSMS並連線到包含複製源資料的SQL-Server例項。雖然分發伺服器可以位於自己的SQL-伺服器例項上,但是在許多情況下,讓釋出伺服器和分發伺服器位於同一臺機器上是有意義的,正如本示例中假定的那樣。

連線到伺服器後,右鍵單擊伺服器下的“複製”資料夾,然後選擇“配置分發”,如圖1所示。

 

1:配置分發

配置分發嚮導將啟動視窗以下,如圖2所示。

 

2:配置分發嚮導

 

 

 

忽略此視窗並單擊“下一步”是安全的。

在下一個視窗(圖3)中,您將選擇分發服務是否應該在這個伺服器上執行,或者網路中是否已經配置了分發伺服器。執行分發服務的機器還將包含分發資料庫。將此選擇保留在預設值,即要在此伺服器上安裝分發版,然後單擊“下一步”。

 

 

圖3:選擇分發伺服器

這將引發圖4中的對話方塊,要求您選擇快照資料夾的位置。

 

 

 

圖4:快照資料夾

快照資料夾可以是計算機上或網路中的任何位置。在分銷商上為其建立網路共享是有意義的。此示例使用“C:\Program Files\Microsoft SQL Server\MSSQL10_50 MSSQLSERVER\MSSQL\ReplData”。

快照資料夾的設定還需要授予適當的許可權。現在,無需詳細討論,將寫訪問許可權授予資料夾本身上的“驗證使用者組”(圖5)和讀訪問許可權授予共享上的“每個人”(圖6)。有關如何加強這一地區安全的更多資訊將在本樓梯的稍後級別給出。

 

 

 

圖5:授予對快照資料夾的訪問權

 

 

圖6:授予對快照資料夾共享的訪問權

 

在設定共享並將網路路徑放入嚮導的輸入欄位之後,按“下一步”進入“分發資料庫”表單,如圖7所示。

圖7:分發資料庫

這裡指定分發資料庫的名稱以及它的資料和日誌檔案應該位於何處。保留預設值,然後單擊“下一步”前進到“釋出伺服器”視窗(圖8)。

在“釋出者”視窗上,您準備潛在的釋出者能夠使用此分發伺服器。我們將在同一個例項上安裝釋出程式,因此您可以將預設值和“下一步”留給最後一個問題(圖9)。

 

 

圖8:準備釋出者

 

 

圖9:嚮導操作

最後一個問題是,您是希望向導立即執行您的選擇,還是希望向導建立稍後將手動執行的指令碼。同樣,保留預設設定,最後一次單擊“下一步”。

現在,您將看到一個動作列表,如圖10所示。單擊“完成”開始該過程。

 

 

圖10:嚮導摘要

最後,圖11所示的視窗給出了有關複製配置的進展和成功的資訊。

 

 

圖11:執行狀態

第一版

要建立釋出,首先需要有一個包含要釋出的表的資料庫。執行SQL 指令碼1為釋出建立測試資料庫。

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

 

指令碼1:為釋出建立測試資料庫

現在可以設定釋出了。

在SSMS物件資源管理器中打開復制資料夾,然後右擊“本地釋出”。在下拉選單中選擇“新建釋出”(圖12)。

 

 

圖12:新發布

“新建釋出嚮導”的歡迎頁面如圖13所示。

 

 

圖13:配置釋出嚮導

單擊“下一步”。

在“釋出資料庫”框(圖14)中,選擇剛剛建立的資料庫ReplA,然後單擊“下一步”。出版型別”視窗(圖15)允許您選擇要使用的複製型別。選擇“事務釋出”,然後單擊“下一步”。

 

圖14:選擇釋出資料庫

 

 

圖15:釋出型別

現在,您可以選擇哪些文章應該成為該釋出的一部分(圖16)。選擇表dbo.Test並再次單擊“下一步”以轉到“篩選錶行”對話方塊(圖17)。篩選器是一個高階主題,將在本樓梯的稍後級別進行介紹,所以現在只需單擊“下一步”,而不需要在此表單上進行選擇。

 

 

圖16:專案

 

 

圖17:篩選錶行

接下來的三個視窗處理快照代理。在第一個視窗(圖18)選擇“立即建立快照”,然後單擊“下一步”。在“代理安全性”視窗(圖19)上,單擊“安全設定”按鈕,並在開啟的表單上選擇“在SQL Server代理服務帳戶下執行”(圖20)。

 

 

圖18:快照排程

 

 

圖19:代理安全性

 

 

圖20:選擇一個賬戶

在表單上單擊“確定”,然後在代理安全視窗上單擊“下一步”。

這將顯示“嚮導操作”表單(圖21),供您選擇“建立釋出”。最後一次單擊“下一步”將帶您到摘要視窗(圖22)。

 

 

圖21:嚮導操作

 

 

圖22:嚮導的總結

這裡您需要為釋出選擇一個名稱。在欄位中寫入“MyFirstPublication”,然後單擊“完成”開始該過程。同樣,最後一個視窗(圖23)顯示了流程完成時的進度資訊和成功狀態。

 

 

圖23:執行狀態

第一次訂閱

在大多數情況下,訂閱伺服器位於不同的機器上,但是在某些情況下,您希望訂閱伺服器位於相同的例項上。為了簡化這個示例,我們還將停留在相同的例項上。使用指令碼2中的程式碼:建立資料庫ReplB。

USE MASTER;

GO

EXECUTE AS LOGIN = 'SA';

GO

CREATE DATABASE ReplB;

GO

REVERT;

GO

 

指令碼2:建立目標資料庫

現在我們轉到SSMS物件資源管理器,右擊“本地訂閱”,並在下拉選單中選擇“新建訂閱”(圖24)。

 

 

圖24:選擇新訂閱

 “新訂閱嚮導”(圖25)歡迎您,併為您提供了另一個按下“下一步”按鈕的機會。

 

 

圖25:新訂閱嚮導

在“釋出”表單(圖26)中,選擇剛剛建立的釋出,然後單擊“下一步”。“分發代理位置”視窗(圖27)允許您在推送和拉送訂閱之間進行選擇。保留預設值,然後轉到“訂閱者”視窗(圖28)。

 

 

圖26:選擇釋出

 

 

圖27:訂閱伺服器

 

 

圖28:目標資料庫

這裡需要選擇伺服器並選擇ReplB資料庫。

下一個視窗允許您設定“分發代理安全性”(圖29)。

 

 

圖29:安全分發代理

單擊右邊省略號按鈕之後在頁面選擇“在SQLServer代理服務帳戶下執行”這一形式(圖30)。

 

 

圖30:選擇一個賬戶

單擊“確定”,然後單擊“下一步”,就可以進入“同步計劃”視窗(圖31)。選擇“連續執行”,然後轉到“初始化訂閱”視窗(圖32)。保留預設值,以便立即初始化,然後“下一步”到“嚮導操作”表單(圖33)。

 

 

圖31:同步計劃

 

 

圖32:初始化

 

 

圖33:嚮導的行動

和前面一樣,保留預設值(建立訂閱)並單擊“下一步”將把您帶到概要視窗(圖34),其中列出將要執行的操作。單擊“完成”以啟動流程,並等待綠色成功標誌出現在最終表單上(圖35)。

 

 

圖34:嚮導總結

 

 

圖35:執行狀態

成功!

指令碼1在ReplA中建立了dbo.Test表並將1000行插入其中。在將初始快照傳輸到訂閱者之後,您將在ReplB中找到dbo.Test表,其中有1000行。安裝完成後幾分鐘,可以執行指令碼3來驗證複製是否按預期將所有資料推送到訂閱伺服器。此指令碼將ReplA.dbo.Test和ReplB.dbo.Test表連線在一起,以顯示哪些行被正確複製。現在,您可以執行自己的進一步測試,您可以在ReplA.dbo.Test中插入和更新行,並觀察這些更改神奇地出現在ReplB.dbo.Test中。

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:比較釋出者和訂閱者

總結

在SQL Server例項上的資料庫中被標記為要複製的釋出者的物件稱為.。文章被歸類為釋出。訂閱者通過訂閱更新文章中發生的更改。資料流經位於分發伺服器上的分發資料庫。釋出者、分發者和訂閱者可以是同一計算機上的相同例項,也可以是不同計算機上的獨立例項。源資料庫和目標資料庫可以是相同的(如果釋出者和訂閱者實際上是相同的SQL Server例項),但是分發資料庫必須是分開的。

本文是SQL Server複製樓梯的一部分

註冊RSS,只要我們在階梯上釋出新的內容,就會獲得通知!