1. 程式人生 > >SQLServer 以備份初始化訂閱

SQLServer 以備份初始化訂閱

.html ofo mat 事務 tina n) 問題 text ftp

原文:SQLServer 以備份初始化訂閱

在創建事務復制時,如果發布數據庫很大,使用快照初始化時,將等待很久,如果出現問題可能又得重新初始化。使用備份初始化會省很多時間,但是數據庫在創建發布訂閱期間不能訪問。使用備份代替快照遷移數據,備份可以壓縮或使用 FTP 傳輸,若在同一個機房,拷貝復制更快。


現在測試:

創建測試庫(發布服務器)

--	創建測試庫(發布服務器)
USE [master]
GO
CREATE DATABASE [PubDB]
ON  PRIMARY 
(
	NAME = N‘PubDB‘, 
	FILENAME = N‘D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\PubDB.mdf‘ , 
	SIZE = 5120KB , 
	FILEGROWTH = 1024KB )
LOG ON 
(
	NAME = N‘PubDB_log‘, 
	FILENAME = N‘D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\PubDB_log.ldf‘ , 
	SIZE = 1024KB , 
	FILEGROWTH = 10%)
GO


--	創建測試表(發布服務器)
USE [PubDB]
GO
CREATE TABLE [dbo].[PubTab](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Name] [varchar](20) NOT NULL,
	[Value] [decimal](18, 4) NULL,
	CONSTRAINT [PK_PubTab] PRIMARY KEY CLUSTERED ([id] ASC),
) ON [PRIMARY]
GO

INSERT INTO [dbo].[PubTab]([name],[Value])
VALUES(‘aa‘,99),(‘bb‘,100)
GO


添加復制用的登錄賬戶和數據庫用戶。訂閱不是同一個實例的添加登錄賬戶(發布服務器/訂閱服務器)

--	添加復制用的登錄賬戶和數據庫用戶。訂閱不是同一個實例的添加登錄賬戶(發布服務器/訂閱服務器)
USE [master]
GO
CREATE LOGIN [ReplUser] WITH PASSWORD=N‘ReplUser‘, DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
ALTER SERVER ROLE [sysadmin] ADD MEMBER [ReplUser]
GO
USE [PubDB]
GO
CREATE USER [ReplUser] FOR LOGIN [ReplUser]
GO

創建發布(發布服務器)

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片


創建完備份後,設置允許從備份文件初始化(發布服務器發布數據庫)

--	允許從備份文件初始化(發布服務器發布數據庫)
USE [PubDB]
GO
EXEC sp_changepublication
    @publication = N‘PublName‘, 
    @property = N‘allow_initialize_from_backup‘, 
    @value = true
GO

備份數據庫(發布服務器)

USE [master]
GO
BACKUP DATABASE [PubDB] 
TO  DISK = N‘D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\PubDB.bak‘ 
WITH NOFORMAT, NOINIT,  NAME = N‘PubDB-完整 數據庫 備份‘, SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

還原最新的備份數據庫,將作為訂閱庫(訂閱服務器)

USE [master]
GO
RESTORE DATABASE [SubDB] 
FROM  DISK = N‘D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\PubDB.bak‘ 
WITH  FILE = 1,  
MOVE N‘PubDB‘ TO N‘D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\SubDB.mdf‘, 
MOVE N‘PubDB_log‘ TO N‘D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\SubDB_log.ldf‘,  
NOUNLOAD,  STATS = 5
GO

添加訂閱,指定備份文件(發布服務器發布數據庫)

USE [PubDB]
GO
EXEC sp_addsubscription
@publication = N‘PublName‘,
@subscriber = N‘HZC‘,
@destination_db = N‘SubDB‘,
@subscription_type = N‘Push‘,
@sync_type = N‘initialize with backup‘,
@backupdevicetype=‘disk‘,
@backupdevicename=‘D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\PubDB.bak‘
技術分享圖片
創建訂閱後,更改訂閱服務器連接賬號

技術分享圖片

技術分享圖片


至此,發布訂閱據配置完成了,現在看看表中的數據。

SELECT *  FROM [PubDB].[dbo].[PubTab]
SELECT *  FROM [SubDB].[dbo].[PubTab]
技術分享圖片

增加一行記錄再查看,復制正常!

INSERT INTO [PubDB].[dbo].[PubTab]([name],[Value]) VALUES(‘cc‘,0)
GO

SELECT *  FROM [PubDB].[dbo].[PubTab]
SELECT *  FROM [SubDB].[dbo].[PubTab]
技術分享圖片

但是,當添加新表發布時,不能使用快照發布來同步了!~


創建測試表(發布服務器發布數據庫),新表 identity 字段需要增加 NOT FOR REPLICATION

--	創建測試表(發布服務器發布數據庫)
USE [PubDB]
GO
CREATE TABLE [dbo].[PubTab02](
	[ID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
	[Name] [varchar](20) NOT NULL,
	[Value] [decimal](18, 4) NULL,
	CONSTRAINT [PK_PubTab02] PRIMARY KEY CLUSTERED ([id] ASC),
) ON [PRIMARY]
GO

正常的添加發布(發布服務器發布數據庫)

技術分享圖片


這時不能啟用快照同步了,快照沒有用。

右鍵發布的表查看創建表的結構(發布服務器發布數據庫),接著到訂閱服務器數據庫執行。

USE [SubDB]
GO
CREATE TABLE [dbo].[PubTab02](
	[ID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
	[Name] [varchar](20) NOT NULL,
	[Value] [decimal](18, 4) NULL,
 CONSTRAINT [PK_PubTab02] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

好了,添加算是完成了,現在測試添加數據(發布服務器發布數據庫)

USE [PubDB]
GO
INSERT INTO [dbo].[PubTab02]([name],[Value]) VALUES(‘aa‘,99)
GO

SELECT *  FROM [PubDB].[dbo].[PubTab02]
SELECT *  FROM [SubDB].[dbo].[PubTab02]
技術分享圖片

若是添加 / 刪除 字段,按正常添加 / 刪除即可,直接在發布服務器數據庫執行,如。

USE [PubDB]
GO
ALTER TABLE [dbo].[PubTab02] ADD InsertDate DATETIME NULL
GO

INSERT INTO [dbo].[PubTab02]([name],[Value],[InsertDate]) VALUES(‘aa‘,99,GETDATE())
GO

SELECT *  FROM [PubDB].[dbo].[PubTab02]
SELECT *  FROM [SubDB].[dbo].[PubTab02]
技術分享圖片

參考:

初始化事務訂閱(不使用快照)

SQL Server 通過備份文件初始化復制



SQLServer 以備份初始化訂閱