本主题介绍如何使用 SQL Server Management Studio、Transact-SQL 或复制管理对象(RMO)在 SQL Server 2014 中配置发布和分发。
在您开始之前
安全
有关详细信息,请参阅 安全复制部署。
使用 SQL Server Management Studio
使用“新建发布向导”或“配置分发向导”配置分发。 配置分发服务器后,在 “分发服务器属性 - <分发服务器> ”对话框中查看和修改属性。 如果您想要配置一个分发服务器,以允许 db_owner 固定数据库角色的成员创建发布,或者想要配置一个不作为发布服务器的远程分发服务器,请使用“配置分发向导”。
配置分发
在 Microsoft SQL Server Management Studio 中,连接到将成为分发服务器的服务器(在许多情况下,发布服务器和分发服务器是同一服务器),然后展开服务器节点。
右键单击 “复制 ”文件夹,然后单击“ 配置分发”。
遵循配置分发向导:
选择一个分销商。 若要使用本地分发服务器,请选择“ServerName>”<将充当其自己的分发服务器;SQL Server 将创建分发数据库和日志。 若要使用远程分发服务器,请选择“ 使用以下服务器作为分发服务器”,然后选择一个服务器。 服务器必须已配置为分发服务器,并且必须启用发布者才能使用分发服务器。 有关详细信息,请参阅在分发服务器上启用远程发布服务器(SQL Server Management Studio)。
如果选择远程分发服务器,则必须在 “管理密码 ”页上输入密码,以便从发布服务器连接到分发服务器。 此密码必须与在远程分发服务器上启用发布服务器时指定的密码匹配。
指定根快照文件夹(适用于本地分发服务器)。 快照文件夹只是你已指定为共享的目录;从此文件夹读取和写入的代理必须具有足够的权限才能访问它。 使用此分发服务器的每个发布服务器都会在根文件夹下创建一个文件夹,每个发布都会在发布服务器文件夹下创建用于存储快照文件的文件夹。 有关适当保护文件夹的详细信息,请参阅 “保护快照文件夹”。
指定分发数据库(适用于本地分发服务器)。 分发数据库存储所有类型复制的元数据和历史记录数据,以及事务复制相关的事务数据。
(可选)允许其他发布服务器使用分发服务器。 如果允许其他发布者使用分发服务器,则必须在 分发服务器密码 页上输入密码,以便这些发布者能够连接到分发服务器。
(可选)脚本配置设置。 有关详细信息,请参阅 脚本复制。
使用 Transact-SQL
可以使用复制存储过程以编程方式配置复制发布和分发。
使用本地分配器配置发布
执行 sp_get_distributor(Transact-SQL), 以确定服务器是否已配置为分发服务器。
如果结果集中installed的值为0,请在 master 数据库的分发服务器上执行sp_adddistributor(Transact-SQL)。
如果结果集中distribution db installed的值为0,请在 master 数据库的分发服务器上执行sp_adddistributiondb(Transact-SQL)。 为 @database指定分发数据库的名称。 (可选)可以指定 @max_distretention 的最大事务保留期和 @history_retention的历史记录保留期。 如果要创建新数据库,请指定所需的数据库属性参数。
在分发服务器上(也是发布服务器)执行 sp_adddistpublisher(Transact-SQL),指定将用作 @working_directory的默认快照文件夹的 UNC 共享。
在发布服务器上,执行sp_replicationdboption(Transact-SQL)。 指定要发布的数据库为@dbname,@optname的复制类型,以及@value的值为
true
。
使用远程分发服务器配置发布
执行 sp_get_distributor(Transact-SQL), 以确定服务器是否已配置为分发服务器。
如果结果集中安装的值为 0,请在 master 数据库的分发服务器(Distributor)上执行sp_adddistributor (Transact-SQL)。 指定 @password的强密码。 连接到分发服务器时,发布服务器将使用 distributor_admin 帐户的此密码。
如果结果集中安装的分发数据库的值为 0,请在主数据库的分发器上执行 sp_adddistributiondb(Transact-SQL)。 为 @database指定分发数据库的名称。 (可选)可以指定 @max_distretention 的最大事务保留期和 @history_retention的历史记录保留期。 如果要创建新数据库,请指定所需的数据库属性参数。
在分发服务器上,执行 sp_adddistpublisher(Transact-SQL),指定将用作 @working_directory的默认快照文件夹的 UNC 共享。 如果在连接到发布服务器时分发服务器将使用 SQL Server 身份验证,则还必须为 @security_mode 指定值 0,并为@login和@password指定Microsoft SQL Server 登录信息。
在发布者的 master 数据库上,执行 sp_adddistributor(Transact-SQL)。 指定步骤 1 中用于 @password的强密码。 连接到分发服务器时,发布服务器将使用此密码。
在发布服务器上,执行sp_replicationdboption(Transact-SQL)。 指定要发布的数据库 @dbname,为 @optname 设置的复制类型,并为 @value 设置为 true 的值。
示例 (Transact-SQL)
以下示例演示如何以编程方式配置发布和分发。 在此示例中,将使用脚本变量提供配置为发布服务器和本地分发服务器的服务器的名称。 可以使用复制存储过程以编程方式配置复制发布和分发。
-- This script uses sqlcmd scripting variables. They are in the form
-- $(MyVariable). For information about how to use scripting variables
-- on the command line and in SQL Server Management Studio, see the
-- "Executing Replication Scripts" section in the topic
-- "Programming Replication Using System Stored Procedures".
-- Install the Distributor and the distribution database.
DECLARE @distributor AS sysname;
DECLARE @distributionDB AS sysname;
DECLARE @publisher AS sysname;
DECLARE @directory AS nvarchar(500);
DECLARE @publicationDB AS sysname;
-- Specify the Distributor name.
SET @distributor = $(DistPubServer);
-- Specify the distribution database.
SET @distributionDB = N'distribution';
-- Specify the Publisher name.
SET @publisher = $(DistPubServer);
-- Specify the replication working directory.
SET @directory = N'\\' + $(DistPubServer) + '\repldata';
-- Specify the publication database.
SET @publicationDB = N'AdventureWorks2012';
-- Install the server MYDISTPUB as a Distributor using the defaults,
-- including autogenerating the distributor password.
USE master
EXEC sp_adddistributor @distributor = @distributor;
-- Create a new distribution database using the defaults, including
-- using Windows Authentication.
USE master
EXEC sp_adddistributiondb @database = @distributionDB,
@security_mode = 1;
GO
-- Create a Publisher and enable AdventureWorks2012 for replication.
-- Add MYDISTPUB as a publisher with MYDISTPUB as a local distributor
-- and use Windows Authentication.
DECLARE @distributionDB AS sysname;
DECLARE @publisher AS sysname;
-- Specify the distribution database.
SET @distributionDB = N'distribution';
-- Specify the Publisher name.
SET @publisher = $(DistPubServer);
USE [distribution]
EXEC sp_adddistpublisher @publisher=@publisher,
@distribution_db=@distributionDB,
@security_mode = 1;
GO
使用复制管理对象 (RMO)
在单个服务器上配置发布和分发
使用 ServerConnection 类创建与服务器的连接。
创建 ReplicationServer 类的一个实例。 传递步骤 1 中的 ServerConnection 。
创建 DistributionDatabase 类的一个实例。
将 Name 属性设置为数据库名称,并将 ConnectionContext 属性设置为步骤 1 中的 ServerConnection。
通过调用该方法 InstallDistributor 安装分发服务器。 传递步骤 3 中的 DistributionDatabase 对象。
创建 DistributionPublisher 类的一个实例。
请设置以下DistributionPublisher的属性:
Name - 出版商的名称。
ConnectionContext- 步骤 1 中的ServerConnection。
DistributionDatabase - 在步骤 5 中创建的数据库的名称。
WorkingDirectory - 用于访问快照文件的共享。
PublisherSecurity - 连接到发布服务器时使用的安全模式。 建议使用WindowsAuthentication 。
调用 Create 方法。
使用远程分发服务器配置发布和分发
使用 ServerConnection 类创建与远程分发服务器的连接。
创建 ReplicationServer 类的一个实例。 传递步骤 1 中的 ServerConnection 。
创建 DistributionDatabase 类的一个实例。
将 Name 属性设置为数据库名称,并将 ConnectionContext 属性设置为步骤 1 中的 ServerConnection。
通过调用该方法 InstallDistributor 安装分发服务器。 指定由发布者在连接到远程分发者时使用的安全密码和步骤 3 中的 DistributionDatabase 对象。 有关详细信息,请参阅 保护分发服务器。
重要
如果可能,请提示用户在运行时输入安全凭据。 如果必须存储凭据,请使用 Microsoft Windows .NET Framework 提供的 加密服务 。
创建 DistributionPublisher 类的一个实例。
设置以下属性: DistributionPublisher
Name - 本地发布服务器的名称。
ConnectionContext - 第一步中的ServerConnection。
DistributionDatabase - 在步骤 5 中创建的数据库的名称。
WorkingDirectory - 用于访问快照文件的共享。
PublisherSecurity - 连接到发布服务器时使用的安全模式。 建议使用WindowsAuthentication 。
调用 Create 方法。
使用 ServerConnection 类创建与本地发布服务器的连接。
创建 ReplicationServer 类的一个实例。 从第 9 步传递ServerConnection。
调用 InstallDistributor 方法。 传递远程分发服务器的名称和步骤 5 中指定的远程分发服务器的密码。
重要
如果可能,请提示用户在运行时输入安全凭据。 如果必须存储凭据,请使用 Windows .NET Framework 提供的 加密服务 。
示例(RMO)
可以使用复制管理对象(RMO)以编程方式配置复制发布和分发。
// Set the server and database names
string distributionDbName = "distribution";
string publisherName = publisherInstance;
string publicationDbName = "AdventureWorks2012";
DistributionDatabase distributionDb;
ReplicationServer distributor;
DistributionPublisher publisher;
ReplicationDatabase publicationDb;
// Create a connection to the server using Windows Authentication.
ServerConnection conn = new ServerConnection(publisherName);
try
{
// Connect to the server acting as the Distributor
// and local Publisher.
conn.Connect();
// Define the distribution database at the Distributor,
// but do not create it now.
distributionDb = new DistributionDatabase(distributionDbName, conn);
distributionDb.MaxDistributionRetention = 96;
distributionDb.HistoryRetention = 120;
// Set the Distributor properties and install the Distributor.
// This also creates the specified distribution database.
distributor = new ReplicationServer(conn);
distributor.InstallDistributor((string)null, distributionDb);
// Set the Publisher properties and install the Publisher.
publisher = new DistributionPublisher(publisherName, conn);
publisher.DistributionDatabase = distributionDb.Name;
publisher.WorkingDirectory = @"\\" + publisherName + @"\repldata";
publisher.PublisherSecurity.WindowsAuthentication = true;
publisher.Create();
// Enable AdventureWorks2012 as a publication database.
publicationDb = new ReplicationDatabase(publicationDbName, conn);
publicationDb.EnabledTransPublishing = true;
publicationDb.EnabledMergePublishing = true;
}
catch (Exception ex)
{
// Implement appropriate error handling here.
throw new ApplicationException("An error occured when installing distribution and publishing.", ex);
}
finally
{
conn.Disconnect();
}
' Set the server and database names
Dim distributionDbName As String = "distribution"
Dim publisherName As String = publisherInstance
Dim publicationDbName As String = "AdventureWorks2012"
Dim distributionDb As DistributionDatabase
Dim distributor As ReplicationServer
Dim publisher As DistributionPublisher
Dim publicationDb As ReplicationDatabase
' Create a connection to the server using Windows Authentication.
Dim conn As ServerConnection = New ServerConnection(publisherName)
Try
' Connect to the server acting as the Distributor
' and local Publisher.
conn.Connect()
' Define the distribution database at the Distributor,
' but do not create it now.
distributionDb = New DistributionDatabase(distributionDbName, conn)
distributionDb.MaxDistributionRetention = 96
distributionDb.HistoryRetention = 120
' Set the Distributor properties and install the Distributor.
' This also creates the specified distribution database.
distributor = New ReplicationServer(conn)
distributor.InstallDistributor((CType(Nothing, String)), distributionDb)
' Set the Publisher properties and install the Publisher.
publisher = New DistributionPublisher(publisherName, conn)
publisher.DistributionDatabase = distributionDb.Name
publisher.WorkingDirectory = "\\" + publisherName + "\repldata"
publisher.PublisherSecurity.WindowsAuthentication = True
publisher.Create()
' Enable AdventureWorks2012 as a publication database.
publicationDb = New ReplicationDatabase(publicationDbName, conn)
publicationDb.EnabledTransPublishing = True
publicationDb.EnabledMergePublishing = True
Catch ex As Exception
' Implement appropriate error handling here.
Throw New ApplicationException("An error occured when installing distribution and publishing.", ex)
Finally
conn.Disconnect()
End Try
另请参阅
查看和修改分发服务器和发布服务器属性
复制系统存储过程概念
配置分发
复制管理对象概念
为 AlwaysOn 可用性组配置数据复制(SQL Server)