通过 FTP 传递快照

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

本主题内容

  • 开始之前:

    限制和局限

    先决条件

    安全性

  • 通过 FTP 传递快照,使用:

    SQL Server Management Studio

    Transact-SQL

开始之前

限制和局限

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

先决条件

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

安全性

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

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

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

用于“返回首页”链接的箭头图标[Top]

使用 SQL Server Management Studio

配置 FTP 服务器后,请在**“发布属性 - <发布>”**对话框中为这台服务器指定目录和安全信息。 有关访问此对话框的详细信息,请参阅查看和修改发布属性

指定 FTP 信息

  1. 在**“发布属性 - <发布>”对话框中,从下列某一页中选中“允许订阅服务器使用 FTP 下载快照文件”**:

    • **“FTP 快照”**页,用于快照发布和事务发布以及运行 Microsoft SQL Server 2005 之前版本的发布服务器的合并发布。

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

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

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

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

    • 与发布关联的分发服务器的默认快照位置。

      有关指定默认快照位置的详细信息,请参阅指定默认快照位置 (SQL Server Management Studio)

    • 发布的备用快照文件夹位置。 如果压缩快照,则需要指定备用位置。

      在**“发布属性 - <发布>”对话框的快照页上的“将文件放入下列文件夹”**文本框中输入路径。 有关备用快照文件夹位置的详细信息,请参阅备用快照文件夹位置

  4. 单击“确定”。

用于“返回首页”链接的箭头图标[Top]

使用 Transact-SQL

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

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

  • 在发布服务器上,对发布数据库执行 sp_addpublication。 指定 @publication,将值 true 指定给 @enabled_for_internet,并将相应值指定给以下参数:

    • @ftp_address - 用于传递快照的 FTP 服务器的地址。

    • (可选)@ftp_port - FTP 服务器所使用的端口。

    • (可选)@ftp_subdirectory - 分配给 FTP 登录名的默认 FTP 目录的子目录。 例如,如果 FTP 服务器根目录是 \\ftpserver\home 并要将快照存储在 \\ftpserver\home\snapshots 下,则将 \snapshots\ftp 指定给 @ftp_subdirectory(复制在创建快照文件时将“ftp”追加到快照文件夹路径中)。

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

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

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

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

  • 在发布服务器上,对发布数据库执行 sp_addmergepublication。 指定 @publication,将值 true 指定给 @enabled_for_internet,并将相应的值指定给以下参数:

    • @ftp_address - 用于传递快照的 FTP 服务器的地址。

    • (可选)@ftp_port - FTP 服务器所使用的端口。

    • (可选)@ftp_subdirectory - 分配给 FTP 登录名的默认 FTP 目录的子目录。 例如,如果 FTP 服务器根目录是 \\ftpserver\home 并要将快照存储在 \\ftpserver\home\snapshots 下,则将 \snapshots\ftp 指定给 @ftp_subdirectory(复制在创建快照文件时将“ftp”追加到快照文件夹路径中)。

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

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

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

创建对使用 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

用于“返回首页”链接的箭头图标[Top]

请参阅

概念

复制系统存储过程概念

通过 FTP 传输快照

更改发布和项目属性

使用快照初始化订阅