Restore کردن تکه تکه (Piecemeal) دیتابیس با اسکیوال سرور
سناریو / مشکل:دیتابیس چندین تربایتی داریم و عملیات Restore کردن زمانبر است و در نتیجه Down Time سیستم بالا
راه حل: استفاده از چندین فایل گروپ
وقتی ما در دیتابیسمون از چندین filegroup استفاده کنیم قادر خواهیم بود بجای Restore کردن کل دیتابیس که کار زمان بری است (با توجه به سناریوی ما) بخشی از دیتابیس رو که برای ما از اهمیت بیشتری برخورداره Restore کنیم .در این روش بعد Restore کردن بخش مورد نظر (filegroup) دیتابیس آنلاین شده و کاربر میتونه به کار خودش ادامه بده در حالی که بخش های باقی مونده (filegroups) در حال Restore شدن هستند.
مثال:فرض کنید دیتابیسی بنام Sales داریم که از 2 filegroup بنام های Sales_Main (که شامل جداول اصلی ما است) و Sales_Archive (که شامل جداول آرشیو ما است) تشکیل شده
CREATE DATABASE [Sales] ON PRIMARY (NAME = N'Sales', FILENAME = N'j:\SQL Data\Sales.mdf') , FILEGROUP [Sales_Main] (NAME = N'Sales_Main', FILENAME = N'j:\SQL Data\Sales_Main.ndf') , FILEGROUP [Sales_Archive] (NAME = N'Sales_Archive', FILENAME = N'j:\SQL Data\Sales_Archive.ndf') LOG ON (NAME = N'Sales_log', FILENAME = N'j:\SQL Log\Sales_log.ldf')
Best practice میگوید اشیای یوزر رو در فایل گروپ primary نسازید (بمنظور تسریع عملیات Restore ) از اینرو ما Sales_Main رو بعنوان پیش فرض قرار میدیم و جداول مورد نظر رو میسازیم
ALTER DATABASE [Sales] MODIFY FILEGROUP [Sales_Main] DEFAULT USE [SALES] GO CREATE TABLE dbo.Table_1 (Col1 nchar(10) NULL) ON Sales_Main GO CREATE TABLE dbo.Table_2 (Col1 nchar(10) NULL) ON Sales_Archive GO
جداول بالا رو با دیتای تست پرمیکنیم
INSERT table_1 VALUES ('one') GO INSERT table_2 VALUES ('two') GO BACKUP DATABASE [Sales] FILEGROUP = N'PRIMARY' TO DISK = N'G:\SQL Backup\Sales_Primary_FG.bak' WITH INIT GO BACKUP DATABASE [Sales] FILEGROUP = N'Sales_Main' TO DISK = N'G:\SQL Backup\Sales_Sales_Main_FG.bak' WITH INIT GO BACKUP DATABASE [Sales] FILEGROUP = N'Sales_Archive' TO DISK = N'G:\SQL Backup\Sales_Sales_Archive_FG.bak' WITH INIT GO INSERT table_2 VALUES ('two - two') GO
حال فرض کنید دیسک (های) ما که فایل گروپ های ما تو اونا ایجاد شده بودن از بین رفتن (خراب شدن) ولی دیسکی که فایل لاگ تو اون ساختیم هنوز سالمه.با فرض نداشتن فایل گروپ ما باید چندین ترابایت رو Restore کنیم و در این مدت هم سیستم از دسترس خارجه ولی با توجه به اینکه ما فایل گروپ داریم مراحل زیر رو انجام میدیم
1-از دم لاگ بکاپ میگیریم
2-اولویت بندی کردن فایل گروپ ها که اول کدوم فایل گروپ رو Restore کنیم(در اینجا Sales_Main )
3-Restore کردن فایل گروپ primary (چون ما Best practice رو رعایت کردیم این مرحله سریع انجام میشه و دیتابیس آنلاین میشه)
4-Restore کردن فایل گروپ Sales_Main
5-Restore کردن لاگ بکاپ(دم لاگ)
USE MASTER GO BACKUP LOG [Sales] TO DISK = N'G:\SQL Backup\Sales_log_tail.bak' WITH NORECOVERY, NO_TRUNCATE GO RESTORE DATABASE [Sales] FILEGROUP='Primary' FROM DISK = N'G:\SQL Backup\Sales_Primary_FG.bak' WITH PARTIAL, NORECOVERY RESTORE DATABASE [Sales] FILEGROUP='Sales_Main' FROM DISK = N'G:\SQL Backup\Sales_Sales_Main_FG.bak' WITH NORECOVERY RESTORE LOG [Sales] FROM DISK = N'G:\SQL Backup\Sales_log_tail.bak' WITH RECOVERY GO
Msg 8653, Level 16, State 1, Line 1 The query processor is unable to produce a plan for the table or view 'table_2' because the table resides in a filegroup which is not online.
RESTORE DATABASE [Sales] FILEGROUP='Sales_Archive' FROM DISK = N'G:\SQL Backup\Sales_Sales_Archive_FG.bak' WITH NORECOVERY GO RESTORE LOG [Sales] FROM DISK = N'G:\SQL Backup\Sales_log_tail.bak' WITH RECOVERY GO
ضمنا اگه برای دیگر فایل گروپ های ما مشکلی پیش نیومده میتونیم از دستور زیر استفاده کنیم
RRESTORE DATABASE [Sales] FILEGROUP='Sales_Archive' WITH RECOVERY
مطلب مفیدی بود
پاسخحذف