
وقتی ما در دیتابیسمون از چندین filegroup استفاده کنیم قادر خواهیم بود بجای Restore کردن کل دیتابیس که کار زمان بری است (با توجه به سناریوی ما) بخشی از دیتابیس رو که برای ما از اهمیت بیشتری برخورداره Restore کنیم .در این روش بعد Restore کردن بخش مورد نظر (filegroup) دیتابیس آنلاین شده و کاربر میتونه به کار خودش ادامه بده در حالی که بخش های باقی مونده (filegroups) در حال Restore شدن هستند.
مثال:فرض کنید دیتابیسی بنام Sales داریم که از 2 filegroup بنام های Sales_Main (که شامل جداول اصلی ما است) و Sales_Archive (که شامل جداول آرشیو ما است) تشکیل شده
| 1 |
CREATE DATABASE [Sales] ON PRIMARY (NAME = N'Sales', FILENAME = N'j:SQL DataSales.mdf') |
| 2 |
, FILEGROUP [Sales_Main] (NAME = N'Sales_Main', FILENAME = N'j:SQL DataSales_Main.ndf') |
| 3 |
, FILEGROUP [Sales_Archive] (NAME = N'Sales_Archive', FILENAME = N'j:SQL DataSales_Archive.ndf') |
| 4 |
LOG ON (NAME = N'Sales_log', FILENAME = N'j:SQL LogSales_log.ldf') |
Best practice میگوید اشیای یوزر رو در فایل گروپ primary نسازید (بمنظور تسریع عملیات Restore ) از اینرو ما Sales_Main رو بعنوان پیش فرض قرار میدیم و جداول مورد نظر رو میسازیم
| 01 |
ALTER DATABASE [Sales] |
| 02 |
MODIFY FILEGROUP [Sales_Main] DEFAULT |
| 07 |
CREATE TABLE dbo.Table_1 (Col1 nchar(10) NULL) ON Sales_Main |
| 10 |
CREATE TABLE dbo.Table_2 (Col1 nchar(10) NULL) ON Sales_Archive |
جداول بالا رو با دیتای تست پرمیکنیم
| 09 |
BACKUP DATABASE [Sales] |
| 10 |
FILEGROUP = N'PRIMARY' |
| 11 |
TO DISK = N'G:SQL BackupSales_Primary_FG.bak' |
| 15 |
BACKUP DATABASE [Sales] |
| 16 |
FILEGROUP = N'Sales_Main' |
| 17 |
TO DISK = N'G:SQL BackupSales_Sales_Main_FG.bak' |
| 21 |
BACKUP DATABASE [Sales] |
| 22 |
FILEGROUP = N'Sales_Archive' |
| 23 |
TO DISK = N'G:SQL BackupSales_Sales_Archive_FG.bak' |
حال فرض کنید دیسک (های) ما که فایل گروپ های ما تو اونا ایجاد شده بودن از بین رفتن (خراب شدن) ولی دیسکی که فایل لاگ تو اون ساختیم هنوز سالمه.با فرض نداشتن فایل گروپ ما باید چندین ترابایت رو Restore کنیم و در این مدت هم سیستم از دسترس خارجه ولی با توجه به اینکه ما فایل گروپ داریم مراحل زیر رو انجام میدیم
1-از دم لاگ بکاپ میگیریم
2-اولویت بندی کردن فایل گروپ ها که اول کدوم فایل گروپ رو Restore کنیم(در اینجا Sales_Main )
3-Restore کردن فایل گروپ primary (چون ما Best practice رو رعایت کردیم این مرحله سریع انجام میشه و دیتابیس آنلاین میشه)
4-Restore کردن فایل گروپ Sales_Main
5-Restore کردن لاگ بکاپ(دم لاگ)
| 05 |
TO DISK = N'G:SQL BackupSales_log_tail.bak' |
| 06 |
WITH NORECOVERY, NO_TRUNCATE |
| 10 |
RESTORE DATABASE [Sales] |
| 12 |
FROM DISK = N'G:SQL BackupSales_Primary_FG.bak' |
| 13 |
WITH PARTIAL, NORECOVERY |
| 15 |
RESTORE DATABASE [Sales] |
| 16 |
FILEGROUP='Sales_Main' |
| 17 |
FROM DISK = N'G:SQL BackupSales_Sales_Main_FG.bak' |
| 21 |
FROM DISK = N'G:SQL BackupSales_log_tail.bak' |
در این لحظه Sales_Main آماده استفاده است
توجه کنید هرگونه تلاش برای استفاده از جداول فایل گروپ Sales_Archive با ارور زیر مواجه میشود
| 1 |
Msg 8653, Level 16, State 1, Line 1 |
| 2 |
The query processor is unable to produce a plan for the table or view |
| 3 |
'table_2' because the table resides in a filegroup which is not online. |
خوب از اینجا به بعد ما میتونیم بصورت موازی که سیستم در دسترس کاربران هست اقدام به Restore کردن مابقی فایل گروپ ها بکنیم
| 01 |
RESTORE DATABASE [Sales] |
| 02 |
FILEGROUP='Sales_Archive' |
| 03 |
FROM DISK = N'G:SQL BackupSales_Sales_Archive_FG.bak' |
| 08 |
FROM DISK = N'G:SQL BackupSales_log_tail.bak' |
ضمنا اگه برای دیگر فایل گروپ های ما مشکلی پیش نیومده میتونیم از دستور زیر استفاده کنیم
| 1 |
RRESTORE DATABASE [Sales] FILEGROUP='Sales_Archive' WITH RECOVERY |