一、背景
MySQL在對有歷史數據的數據庫進行搭建復制(Master/Slave)的時候,可以通過在Master服務器備份歷史數據,利用這個備份文件在Slave進行還原;這樣做的好處是可以更加快速的搭建好環境,因為可以對備份文件進行壓縮、分包,並且可以使用FTP等工具保證傳輸過程的安全與快捷;詳情可參考:Windows下搭建MySQL Master Slave
當SQL Server遇到同樣需要對歷史數據庫搭建復制,通常的做法是在本地發布快照,再由訂閱傳輸數據,那SQL Server應該如何實現備份歷史數據搭建復制(發布/訂閱)呢?下圖是備份文件初始化訂閱的基本邏輯結構圖:
(Figure0:備份文件初始化訂閱邏輯結構圖)
二、搭建過程
(一) 環境信息
系統環境:Windows Server 2008 + SQL Server 2008
發布服務器:192.168.1.105,服務器名稱:QuZhoushiwei105
分發服務器:與發布服務器同一台機器
訂閱服務器:192.168.1.106,服務器名稱:QuZhoushiwei106
發布數據庫:Barfoo.TestPublish
訂閱數據庫:Barfoo.TestSubscribe
數據庫帳號:ReplicationUser/ ReplicationPassword
說明:發布服務器與訂閱服務器是在同一內網的機器,如果你的環境是跨網段(跨機房)的請參考:SQL Server復制(發布訂閱)實戰二:跨網段(跨機房)部署
(二) 搭建步驟
1) 在發布服務器上以QuZhoushiwei105服務器名稱登陸發布服務器,如果你以localhost或者IP形式登陸服務器,在創建發布的時候會出現下圖Figure1的錯誤信息;
(Figure1:錯誤信息)
登陸服務器之後使用下面的SQL腳本創建一個測試數據庫:Barfoo.TestPublish,創建一個測試表:UserInfo,並插入一條數據,用於模擬歷史數據;
--創建測試數據庫 USE MASTER GO CREATE DATABASE [Barfoo.TestPublish] GO --創建測試表 USE [Barfoo.TestPublish] GO CREATE TABLE [dbo].[UserInfo]( [Id] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL, [names] [nvarchar](50) NULL, [address] [nvarchar](50) NULL, CONSTRAINT [PK_UserInfo] PRIMARY KEY CLUSTERED ( [Id] ASC ) ON [PRIMARY] ) ON [PRIMARY] GO --插入測試數據 INSERT [dbo].[UserInfo] ([names],[address]) VALUES (N'gaizai', N'廣州')
(Figure2:UserInfo表記錄)
2) 在發布數據庫和訂閱服務器上分別執行下面的SQL腳本創建帳號和密碼(ReplicationUser/ ReplicationPassword);
--發布服務器創建帳號密碼 USE [master] GO CREATE LOGIN [ReplicationUser] WITH PASSWORD=N'ReplicationPassword', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF GO EXEC master..sp_addsrvrolemember @loginame = N'ReplicationUser', @rolename = N'sysadmin' GO USE [Barfoo.TestPublish] GO CREATE USER [ReplicationUser] FOR LOGIN [ReplicationUser] GO USE [Barfoo.TestPublish] GO ALTER USER [ReplicationUser] WITH DEFAULT_SCHEMA=[dbo] GO --訂閱服務器創建帳號密碼 USE [master] GO CREATE LOGIN [ReplicationUser] WITH PASSWORD=N'ReplicationPassword', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF GO EXEC master..sp_addsrvrolemember @loginame = N'ReplicationUser', @rolename = N'sysadmin' GO