通过 FTP 传递快照

适用于SQL Server

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

默认情况下,快照存储在定义为通用命名约定 (UNC) 共享的文件夹中。 复制还允许指定用文件传输协议 (FTP) 共享取代 UNC 共享。 若要使用 FTP,必须先配置 FTP 服务器,然后配置要使用 FTP 的发布和一个或多个订阅。 有关如何配置 FTP 服务器的详细信息,请参阅 Internet 信息服务 (IIS) 文档。 如果为发布指定了 FTP 信息,则对此发布的订阅将默认使用 FTP。 仅当运行 IIS 的计算机通过防火墙与分发服务器相隔离时,才会使用 FTP 进行 Web 同步。 在这种情况下,FTP 可用于传输来自分发服务器和运行 IIS 的计算机的快照。 (快照始终使用 HTTPS 传输到订阅服务器。)

重要

建议使用 Microsoft Windows 身份验证和 UNC 共享而不要使用 FTP 共享,因为必须存储 FTP 密码,并且密码以纯文本格式从订阅服务器或运行 IIS 的计算机(使用 Web 同步时)发送到 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 (9.x) 之前版本的发布服务器的快照和事务发布以及合并发布。

    • “FTP 快照和 Internet”页面,用于运行 SQL Server 2005 (9.x) 或更高版本的发布服务器的合并发布。

  2. “FTP 服务器名称”“端口号”“从 FTP 根文件夹开始的路径”“登录名”“密码”指定值。

    例如,如果 FTP 服务器的根目录是 \\ftpserver\home,但想将快照存储在 \\ftpserver\home\snapshots,请为“FTP 根文件夹下的路径”属性指定 \snapshots\ftp(复制在创建快照文件时将“ftp”追加到快照文件夹路径)。

  3. 指定快照代理应将快照文件写入在步骤 2 中指定的目录。 例如,要让快照代理将快照文件写入 \\ftpserver\home\snapshots\ftp,必须在下面两个地点之一指定路径 \\ftpserver\home\snapshots:

    • 与发布关联的分发服务器的默认快照位置。
    • 发布的备用快照文件夹位置。 如果压缩快照,则需要指定备用位置。

有关修改快照文件夹位置属性的详细信息,请参阅快照选项

  1. 选择“确定”

“使用 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,请为 @ftp_subdirectory 指定 \snapshots\ftp(复制在创建快照文件时将“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,请为 @ftp_subdirectory 指定 \snapshots\ftp(复制在创建快照文件时将“ftp”追加到快照文件夹路径)。

    • (可选)@ftp_login - 连接到 FTP 服务器时使用的登录帐户。

    • (可选)@ftp_password - FTP 登录名的密码。

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

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

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

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

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

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

  2. 在订阅服务器上,对订阅数据库执行 sp_addmergepullsubscription_agent。 指定 @publisher@publisher_db@publication,将用于运行订阅服务器上的分发代理的 Windows 凭据指定给 @job_login@job_password,并将值 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