通过 FTP 传递快照

本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 2014 中通过 FTP 传送快照。

限制和局限

  • 快照代理必须对指定的目录具有写权限,而分发代理或合并代理必须具有读权限。 如果使用请求订阅,就必须指定一个共享目录作为通用命名约定 (UNC) 路径,例如 \\ftpserver\home\snapshots。 有关详细信息,请参阅保护快照文件夹

先决条件

  • 若要通过文件传输协议 (FTP) 传输快照文件,必须先配置一个 FTP 服务器。 有关详细信息,请参阅 Microsoft Internet Information Services (IIS) 文档。

安全性

为了帮助改进安全性,建议您在通过 Internet 使用 FTP 快照传递时实现虚拟专用网络 (VPN)。 有关详细信息,请参阅使用 VPN 通过 Internet 发布数据

出于安全考虑,最好不允许匿名登录 FTP 服务器。 快照代理必须对指定的目录具有写权限,而分发代理或合并代理必须具有读权限。 如果使用请求订阅,就必须指定一个共享目录作为通用命名约定 (UNC) 路径,例如 \\ftpserver\home\snapshots。 有关详细信息,请参阅保护快照文件夹

如果可能,请在运行时提示用户输入其凭据。 如果将凭据存储在脚本文件中,则必须确保此文件的安全。

使用 SQL Server Management Studio

配置 FTP 服务器后,在“ 发布属性 <发布> ”对话框中指定此服务器的目录和安全信息。 有关访问此对话框的详细信息,请参阅 View and Modify Publication Properties

指定 FTP 信息

  1. “发布属性 - <发布>”对话框中,从以下页面之一选择“允许订阅服务器使用 FTP 下载快照文件
    • “FTP 快照”页,用于快照和事务发布,以及运行 Microsoft SQL Server 2005 之前版本的发布服务器的合并发布。
    • FTP 快照和 Internet 页,用于从运行 SQL Server 2005 或更高版本的发布服务器合并发布。
  2. “FTP 服务器名称”“端口号”“从 FTP 根文件夹开始的路径”“登录名”“密码” 指定值。
    例如,如果 FTP 服务器根目录为 \\ftpserver\home,并且希望快照存储在 \\ftpserver\home\snapshots 中,请为 FTP 根文件夹中的 Path 属性指定 \snapshots\ftp, (复制在创建快照文件时将“ftp”追加到快照文件夹路径) 。
  3. 指定快照代理应将快照文件写入在步骤 2 中指定的目录。 例如,若要让快照代理将快照文件写入 \\ftpserver\home\snapshots\ftp,必须在下面两个位置之一指定路径 \\ftpserver\home\snapshots:
    • 与发布关联的分发服务器的默认快照位置。
      有关指定默认快照位置的详细信息,请参阅指定默认快照位置
    • 发布的备用快照文件夹位置。 如果压缩快照,则需要指定备用位置。
      在“发布属性 - <>发布”对话框的“快照”页上的“将文件放入以下文件夹”文本框中输入路径。
  4. 单击 “确定”

“使用 Transact-SQL”

通过使用复制存储过程,可以按编程方式设置在 FTP 服务器上提供快照文件的选项以及修改这些 FTP 设置。 所用的过程由发布的类型决定。 FTP 快照传递仅可同请求订阅一起使用。

为快照发布或事务发布启用 FTP 快照传递

  1. 在发布服务器上,对发布数据库执行 sp_addpublication将 @publication、@enabled_for_internet的值true指定为 ,并为以下参数指定适当的值:

    • @ftp_address - 用于传递快照的 FTP 服务器的地址。
    • (可选) @ftp_port - FTP 服务器所使用的端口。
    • (可选) @ftp_subdirectory - 分配给 FTP 登录名的默认 FTP 目录的子目录。 例如,如果 FTP 服务器根目录为 \\ftpserver\home,并且希望快照存储在 \\ftpserver\home\snapshots 中,请指定 \snapshots\ftp for @ftp_subdirectory, (复制在创建快照文件时将“ftp”追加到快照文件夹路径) 。
    • (可选) @ftp_login - 连接到 FTP 服务器时使用的登录帐户。
    • (可选) @ftp_password - FTP 登录名的密码。

    此操作将创建一个使用 FTP 的发布。 有关详细信息,请参阅 Create a Publication

