首页 文章

SQL Server FILESTREAM限制

提问于
浏览
13

我正在查看SQL Server中的FILESTREAM属性来存储文件 . 据我所知,它将文件存储在硬盘上,并将文件指针/路径信息存储在DB中 . 此外,维护流程中的事务一致性 .

对于FILESTREAM属性,似乎还存在“FILESTREAM数据只能存储在本地磁盘卷上”的限制 .

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

我对限制的理解是正确的还是我错过了什么?

如果这个限制是正确的,我会将其作为普通blob存储在db中,并将我的数据库集群存储以增加存储要求,而这似乎不可能使用FILESTREAM .

请分享你的想法!

UPDATED:
关于FILESTREAM的几个问题: -

  • 如何在数据容器损坏的情况下处理数据恢复?

  • 我们可以在没有文件系统数据的情况下备份数据库吗? [假设数据在SAN中,不需要移动]

  • 我想备份或恢复数据库,只重新映射[映射到SAN]的文件组路径信息 . 这可能吗?

4 回答

  • 4

    FILESTREAM实际上不需要本地存储,只需要SMB网络存储 . iSCSI或光纤通道SAN可以正常存储FILESTREAM数据 . 每个表还可以有多个文件流文件组,实质上是对数据进行分区 . 如果您严格定位sql server 2008,则没有理由不将文件流用于大型二进制数据 . 有一篇Microsoft白皮书描述了文件流分区here .

  • 19

    On the local disk volume requirement

    不要太过于字面意思 . 虽然确实要求MSSQL将与FILESTREAM数据相关联的文件组作为本地驱动器,但这种存储通常是通过NAS或其他存储技术提供的,这些技术会让Windows认为这些是本地NTFS磁盘(通过iSCSI等) . 对于企业应用程序尤其如此,您提到的空间要求水平 .

    On using FILESTREAM at all...

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

  • 2

    Step By Step implementation of local filestream in sql server 2008

    在sql server中配置文件流:

    • 首先转到SQL Server配置管理 .

    • 右键单击QL服务器(SQLEXPRESS)并选择属性 .

    • 选择文件流选项卡并启用文件流 .

    在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();
    }
    
  • 1

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

相关问题