将 FILESTREAM 与其他 SQL Server 功能配合使用

由于 FILESTREAM 数据在文件系统中,因此本主题提供了将 FILESTREAM 与 SQL Server 中的以下功能一起使用时的一些注意事项、指南和限制:

  • 数据库快照

  • 复制

  • 日志传送

  • 数据库镜像

  • 全文

  • 故障转移群集

  • SQL Server Express

数据库快照

SQL Server 不支持对 FILESTREAM 文件组使用数据库快照功能。如果 CREATE DATABASE ON 子句中包含 FILESTREAM 文件组,则相应语句将会失败并会引发错误。

当您使用 FILESTREAM 时,您可以创建标准(非 FILESTREAM)文件组的数据库快照。这些数据库快照的 FILESTREAM 文件组被标记为脱机。

对数据库快照中的 FILESTREAM 表执行的 SELECT 语句不能包含 FILESTREAM 列;否则将返回以下错误消息:

由于数据移动,无法继续以 NOLOCK 方式扫描。

复制

可以将发布服务器上启用了 FILESTREAM 属性的 varbinary(max) 列复制到订阅服务器,复制时可以带 FILESTREAM 属性,也可以不带。若要指定复制列的方式,可以使用**“项目属性 - <项目>”**对话框,也可以使用 sp_addarticlesp_addmergearticle@schema\_option 参数。有关如何设置架构选项的详细信息,请参阅如何指定架构选项 (SQL Server Management Studio)如何指定架构选项(复制 Transact-SQL 编程)。复制到不具有 FILESTREAM 属性的 varbinary(max) 列的数据不能超过该数据类型的 2 GB 大小限制;否则,将产生运行时错误。我们建议,如果您不是将数据复制到 SQL Server 2005,请复制 FILESTREAM 属性。不论指定的架构选项为何,均不支持将包含 FILESTREAM 列的表复制到 SQL Server 2000 订阅服务器。有关如何将数据复制到 SQL Server 早期版本的详细信息,请参阅在复制拓扑中使用 SQL Server 的多个版本

注意注意

从 SQL Server 2008 复制到 SQL Server 2005 订阅服务器的大数据值最多不得超过 256 MB。有关详细信息,请参阅最大容量规范

事务复制的注意事项

如果您使用为事务复制发布的表中的 FILESTREAM 列,请注意以下事项:

  • 只要表中的列具有 FILESTREAM 属性,就不能将 database snapshot 或 database snapshot character 的值用于 sp_addpublication@sync\_method 属性。

  • max text repl size 选项用于指定可以插入到为复制发布的列中的最大数据量。此选项可用来控制复制的 FILESTREAM 数据的大小。有关详细信息,请参阅 max text repl size 选项

  • 如果您指定了用于复制 FILESTREAM 属性的架构选项,但您筛选出了 FILESTREAM 所需的 uniqueidentifier 列或指定不复制对该列的 UNIQUE 约束,则复制操作不复制 FILESTREAM 属性。该列将只作为 varbinary(max) 列复制。

合并复制的注意事项

如果您使用为合并复制发布的表中的 FILESTREAM 列,请注意以下事项:

  • 合并复制和 FILESTREAM 都需要一个数据类型为 uniqueidentifier 的列来标识表中的每一行。如果相应的表中没有这样的列,合并复制会自动添加一列。合并复制要求该列具有 ROWGUIDCOL 属性集和默认值 NEWID() 或 NEWSEQUENTIALID()。除这些要求外,FILESTREAM 还要求为该列定义一个 UNIQUE 约束。这些要求将产生以下结果:

    • 如果您向已经为合并复制发布的表添加 FILESTREAM 列,请确保 uniqueidentifier 列具有 UNIQUE 约束。如果该列不具有 UNIQUE 约束,请向发布数据库中的该表添加一个命名约束。默认情况下,合并复制将发布此项架构更改,此更改将应用于每个订阅数据库。有关架构更改的详细信息,请参阅对发布数据库进行架构更改

      如果您已按照说明手动添加了 UNIQUE 约束,并且要删除合并复制,则您必须先删除 UNIQUE 约束;否则,复制删除操作将失败。

    • 默认情况下,合并复制使用 NEWSEQUENTIALID(),因为与 NEWID() 相比,它可以提供更高的性能。如果您要向将为合并复制发布的表添加 uniqueidentifier 列,请指定 NEWSEQUENTIALID() 作为默认值。

  • 合并复制包括为复制大型对象类型而进行的优化。这种优化由 sp_addmergearticle@stream\_blob\_columns 参数控制。如果您设置了用于复制 FILESTREAM 属性的架构选项,则 @stream\_blob\_columns 参数值将设置为 true。通过使用 sp_changemergearticle,可以重写这种优化。使用此存储过程可以将 @stream\_blob\_columns 设置为 false。如果您要将 FILESTREAM 列添加到已经为合并复制发布的表中,建议您使用 sp_changemergearticle 将该选项设置为 true。

  • 如果 FILESTREAM 列中的数据大小超过 2 GB,则在创建项目后为 FILESTREAM 启用架构选项会导致复制失败,且复制过程中会发生冲突。如果您预计这种情况会发生,建议您删除表项目,然后重新创建它,并在创建时间启用相应的 FILESTREAM 架构选项。

  • 合并复制可以使用 Web 同步通过 HTTPS 连接同步 FILESTREAM 数据。此数据不能超过针对 Web 同步的 50 MB 大小限制;否则,将产生运行时错误。

日志传送

日志传送支持 FILESTREAM。主服务器和辅助服务器运行的都必须是 SQL Server 2008 或更高版本,并且必须启用 FILESTREAM。

数据库镜像

数据库镜像不支持 FILESTREAM。不能在主体服务器上创建 FILESTREAM 文件组。不能为包含 FILESTREAM 文件组的数据库配置数据库镜像。

全文索引

全文索引功能处理 FILESTREAM 列的方式与其处理 varbinary(max) 列的方式相同。FILESTREAM 表必须有一列包含每个 FILESTREAM BLOB 的文件扩展名。有关详细信息,请参阅查询 varbinary(max) 和 xml 列(全文搜索)全文搜索筛选器全文索引和查询过程sys.fulltext_document_types (Transact-SQL)

全文引擎会对 FILESTREAM BLOB 的内容进行索引。对诸如图像之类的文件进行索引可能没有用。更新 FILESTREAM BLOB 时,会重新对其进行索引。

故障转移群集

对于故障转移群集,必须将 FILESTREAM 文件组放在共享磁盘上。必须在群集中将承载 FILESTREAM 实例的每个节点上启用 FILESTREAM。有关详细信息,请参阅如何在故障转移群集中设置 FILESTREAM

SQL Server Express

SQL Server Express 支持 FILESTREAM。4 GB 的数据库大小限制不包括 FILESTREAM 数据容器。

请参阅

其他资源