13

SQL ServerのFILESTREAM属性を調べて、ファイルを格納しています。ファイルをハードドライブに保存し、ファイルポインタ/パス情報をDBに保存することを理解しています。また、プロセスでトランザクションの一貫性を維持します。

また、FILESTREAM属性には、「FILESTREAMデータはローカルディスクボリュームにのみ保存できる」という制限があるようです。

Webアプリにそれぞれ1〜2 MBの画像を200,000枚保存すると予想される場合、画像を保存するには約200GBのハードドライブスペースが必要になります。FILESTREAMでは、制限に従ってすべてのデータをローカルディスクにのみ保存する必要があるため、ストレージ要件が非常に大きくなるため、1台のハードドライブに数百万のファイルを保存することは不可能です。

制限についての私の理解は正しいですか、それともここで何かが欠けていますか?

この制限が正しければ、代わりにそれをプレーンblobとしてdbに格納し、ストレージ要件を増やすためにDBをクラスター化します。これは、FILESTREAMでは不可能なようです。

あなたの考えを共有してください!

更新:
FILESTREAMに関するその他の質問:-

  1. データコンテナが破損した場合のデータリカバリの処理方法は?
  2. ファイルシステムデータなしでDBをバックアップすることはできますか?[データがSANにあり、移動する必要がないと仮定します]
  3. DBをバックアップまたは復元し、[SANにマップする]ファイルグループパス情報を再マップしたいと思います。これは可能ですか?
4

4 に答える 4

19

FILESTREAMは、SMBネットワークストレージではなく、実際にはローカルストレージを必要としません。iSCSIまたはファイバーチャネルSANは、FILESTREAMデータを格納するために正常に機能します。テーブルごとに複数のファイルストリームファイルグループを作成して、基本的にデータを分割することもできます。SQL Server 2008を厳密にターゲットにしている場合、大きなバイナリデータにファイルストリームを使用しない理由はほとんどありません。ここに、ファイルストリームのパーティショニングについて説明しているMicrosoftホワイトペーパーがあります

于 2009-09-14T03:47:24.380 に答える
4

ローカルディスクボリュームの要件について

文字通りローカルを取りすぎないでください。MSSQLがFILESTREAMデータに関連付けられたファイルグループをローカルドライブとして「認識する」ことは確かに要件ですが、このストレージは、WindowsをだましてローカルNTFSディスクであると思わせるNASまたはその他のストレージテクノロジを介して提供されることがよくあります。 iSCSIなどの方法)。これは、あなたが言及したスペース要件のレベルで、エンタープライズアプリケーションに特に当てはまります。

FILESTREAMの使用について...

長所と短所を慎重に比較検討してください。あなたの質問はかなり大きな(MBサイズの)画像(私はある種の論理画像ではなくグラフィック画像を想定しています)に言及しています。これはそれらのかなり原子的な使用を意味します。ファイルサーバーのセットアップには、外部(SQLサーバーへの)管理と同期が必要ですが、これは、SQL Server / Microsoftに対してではなく、自由を維持するために支払う比較的小さなコストのようです。スケーリング/帯域幅の目的で、物事をより簡単に移動できます。

于 2009-09-14T03:49:29.557 に答える
2

クラスタリングにはSANストレージが必要なため、SQLクラスターを使用してもストレージの可用性は向上しません。非クラスター化インスタンスでもFILESTREAMストレージとして使用する1つまたは複数のLUNを作成するだけです。

于 2009-09-14T05:29:21.203 に答える
1

SQLServer2008でのローカルファイルストリームのステップバイステップの実装

SQLサーバーでファイルストリームを構成します。

  1. まず、SQLサーバーの構成管理に移動します。
  2. QLサーバー(SQLEXPRESS)を右クリックし、プロパティを選択します。
  3. [ファイルストリーム]タブを選択し、ファイルストリームを有効にします。

SQLServer2008で次のスクリプトを実行します。

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 に答える