همیشه زمانی که می خواهید خودتان را با یک تکنولوژی جدید آشنا کنید دو بخش مطرح است. در ابتدا، باید این را درک کنید که آن تکنولوژی به قصد استفاده در چه کاربردهایی بوجود آمده است، و در مرحله ی بعد باید بفهمید که چطور از آن تکنولوژی در عمل استفاده کنید ( و برای خودتان بهتر است که به همین ترتیب پایبند باشید). در این مقاله می خواهم در باره ی ویژگی های SQL Server FILESTREAM صحبت کنم و هر دو بخش را پوشش دهم.
مهمترین ویژگی هر DBMS توانایی آن در ذخیره ی داده ها در شکلی ساختارمند است به طوری که بازیابی اطلاعات را تسهیل کند و همچنین توانایی های مدیریت داده، پشتیبان گیری و کنترل های امنیتی که می تواند روی یک نهاد مدیریتی (پایگاه داده) اعمال شود را در خود داشته باشد. با فضاهای ذخیره سازی مدرن در سطح سیستم فایل برخی از ویژگی ها را دارید ولی قابلیت ها ی DBMS خیلی غنی تر است.
نیازمندی های کسب و کار که ممکن است با آن ها مواجه بشوید عبارتند از نیازمندی به ذخیره کردن فایل های بزرگ به طوری که با تمام اطلاعات دیگر مربوط به کسب و کار که در پایگاه داده ی line of business (LOB) شما ذخیره شده اند لینک شده باشند. بسته به نوع کسب و کار، این فایل ها ممکن است هر چیزی اعم از اسکن سند های قانونی تا صوت، ویدیو، نقاشی یا هر فرمت دیگر فایل که نیاز به ذخیره ی آن دارید باشند. از نظر تاریخی، راهی برای ذخیره ی این نوع فایل ها ، به یا بیان دیگر، BLOBs (binary large objects) در در پایگاه داده های SQL server وجود نداشت. اگرچه سیستم فایل برای ذخیره ی فایل ها به خوبی عمل می کند، ضعف آن در توانایی های مدیریتی اگر با این توانایی ها ارائه شده توسط DBMS مقایسه شود باعث می شود داده های کسب کار شما در دو جای غیر متصل به هم ذخیره شوند: پایگاه داده و سیستم فایل. این الزام باعث شده است که به دنبال راه هایی برای پیوستن این دو مخزن داده جدا از هم در یک جا و یا حداقل ارتباط دادن آن ها به یک طریق شود.
SQL Server FILESTREAM از تکنولوژی هایی است که به شما اجازه ی همچین کاری را می دهد. اما اجازه بدهید ببینیم قبل از آن چه داشته ایم. قبل از ویژگی SQL Server FILESTREAM پاسخ های ممکن به مساله در پایین توصیف شده اند:
- ذخیره سازی داده در table storage/ ستون های VARBINARY(MAX). این رویکرد تمام مزایای داشتن تمام داده های خود در یک پایگاه داده، که شامل امکان اطمینان حاصل کردن از سازگاری تراکنش (به معنی این که تمام محدودیت های تعریف شده توسط شما روی داده های ذخیره شده در BLOB اعمال شده است) و مدیریت آسان می شود را دارد. ایراد این رویکرد دسترسی پیچیده به فایل های برای نرم افزار های کاربردی خارجی و حجم زیاد پایگاه داده است که می تواند به مصرف بیش از حد فضای ذخیره سازی اصلی یا نقض محدودیت اندازه ی فایل پایگاه داده بیانجامد ( برای نسخه Express).
نتیجه گیری: با استفاده از این رویکرد داده های بی ساختار شما در یک پایگاه داده با قابلیت های مدیریتی ذخیره و مجتمع شده است، ولی با استفاده از API های مرسوم سیستم فایل قابل بازیابی نیست (کلاینت شما یا اپلیکشن لایه ی میانی باید به این موضوع رسیدگی کند).
- ذخیره سازی لینک ها به مکان های فایل های سیستم درون پایگاه داده. این روش ایراد رویکرد قبلی را ندارد، ولی همچنین مزیت آن را هم ندارد. با استفاده از این رویکرد داده ها همچنان به صورت جداگانه ذخیره شده اند ( خبر خوب این است که از طریق API های سیستم فایل می توانید به آن ها دست پیدا کنید) ولی هیچ قابلیت مدیریتی DBMS برای این داده ها بدست نمی آورید. ( معمولا با همگام سازی ترکیب پایگاه داده ی خود با فضای ذخیره ی سیستم فایل، به دلیل داشتن دو شی که باید به صورت جداگانه مدیریت شوند و باعث دوبرابر شدن کار می شوند، به مشکل می خورید)
نتیجه گیری: راه حل قابل انجام و ساده ای است که BLOB ها را خارج از کنترل DBMS نگه می دارد و فقط در صورتی که بتوانید سربار مدیریتی و ریسک از دست دادن کنترل های یک پارچه روی داده هایتان را بپذیرید قابل قبول است. ( برای مثال سازگاری تراکنش).
وارد شدن f#. این ویژگی SQL Server به ستون های varbinary(max) اجاز می دهد داده های درون سیستم فایل را از طریق استفاده از گروه های فایل که به طور خاصی طراحی شده اند که شامل دایرکتوری هایی هستند که به عنوان ظروف داده عمل می کنند ذخیره کنند. از این رو، داده هایی را داریم که به شکل فایل ذخیره شده اند ولی مستقیما درون DBMS تجمیع شده اند پس می توانیم از ویژگی های پشتیبان گیری و بازیابی و محافظت از تمامیت برای هر دوی فایل های BLOB و داده های ساختارداده شده استفاده کنیم.
ویژگی های FILESTREAM در ابتدا در SQL server 2008(که به نام Katmai شناخته شده و در اگوست 2008 منتشر شد) معرفی شده بود و هم اکنون در تمامی نسخه ها و ادیشن های SQL Server موجود است. همانطور که از توصیفات بالا می توانید حدس بزنید FILESTREAM یک نوع داده نیست بلکه یک تنظیم/صفت که روی ستون varbinary(max) پیکربندی می کنید است که به SQL Server می گوید داده باید در سیستم فایل ذخیره شده باشد. این ویژگی SQL Server DBMS را با سیستم فایل NTFS/ReFS ادغام می کند. که به شما این امکان را می دهد که از عبارات Transact-SQL برای کار روی این داده (insert، update، query، search، backup) که با امکان استفاده از API های streaming و کارایی سیستم فایل و نگهداری سازگاری های تراکنشی برای داده های با ساختار و بی ساختار ترکیب شده است، استفاده کنید.
FILESTREAM کارایی DBMS را بهبود می دهد چرا که ستون های FILESTREAM در بافر درون SQL Server کش نشده است، و به جای آن از کش سیستم NT استفاده می کند. این کار حافظه ی بیشتری از بافر SQL Server را برای فرایند query گرفتن ذخیره می کند. با فعال بودن FILESTREAM شما می توانید از هر دوی Transact-SQL و Win32 برای مدیریت داده FILESTREAM استفاده کنید.
اگرچه داده به صورت فایل ذخیره شده است ( و از طریق API های مرسوم سیستم فایل قابل سترسی است) ما همچنان تمام قابلیت برنامه ی کاربردی ویندوز را با FILESTREAM نداریم چراکه داده از طرق جریان های غیر تراکنش قابل دسترسی نبوده و برنامه های کاربردی ویندوز از تراکنش های پایگاه داده آگاهی ندارند. این همچنین به این معناست که سازگاری کامل با API سیستم های فایل برای داده های دایرکتوری و فایل وجود ندارد. از آنجایی که جریان FILESTREAM Win32 کارها را تنها در غالب تراکنش های SQL Server پشیبانی می کند نمی توانیم فایل های FILESTREAM را از طریق سیستم فایل حذف کنیم و یا تغییر نام دهیم.
نتیجه گیری: با FILESTREAM شما سازگاری تراکنش و امکان استفاده از جریان API ها و کارایی سیستم فایل را به دست می آورید. پشتیبانی از APIها/جریان سیستم فایل تنها به مد تراکنشی محدود شده است. این راه حل از راه حل های قبلی بهتر است و مزایای مدیریت SQL Server و کارایی سیستم فایل را با هم ترکیب می کند.
آیا ضعف یا محدودیتی وجود دارد؟ محدودیت این است استفاده از FILESTREAM باعث می شود که برای این که برنامه های کاربردی ویندوز بتوانند به این داده دست پیدا کنند یک مقدار کدهای شخصی بنویسیم. FILESTREAM سازگاری کامل با فضای ذخیره سازی دایرکتوری و فایل API ویندروز را ندارد و دسترسی غیر تراکنشی را پشتیبانی نمی کند.
با FILESTREAM Win32 پشتیبانی جریان در غالب یک تراکنش SQL Server پشتیبانی می شود. در درون یک تراکنش، امکان استفاده از توابع FILESTREAM برای بدست آوردن یک مسیر سیستم فایل UNC منطقی یک فایل وجود دارد. در ادامه می توانید از OpenSqlFILESTREAM API برای بدست آورنده ی یک file handle استفاده کنید. این handle بعد می تواند بوسیله ی اینترفیس های جریان فایل Win32 مانند ReadFile() و WriteFile() مورد استفاده قرار گرفته شود تا به فایل را از طریق سیستم فایل دستری پیدا کند و آن بروز رسانی کند.
چه زمانی ممکن است بخواهید از آن استفاده کنید؟ برای ساده کردن امر در سناریو های زیر استفاده از FILESTREAM می تواند در گرفته شود:
- زمانی که نیاز به ذخیره ی فایل با حجم بیشتر از 1 مگابایت دارید ( از table storage های مرسوم برای فایل های کوچکتر استفاده کنید)
- زمانی که خواندن سریع مهم است
- زمانی که محدودیت های سایز پایگاه داده به دلیل ایدشن SQL Server اعمال شده اند را دارید و نیاز به غلبه به آن را دارید ( برای مثال ادیشن Express محدودیت حداکثری 10 گیگابایت برای اندازه ی سایز پایگاه داده را دارد، برای نمونه، شما 10 گیگابایت برای ذخیره ی داده های رابطه ای دارید، اما داده ی FILESTREAM این محدودیت را ندارد)
برای جمع بندی، اگر پیاگاه داده LOB شما نیازی دارد که فایل های بزرگ را شامل شود می توانید از file stream برای بهینه کردن کارایی و بهره مندی از مدیریت این داده ها به عنوان بخشی از DBMS استفاده کنید.
الان که محدودیت ها و موارد کاربرد تکنولوژی FILESTREAM مشخص شده اند می توانیم به سراغ چیزهای مرتبط با قسمت عملی آن بپردازیم.
اولا، نیاز است که FILESTREAM در سطح SQL Server instance level فعال شود. این ویژگب با نصب و یا بروزرسانی نمونه ی SQL Server به صورت پیش فرض فعال نمی شود، با این حال می توانید در مرحله ی Database Engine Configuration در قسمت SQL Server Setup Wizard آن را فعال کنید:
معمولا پیکربندی FILESTREAM بعد از نصب از طریق SQL Server Configuration Manager و SQL Server Management Studio (SSMS) انجام شده است. برای چک کردن اینکه فعال شده است یا نه می توانید از رویه ی سیستم ذخیره شده sp_configure استفاده کنید:
اگر مقدار config_value صفر باشد به این معناست که FILESTREAM غیر فعال است و باید مقدار config_value را به 2 تغییر دهید تا فعال شود. به عنوان راه حل جایگزین برای مشاهده ی وضعیت پیکربندی می توانید با رفتن به SQL Server Congiguration Manager و بعد از آن به SQL Server Services نمونه ی SQL Server خود را انتخاب کنید و در جایی که نوار FILESTREAM را می بینید به خصیصه های آن دسترسی پیدا کنید:
می توانیم با استفاده از Transcat-SQL/SSMS و SQL Server Configuration Manager، FILESTREAM را فعال کنیم.
اجازه دهید FILESTREAM را با استفاده از رویه ی ذخیره شده ی sp_configure فعال کنیم مانند شکل زیر:
اجرای این دستور مقدار config_value را از 0 به 2 تغییر خواهد داد:
ممکن است با دیدن پیامی که بعد از تغییر FILESTREAM_access_level مشاهده خواهید کرد کمی گیج شوید: “ Configuration option ‘FILESTREAM access level’ changed from 0 to 2. Run the RECONFIGURE statement to install.“. اگر بعد از دریافت این پیام RECONFIGURE را اجرا کنید این پیام را مشاهده خواهید کرد: ” FILESTREAM feature could not be initialized. The operating system Administrator must enable FILESTREAM on the instance using Configuration Manager.“.
مرحله ی بعدی شما بعد از تغییر پیکربندی توسط sp_configure رفتن به نوار FILESTREAM از خصیصه های instance در SQL Server Configuration Manager و تیک زدن گزینه های Enable FILESTREAM for Transact-SQL access و Enable FILESTREAM for file I/O access ، و تنظیم share name ویندوز در صورت لزوم است. به صورت دلخواه ممکن است بخواهید گزینه ی Allow remote clients to FILESTREAM data را نیز تیک بزنید:
روی دکمه ی OK در Instance properties کلیک کنید تا SQL شما راه اندازی مجدد شده و تغییراتی که انجام دادید اعمال شوند:
زمانی که شروع مجدد انجام شد می توانید دستور EXEC sp_configure FILESTREAM_access_level را مجددا اجرا کنید و ببینید که مقدار config_value و run_value 2 شده است:
حالا می توانیم file group و file را به صورتی که FILESTREAM فعال شده است اضافه کنیم و استفاده از FILESTREAM را شروع کنیم. برای اضافه کردن # file group میتوانید از SSMS GUI (Darabase Properties > Filegroups) مانند شکل زیر استفاده کنید:
همچنین همین کار از طریق T-SQL نیز امکان پذیر است:
زمانی که فرمان های نشان داده در بالا را اجرا کردید خواهید دید که FILESTREAM filegroup به پایگاه داده ی شما اضافه شده است:
همچنین مشاهده خواهید کرد که پوشه ای که در اسکریپ SQL همراه با فایل FILESTREAM.hdr و پوشه ی $FSLOG درون آن ایجاد شده است:
FILESTREAM.hdr برای ذخیره ی اطلاعات هدر FILESTREAM استفاده شده است. ( metadata ای است که container داده را توصیف می کند) و دایرکتوری $FSLOG به عنوان یک معادل لاگ تراکنش FILESTREAM عمل می کند. پس از آن زیردایرکتوری ها برای هر جدول در این پوشه ساخته خواهد شد و درون آنها برای هر ستون FILESTREAM درون جدول یک زیردایرکتوری با GUID هایی به عنوان نام فایل ها برای تمام این object های سیستم فایل عمل می کنند خواهد بود.
حالا می توانیم جدول را با ستون FILESTREAM ایجاد کنیم:
توجه کنید که برای جدول FILESTREAM باید ستونی که به عنوان ROWGUIDCOL نشانه گذاری شده است داشته باشید که به شما اجازه می دهد ستون های تغییر ناپذیر جدا از کلید اصلی داشته باشید، در غیر این صورت در تلاش برای ساخت جدول با پیام خطای مقابل رویرو خواهید شد: “A table that has FILESTREAM columns must have a nonnull unique column with the ROWGUIDCOL property.”
زمانی که جدول ساخته شد می توانیم فایل موجود را در ستون FILESTREAM خود ذخیره کنیم یا مقداری از تکست را به فرمت باینری در آورده و ذخیره اش کنیم:
خواهید دید که داده های باینری ما در پایگاه داده ذخیره شده اند و GUID به عنوان ID هر کدام از رکوردها انتصاب داده شده است:
می توانید از طریق سیستم فایل به این فایل ها دسترسی پیدا کنید، اما راه ساده ای برای پیدا کردن فایل ها درون ساختار پوشه بر اساس GUID که در آن فایل ها با GUID ها نام گذاری شده اند و extension ای ندارند وجود ندارد. با این وجود هنوز می توانید فایل ها را از طریق سیستم فایل پیدا کرده و باز کنید(مخصوصا در ابتدای کار که تعداد کمی فایل که در FILESTREAM container ذخیره شده اند دارید بسیار ساده است):
محدودیت اصلی این ویژگی نیاز به نوشتن کدهای شخصی برای پیدا کردن و باز کردن فایل است. همانطور که در اسناد ماکروسافت توصیف شده است می توانید برای ایجاد برنامه های کاربردی کلاینت برای داده های FILESTREAM، و به خصوص بدست آوردن Win32 handle برای خواندن داده ها از FILESTREAM blob از API های Win 32 استفاده کنید. OpenSqlFILESTREAM API یک Win 32 file handle که برنامه ی کاربردی می تواند از آن برای استریم کردن داده های FILESTREAM استفاده کند و آن را تحویل API های مقابل بدهد فراهم می کند: ReadFile، WriteFile، TransmitFile، SetFilePointer، SetEndOfFile، یا FlushFileBuffers. به یاد داشته باشید برای دسترسی به FILESTREAM blob از طریق استفاده از Win32 باید Windows Authorization فعال شده باشد. (برای نمونه باید از با FILESTREAM از Integrated Authentication استفاده کنید). می توانید نمونه کدهای مرتبط را در بخش Access FILESTREAM Data with OpenSqlFILESTREAM اسناد مایکروسافت پیدا کنید.
برای خاتمه دادن به این مقاله، باید از آغاز SQL Server 2012 یک گزینه ی دیگر برای ذخیره سازی BLOB در پایگاه داده وجود دارد. این گزینه بر روی FILESTREAM ساخته شده است و به FileTables معروف است. FileTabales جدول کاربر اختصاصی ای را معرفی می کند که با یک طرح از قبل تعریف شده که داده های FILESTREAM را همراه با اطلاعات سلسله مراتبی دایرکتوری و صفت های فایل ذخیره می کند. FileTables نبود ویژگی FILESTREAM که در بالا به آن اشاره شد را مد نظر گرفته است، به عنوان نمونه سازگاری API ویندوز کامل تر و دسترسی غیر تراکنشی به فایل ها را فراهم می کند. می توانید درباره ی انتخاب کردن بین این دو گزینه در بخش Compare Options for Storing Blobs (SQL Server) از اسناد مایکروسافت مطالعه کنید، و من فکر می کنم یک دید جزئی تر به FileTables میتواند موضوع خوبی برای یکی از مقالات آتی باشد.
منابع برای بیشتر مطالعه کردن:
مقایسه ی گزینه ها برای ذخیره سازی Bobls (SQL Server)
ایجاد یک جدول برای ذخیره سازی داده های FILESTREAM
دسترسی به داده های FILESTREAM با OpenSqlFILESTREAM
ایجاد برنامه های کاربردی برای داده های FILESTREAM
بسیار عالی و زیبا متشکرم