如何创建初始快照(复制 Transact-SQL 编程)

可以通过创建并运行快照代理作业或从批处理文件运行快照代理可执行文件,以编程方式创建初始快照。 初始快照生成后,该快照将在订阅首次同步时传输并应用到订阅服务器。 如果您在命令提示符处或通过批处理文件运行快照代理,则只要现有快照变为无效,您就需要重新运行此代理。

使用参数化筛选器的合并发布需要由两部分组成的快照。 有关详细信息,请参阅如何为带有参数化筛选器的合并发布创建快照(复制 Transact-SQL 编程)

安全说明安全说明

如果可能,请在运行时提示用户输入安全凭据。 如果必须在脚本文件中存储凭据,则必须保护文件以防止未经授权的访问。

创建并运行快照代理作业以生成初始快照

  1. 创建快照发布、事务发布或合并发布。 有关详细信息,请参阅如何创建发布(复制 Transact-SQL 编程)

  2. 执行 sp_addpublication_snapshot (Transact-SQL)。 指定 @publication 以及下列参数:

    • @job_login,用于指定快照代理在分发服务器上运行时所用的 Windows 身份验证凭据。

    • @job_password,为提供的 Windows 凭据的密码。

    • (可选)如果代理在连接到发布服务器时将使用 SQL Server 身份验证,则将 @publisher_security_mode 的值指定为 0。 在这种情况下,您还必须为 @publisher_login@publisher_password 指定 SQL Server 身份验证的登录信息。

    • (可选)快照代理作业的同步计划。 有关详细信息,请参阅如何指定同步计划(复制 Transact-SQL 编程)

    安全说明安全说明

     使用远程分发服务器配置发布服务器时,为所有参数提供的值(包括 job_login 和 job_password)都会以纯文本方式发送到该分发服务器。 在执行此存储过程之前,应该对发布服务器及其远程分发服务器之间的连接进行加密。 有关详细信息,请参阅加密与 SQL Server 的连接

  3. 向发布添加项目。 有关详细信息,请参阅如何定义项目(复制 Transact-SQL 编程)

  4. 在发布服务器上,对发布数据库执行 sp_startpublication_snapshot (Transact-SQL),并指定步骤 1 中 @publication 的值。

运行快照代理以生成初始快照

  1. 创建快照发布、事务发布或合并发布。 有关详细信息,请参阅如何创建发布(复制 Transact-SQL 编程)

  2. 向发布添加项目。 有关详细信息,请参阅如何定义项目(复制 Transact-SQL 编程)

  3. 在命令提示符处或批处理文件中,通过运行 snapshot.exe 并指定下列命令行参数,启动复制快照代理

    • -Publication

    • -Publisher

    • -Distributor

    • -PublisherDB

    • -ReplicationType

    如果您使用的是 SQL Server 身份验证,则还必须指定下列参数:

    • -DistributorLogin

    • -DistributorPassword

    • -DistributorSecurityMode = 0

    • -PublisherLogin

    • -PublisherPassword

    • -PublisherSecurityMode = 0

示例

此示例演示如何创建事务发布,并为新的发布添加快照代理作业(使用 sqlcmd 脚本变量)。 此示例还启动该作业。

-- To avoid storing the login and password in the script file, the values 
-- are passed into SQLCMD as scripting variables. 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".

DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks'; --publication database
SET @publication = N'AdvWorksCustomerTran'; -- transactional publication name
SET @login = $(Login);
SET @password = $(Password);

USE [AdventureWorks]

-- Enable transactional and snapshot replication on the publication database.
EXEC sp_replicationdboption 
  @dbname = @publicationDB, 
  @optname = N'publish',
  @value = N'true';

-- Execute sp_addlogreader_agent to create the agent job. 
EXEC sp_addlogreader_agent 
  @job_login = @login, 
  @job_password = @password,
  -- Explicitly specify the security mode used when connecting to the Publisher.
  @publisher_security_mode = 1;

-- Create new transactional publication, using the defaults. 
USE [AdventureWorks]
EXEC sp_addpublication 
  @publication = @publication, 
  @description = N'transactional publication';

-- Create a new snapshot job for the publication, using the defaults.
EXEC sp_addpublication_snapshot 
  @publication = @publication,
  @job_login = @login,
  @job_password = @password;

-- Start the Snapshot Agent job.
EXEC sp_startpublication_snapshot @publication = @publication;
GO

此示例创建一个合并发布,并为此发布添加一个快照代理作业(使用 sqlcmd 变量)。 此示例还启动该作业。

-- To avoid storing the login and password in the script file, the value 
-- is passed into SQLCMD as a scripting variable. 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".

DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks'; 
SET @publication = N'AdvWorksSalesOrdersMerge'; 
SET @login = $(Login);
SET @password = $(Password);

-- Enable merge replication on the publication database.
USE master
EXEC sp_replicationdboption 
  @dbname = @publicationDB, 
  @optname=N'merge publish',
  @value = N'true';

-- Create new merge publication, using the defaults. 
USE [AdventureWorks]
EXEC sp_addmergepublication 
  @publication = @publication, 
  @description = N'Merge publication.';

-- Create a new snapshot job for the publication, using the defaults.
EXEC sp_addpublication_snapshot 
  @publication = @publication,
  @job_login = @login,
  @job_password = @password;

-- Start the Snapshot Agent job.
EXEC sp_startpublication_snapshot @publication = @publication;
GO

以下命令行参数启动快照代理,以为合并发布生成快照。

注意注意

为便于阅读,添加了换行符。 而在批处理文件中,命令必须位于单个行中。

REM -- Declare variables
SET Publisher=%InstanceName%
SET PublicationDB=AdventureWorks 
SET Publication=AdvWorksSalesOrdersMerge 

REM --Start the Snapshot Agent to generate the snapshot for AdvWorksSalesOrdersMerge.
"C:\Program Files\Microsoft SQL Server\100\COM\SNAPSHOT.EXE" -Publication %Publication% 
-Publisher %Publisher% -Distributor %Publisher% -PublisherDB %PublicationDB% 
-ReplicationType 2 -OutputVerboseLevel 1 -DistributorSecurityMode 1