为合并发布启用 FTP 快照传递

  1. 在发布服务器上,对发布数据库执行 sp_addmergepublication将 @publication、@enabled_for_internet的值true指定为 ,为以下参数指定适当的值:

    • @ftp_address - 用于传递快照的 FTP 服务器的地址。
    • (可选) @ftp_port - FTP 服务器所使用的端口。
    • (可选) @ftp_subdirectory - 分配给 FTP 登录名的默认 FTP 目录的子目录。 例如,如果 FTP 服务器根目录为 \\ftpserver\home,并且希望快照存储在 \\ftpserver\home\snapshots 中,请指定 \snapshots\ftp for @ftp_subdirectory, (复制在创建快照文件时将“ftp”追加到快照文件夹路径) 。
    • (可选) @ftp_login - 连接到 FTP 服务器时使用的登录帐户。
    • (可选) @ftp_password - FTP 登录名的密码。

    此操作将创建一个使用 FTP 的发布。 有关详细信息,请参阅 Create a Publication

创建对使用 FTP 快照传递的快照发布或事务发布的请求订阅

  1. 在订阅服务器上,对订阅数据库执行 sp_addpullsubscription。 指定 @publisher@publication

    • 在订阅服务器上,对订阅数据库执行 sp_addpullsubscription_agent指定@publisher@publisher_db@publication、订阅服务器上运行分发代理用于@job_login@job_password的 Microsoft Windows 凭据,并为@use_ftp指定值true
  2. 在发布服务器上,对发布数据库执行 sp_addsubscription 以注册请求订阅。 有关详细信息,请参阅 创建请求订阅

创建对使用 FTP 快照传递的合并发布的请求订阅

  1. 在订阅服务器上,对订阅数据库执行 sp_addmergepullsubscription。 指定 @publisher@publication
  2. 在订阅服务器上,对订阅数据库执行 sp_addmergepullsubscription_agent为@job_login和@job_password指定@publisher、@publisher_db、@publication、订阅服务器上运行分发代理的 Windows 凭据,并将true指定为 @use_ftp
  3. 在发布服务器上,对发布数据库执行 sp_addmergesubscription 以注册请求订阅。 有关详细信息,请参阅 创建请求订阅

为快照发布或事务发布更改一个或多个 FTP 快照传递设置

  1. 在发布服务器上,对发布数据库执行 sp_changepublication。 将下列值之一指定给 @property ,将该设置的新值指定给 @value

    • ftp_address - 用于传递快照的 FTP 服务器的地址。
    • ftp_port - FTP 服务器所使用的端口。
    • ftp_subdirectory - 用于 FTP 快照的默认 FTP 目录的子目录。
    • ftp_login - 用于连接到 FTP 服务器的登录名。
    • ftp_password - FTP 登录名的密码。
  2. (可选)对更改的每个 FTP 设置重复步骤 1。

  3. (可选)若要禁用 FTP 快照传递,请在发布服务器上对发布数据库执行 sp_changepublication 。 将 值 enabled_for_internet 指定为 @property ,将 值 false 指定为 @value

为合并发布更改 FTP 快照传递的设置

  1. 在发布服务器上,对发布数据库执行 sp_changemergepublication。 将下列值之一指定给 @property ,将该设置的新值指定给 @value

    • ftp_address - 用于传递快照的 FTP 服务器的地址。
    • ftp_port - FTP 服务器所使用的端口。
    • ftp_subdirectory - 用于 FTP 快照的默认 FTP 目录的子目录。
    • ftp_login - 用于连接到 FTP 服务器的登录名。
    • ftp_password - FTP 登录名的密码。
  2. (可选)对更改的每个 FTP 设置重复步骤 1。

  3. (可选)若要禁用 FTP 快照传递,请在发布服务器上对发布数据库执行 sp_changemergepublication 。 将 值 enabled_for_internet 指定为 @property ,将 值 false 指定为 @value

示例 (Transact-SQL)

下面的示例创建一个合并发布,该发布允许订阅服务器通过使用 FTP 访问快照数据。 访问 FTP 共享区时,订阅服务器应使用安全的 VPN 连接。 sqlcmd 脚本变量用于提供登录名和密码值。 有关详细信息,请参阅将 sqlcmd 与脚本变量结合使用

-- 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".

