13

我正在查看 SQL Server 中的 FILESTREAM 属性以在其中存储文件。我知道它将文件存储在硬盘上并将文件指针/路径信息存储在数据库中。此外,保持过程中的事务一致性。

FILESTREAM 属性似乎也有一个限制“FILESTREAM 数据只能存储在本地磁盘卷上”。

如果我预计我的网络应用程序将存储 200,000 张 1-2mb 的图像,我将需要大约 200gb 的硬盘空间来存储图像。由于 FILESTREAM 根据限制要求所有数据仅存储在本地磁盘上,因此不可能在单个硬盘驱动器上存储数百万个文件,因为存储需求将非常大。

我对限制的理解是正确的还是我在这里遗漏了什么?

如果这个限制是正确的,我会改为将它作为普通 blob 存储在 db 中,并将我的 DB 集群以增加存储需求,这对于 FILESTREAM 似乎是不可能的。

请分享你的想法!

更新:
关于 FILESTREAM 的更多问题:-

  1. 在数据容器损坏的情况下如何处理数据恢复?
  2. 我们可以只备份没有文件系统数据的数据库吗?[假设数据在 SAN 中,无需移动]
  3. 我想备份或恢复数据库并重新映射文​​件组路径信息[映射到 SAN]。这可能吗?
4

4 回答 4

19

FILESTREAM 实际上不需要本地存储,只是不需要 SMB 网络存储。iSCSI 或光纤通道 SAN 可以很好地存储 FILESTREAM 数据。每个表还可以有多个文件流文件组,本质上是对数据进行分区。如果您严格针对 sql server 2008,则几乎没有理由不将文件流用于大型二进制数据。此处有描述文件流分区的 Microsoft 白皮书。

于 2009-09-14T03:47:24.380 回答
4

关于本地磁盘卷的要求

不要太从字面上理解本地。虽然确实要求 MSSQL 应该将与 FILESTREAM 数据关联的文件组“视为”本地驱动器,但此存储通常通过 NAS 或其他存储技术提供,这些技术会诱使 Windows 认为这些是本地 NTFS 磁盘(通过iSCSI 等方式)。对于您提到的空间需求级别的企业应用程序尤其如此。

完全使用 FILESTREAM...

一定要仔细权衡利弊。您的问题提到了相当大的(MB 大小)图像(我假设是图形图像,而不是各种逻辑图像),这意味着对它们的相当原子使用。文件服务器设置需要外部(到 SQL 服务器)管理和同步,但这似乎是一个相对较小的成本来保持你的自由,而不是相对于 SQL Server / Microsoft,但你的能力为了扩展/带宽目的,更容易移动东西。

于 2009-09-14T03:49:29.557 回答
2

使用 SQL 集群不会为您提供任何额外的存储可用性,因为集群需要 SAN 存储。您也可以简单地创建一个或多个 LUN 以用作非集群实例上的 FILESTREAM 存储。

于 2009-09-14T05:29:21.203 回答
1

在sql server 2008中逐步实现本地文件流

在 sql server 中配置文件流:

  1. 首先进入 SQL Server 配置管理。
  2. 右键单击 QL 服务器(SQLEXPRESS)并选择属性。
  3. 选择文件流选项卡并启用文件流。

在 SQL Server 2008 中执行以下脚本:

EXEC sp_configure filestream_access_level, 2 RECONFIGURE

为文件流创建数据库:

CREATE DATABASE MyFsDb 
ON
PRIMARY ( NAME = MyFsDat,
    FILENAME = 'c:\data\myfsdat.mdf'),
FILEGROUP MyFsGroup CONTAINS FILESTREAM( NAME = MyFs,
    FILENAME = 'c:\data\myfs1')
LOG ON  ( NAME = MyFsLog,
    FILENAME = 'c:\data\myfslog.ldf')
GO

创建表:

CREATE TABLE MyFsTable
(
  fId INT IDENTITY PRIMARY KEY,
  fData VARBINARY(MAX) FILESTREAM  NULL,
  fName NVARCHAR(300),
  RowGuid UNIQUEIDENTIFIER  NOT NULL  ROWGUIDCOL UNIQUE DEFAULT NEWID()
)

在表中添加数据的过程:

ALTER PROCEDURE [dbo].[uspAddFile]

@fData VARBINARY(Max),
@ fName varchar(50),

AS
BEGIN
INSERT INTO MyFsTable (fData, fName, RowGuid) VALUES (@Item, @ItemName, DEFAULT)
END

让我们使用 C# 从前端的表中添加一些数据:

Public void AddFile()
{
string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["connectionstring"].ToString();
                con = new System.Data.SqlClient.SqlConnection(connectionString);
                cmd = new System.Data.SqlClient.SqlCommand("uspAddFile", con);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@fData", SqlDbType.Binary).Value = GetByte(TempPath);
                cmd.Parameters.Add("@fName", SqlDbType.VarChar).Value = tempFile;
                con.Open();
                result = cmd.ExecuteNonQuery();
                con.Close();
}
于 2014-08-27T17:48:56.443 回答