۱۳۸۸/۰۷/۰۴

آشنايي با قابليت FileStream اس كيوال سرور 2008 - قسمت اول


مطلبي چندي قبل در مورد "ذخيره سازي فايل‌ها در ديتابيس يا استفاده از فايل سيستم متداول؟" منتشر گرديد، جهت برشمردن فوايد ذخيره سازي فايل‌ها در ديتابيس (+). اما معايب اين نوع ذخيره سازي بررسي نشدند:

الف) اختصاص يافتن قسمتي از بافر SQL Server به اين امر.
ب) با توجه به قرار گرفتن داده‌هاي BLOB‌ در ديتابيس ، transaction log قابل توجهي توليد خواهد شد. (+)
ج) بيش از 2GB را نمي‌توان در فيلدهايي از نوع varbinary(max) ذخيره كرد.
د) به روز رساني BLOB ها سبب ايجاد fragmentation مي‌شود.

مايكروسافت براي رفع اين مشكلات در SQL Server 2008 قابليت جديدي را ارائه داده است به نام FileStream كه در طي مقالاتي به بررسي آن خواهيم پرداخت.

FILESTREAM موتور ديتابيس اس كيوال سرور را با سيستم فايل NTFS يكپارچه مي‌كند؛ به اين صورت كه داده‌هاي BLOB از نوع varbinary(max) را به صورت فايل بر روي سيستم ذخيره خواهد كرد. سپس با استفاده از دستورات T-SQL مي‌توان اين فايل‌ها را ثبت، حذف، به روز رساني، جستجو و بك آپ گيري كرد. اين قابليت نيز از فيلدهاي varbinary(max) استفاده مي‌كند؛ اما اكنون ويژگي و برچسب FILESTREAM به اين نوع فيلدها الصاق خواهد شد. FILESTREAM data بايد در FILESTREAM filegroups ذخيره شوند. FILESTREAM filegroups در حقيقت همان پوشه‌هاي فايل سيستم مي‌باشند. به آن‌ها data containers نيز گفته مي‌شوند كه مرزي هستند بين ذخيره سازي داده‌ها در فايل سيستم و در ديتابيس.

مزاياي سيستم FileStream چيست؟
الف) سيستم transaction مختص به خود را داشته، به همين جهت سبب رشد غير منطقي حجم فايل transaction log ديتابيس اصلي نمي‌شوند.
ب) هنگام به روز رساني فيلدهايي از اين دست، صرفا ايجاد يا حذف يك فايل مد نظر است؛ بنابراين fragmentation ايجاد شده در اين حالت بسيار كمتر از روش استفاده از فيلدهايي از نوع varbinary(max) مي‌باشد.
ج) استفاده از NT system cache جهت كش كردن اطلاعات كه سبب بالا بردن بازدهي بانك اطلاعاتي خواهد شد.
د) از buffer pool اس كيوال سرور در اين حالت استفاده نشده (مطابق قسمت ج) و اين حافظه جهت امور روزمره‌ي اس كيوال سرور كاملا مهيا خواهد بود.
ه) محدوديت 2GB فيلدهايي از نوع varbinary(max) با توجه به ذخيره سازي اين نوع BLOBs در فايل سيستم، ديگر وجود نخواهد داشت.

چه زماني بهتر است از FileStream استفاده شود؟
الف) فايل‌هايي كه ذخيره مي‌شوند به طور متوسط بيش از يك مگابايت حجم داشته باشند. (براي كمتر از اين مقدار varbinary(max) BLOBs كارآيي بهتري را ارائه مي‌دهند). هر چند اين مرز يك مگابايت مطابق اطلاعات books online است اما تجربيات كاري نشان مي‌دهند كه اين سقف را بايد 256 كيلوبايت درنظر گرفت.
ب) قابليت خواندن سريع اطلاعات فايل‌ها مد نظر باشد (بررسي كارآيي مطابق تصوير زير از MSDN). سيستم NTFS نسبت به SQL Server‌ در خواندن فايل‌هاي حجيم سريعتر عمل مي‌كند.
ج) اگر از يك معماري middle tier در برنامه‌هاي خود در حال استفاده‌ايد.
د) زمانيكه نياز باشد تا اطلاعات relational و non-relational در يك تراكنش مورد استفاده قرار گيرند.



نكاتي را كه بايد هنگام ذخيره سازي اطلاعات در FileStream در نظر داشت
الف) هنگامي كه يك جدول حاوي فيلدي از نوع FileStream مي‌باشد، بايد داراي فيلد ID منحصربفرد نيز باشد.
ب) data containers ايي كه پيش از اين در مورد آن‌ها صحبت شد، نبايد تو در تو باشند.
ج) FILESTREAM filegroups بر روي درايوهاي فشرده شده نيز مي‌توانند قرار داشته باشند.

FileStream از ديدگاه امنيت
امنيت داده‌هاي FileStream در اس كيوال سرور دقيقا همانند امنيت ساير اطلاعات ذخيره شده در ديتابيس است (دسترسي در حد جدول و يا فيلد). اگر كاربري دسترسي به فيلد FileStream در يك جدول داشته باشد، مي‌تواند آن‌ فايل را گشوده و استفاده كند. رمزنگاري بر روي اين ستون‌ها پشتيباني نمي‌شود. تنها اكانتي كه اس كيوال سرور تحت آن در حال اجرا است دسترسي به FILESTREAM container دارد. همچنين توصيه شده است كه به هيچ اكانت ديگري اين دسترسي داده نشود. زمانيكه يك ديتابيس آغاز و مشغول به كار مي‌شود، اس كيوال سرور دسترسي به FILESTREAM data container را محدود خواهد كرد و دسترسي به اين اطلاعات تنها از طريق دستورات T-SQL و يا OpenSqlFilestream API ميسر خواهد بود. بديهي است زمانيكه اس كيوال سرور متوقف شود، اين اطلاعات بدون هيچگونه محدوديتي قابل دسترسي بوده و تنها محدوديت‌هاي سيستمي به آن‌ها اعمال خواهند شد (كه اين مورد بايد مد نظر باشد).

نگهداري FileStream
FileStream به صورت فيلدهاي varbinary(max) يكپارچه با ديتابيس ذخيره مي‌شود؛ بنابراين نحوه‌ي تهيه پشتيبان از آن‌ها همانند روش‌هاي متداول است بدون هيچگونه تغييري (و اين اطلاعات در بك آپ ديتابيس لحاظ مي‌شوند). اگر نياز بود هنگام تهيه پشتيبان از اين نوع داده‌ها بك آپ گرفته نشود، مي‌توان از partial backup با پارامترهاي مربوطه استفاده كرد.


ادامه دارد ...