-- Declarations for adding a merge publication.
DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @ftp_server AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
DECLARE @ftp_login AS sysname;
DECLARE @ftp_password AS sysname;
DECLARE @ftp_directory AS sysname;
DECLARE @snapshot_folder AS sysname;
DECLARE @article AS sysname;
DECLARE @owner AS sysname;
SET @publicationDB = N'AdventureWorks'; 
SET @publication = N'AdvWorksSalesOfferMergeFtp'; 
SET @ftp_server = $(Server);
SET @login = $(Login);
SET @password = $(Password);
SET @ftp_login = $(FtpLogin);
SET @ftp_password = $(FtpPassword);
SET @ftp_directory = N'\snapshots\ftp';
-- The snapshot folder is the root FTP folder on the server 
-- with the \snapshot subdirectory.
SET @snapshot_folder = $(AlternateFolder);
SET @article = N'SpecialOffer'; 
SET @owner = N'Sales' 

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

-- Create a new merge publication, enabling FTP snapshot delivery. 
-- Specify the publication compatibility level or it will default to 
-- SQL Server 2000.
USE [AdventureWorks]
EXEC sp_addmergepublication 
-- Specify the required parameters.
    @publication = @publication,
    @publication_compatibility_level = N'90RTM',
    @enabled_for_internet = N'true',
    @snapshot_in_defaultfolder = N'true',
    @alt_snapshot_folder = @snapshot_folder,
    @ftp_address = @ftp_server,
    @ftp_subdirectory = @ftp_directory,
    @ftp_login = @ftp_login,
    @ftp_password = @ftp_password;

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

-- Add an unfiltered article for the Customer table.
EXEC sp_addmergearticle 
    @publication = @publication, 
    @article = @article, 
    @source_object = @article, 
    @type = N'table', 
    @source_owner = @owner, 
    @destination_owner = @owner, 
    @column_tracking = N'true'; 

-- Start the snapshot job for the publication.
EXEC sp_startpublication_snapshot 
    @publication = @publication;
GO

下面的示例创建一个对合并发布的订阅,在该订阅中订阅服务器通过使用 FTP 来获取快照。 访问 FTP 共享区时,订阅服务器应使用安全的 VPN 连接。 sqlcmd 脚本变量用于提供登录名和密码值。 有关详细信息,请参阅将 sqlcmd 与脚本变量结合使用

-- 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".

-- Execute this batch at the Publisher.
DECLARE @publication AS sysname;
DECLARE @subscriber AS sysname;
DECLARE @subscriptionDB AS sysname;
SET @publication = N'AdvWorksSalesOfferMergeFtp';
SET @subscriber = $(SubServer);
SET @subscriptionDB = N'AdventureWorksReplica';

-- At the Publisher, register the subscription, using the defaults.
EXEC sp_addmergesubscription 
    @publication = @publication, 
    @subscriber = @subscriber, 
    @subscriber_db = @subscriptionDB, 
    @subscription_type = N'pull', 
    @subscriber_type = N'local', 
    @subscription_priority = 0, 
    @sync_type = N'Automatic';
GO
-- 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".

-- Execute this batch at the Subscriber.
DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @publisher AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
DECLARE @subscriber AS sysname;
DECLARE @subscriptionDB AS sysname;
SET @publicationDB = N'AdventureWorks'; 
SET @publication = N'AdvWorksSalesOfferMergeFtp'; 
SET @publisher = $(PubServer);
SET @login = $(Login);
SET @password = $(Password);
SET @subscriber = $(SubServer);
SET @subscriptionDB = N'AdventureWorksReplica';

EXEC sp_addmergepullsubscription 
    @publisher = @publisher, 
    @publication = @publication, 
    @publisher_db = @publicationDB, 
    @subscriber_type = N'Local', 
    @subscription_priority = 0, 
    @sync_type = N'Automatic';

exec sp_addmergepullsubscription_agent 
    @publisher = @publisher, 
    @publisher_db = @publicationDB, 
    @publication = @publication, 
    @distributor = @publisher, 
    @distributor_security_mode = 1, 
    @use_ftp = N'true', 
    @job_login = @login, 
    @job_password = @password, 
    @publisher_security_mode = 1, 
    @use_web_sync = 0;
GO

另请参阅

Replication System Stored Procedures Concepts
通过 FTP 传输快照
更改发布和项目属性
使用快照初始化订阅