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
در این لحظه Sales_Main آماده استفاده است توجه کنید هرگونه تلاش برای استفاده از جداول فایل گروپ Sales_Archive با ارور زیر مواجه میشود
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 کردن مابقی فایل گروپ ها بکنیم
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

نظرات

ارسال یک نظر

پست‌های معروف از این وبلاگ

lnav ابزاری بسیار کاربردی برای پیمایش لاگ ها در لینوکس و البته مک

ساختن ایمیج های داکری به کمک BuildKit - بخش دوم

ساختن ایمیج های داکری به کمک BuildKit - بخش اول