آخرین فرصت تا %60 تخفیف خرید یکجای دوره ها برای 3 نفر فقط تا
00 00 00

Recovery پایگاه داده به کمک Tail Log

معمولا هنگامی که پایگاه داده ایی آسیب دیده است نیاز است که فایل Backup آن بازگردانی شود. اما آیا Full Backup و Log Backup می تواند پایگاه داده را کامل Recover کند ؟

Tail Log شامل Transaction Log است که بعد از Log Backup ایجاد شده است. در صورتی که نیاز به Recovery پایگاه داده تا آخرین نقطه قبل از Disaster باشد نیاز به Tail Backup است تا تمامی Transaction Log ها برگردانده شود.

هنگامی که دیتافایل های پایگاه داده آسیب دیده و نیاز به تهیه Log Backup برای Recovery است اگر به طور معمول Backup تهیه شود با خطا مواجه می شوید اما اگر سرور هنوز در دسترس است به آسانی می توان Tail ، Log Backup را تهیه کرد ؛ تنها مورد استثنا زمانی است که تغییرات در پایگاه داده زمانی ثبت شده است که Recovery Model در حالت BULK_LOGGED بوده است. در این حالت تمامی تغییرات تا قبل از Log Backup قابل بازیابی است و امکان تهیه Tail Backup وجود ندارد.

در ادامه با ذکر مثال به شرح بیشتر می پردازیم.

فرض کنید در پایگاه داده Test جدول TestTable را ایجاد کرده ایم.

-- Create Table
USE [Test];
GO
CREATE TABLE [TestTable] ([C] CHAR (100));
GO
 
-- Take a full backup
BACKUP DATABASE [Test] TO DISK = N'D:\Test\Test_Full.bak' WITH INIT;
GO
 
-- Insert some rows
INSERT INTO [TestTable] VALUES ('Tr 1');
INSERT INTO [TestTable] VALUES ('Tr 2');
GO
 
-- Take a log backup
BACKUP LOG [Test] TO DISK = N'D:\Test\Test_Log1.bak' WITH INIT;
GO
 
-- Insert some more rows
INSERT INTO [TestTable] VALUES ('Tr 3');
INSERT INTO [TestTable] VALUES ('Tr 4');
GO

دراین مرحله بعد از ورود آخرین داده Disaster را شبیه سازی می کنیم. برای این کار پایگاه داده را offline کرده و سپس Data File ها را پاک می کنیم

ALTER DATABASE [Test] SET OFFLINE;
 -- Delete the data file

اگر سعی کنید پایگاه داده را در دسترس قرار دهید با خطای زیر مواجه می شوید :

ALTER DATABASE [Test] SET ONLINE;
GO

Msg 5120, Level 16, State 101, Line 1

Unable to open the physical file "C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\test..mdf". Operating system error 2: "2(The system cannot find the file specified.)".

Msg 945, Level 14, State 2, Line 1

Database 'Test' cannot be opened due to inaccessible files or insufficient memory or disk space. See the SQL Server errorlog for details.

Msg 5069, Level 16, State 1, Line 1

ALTER DATABASE statement failed.

دقت شود که با اجرای دستور بالا پایگاه داده در حالت Recovery Pending قرار می گیرد.

اگر سعی شود که با دستور زیر به صورت نرمال Backup گرفته شود خطای زیر مشاهده می گردد.

BACKUP LOG [Test] TO DISK = N'D:\test\Test_Log_Tail.bak' WITH INIT;
GO

Msg 945, Level 14, State 2, Line 1

Database 'DBMaint2008' cannot be opened due to inaccessible files or insufficient memory or disk space. See the SQL Server errorlog for details.

Msg 3013, Level 16, State 1, Line 1

BACKUP LOG is terminating abnormally.

اگر از دستور NO_TRUNCATE در زمان تهیه Tail Backup استفاده کنید اجازه می دهد تا به Log ها حتی در صورت نبود Data File ها دسترسی داشته باشید.

BACKUP LOG [Test] TO DISK = N'D:\test\Test_Log_Tail.bak' WITH INIT, NO_TRUNCATE;
GO

Processed 2 pages for database 'DBMaint2008', file 'DBMaint2008_log' on file 1.

BACKUP LOG successfully processed 2 pages in 0.010 seconds (0.972 MB/sec).

با Restore کردن پایگاه داده و با استفاده از هر سه فایل Full Backup ، Log Backup و Tail Backup می توان پایگاه داده را به صورت کامل بازیابی کرد.

4 نظر
حمید ج. فرد

نکته شما چندین مشکل فنی داشت.

1- اینکه Tail Log Backup با مشکل برخورد کرده به دلیل اینکه شما پایگاه داده Online ندارید به دلیل نبود Mdf که در مرحله قبل شما به صورت دستی حذفش کردید

2- اینکه No Truncate برای این است که فایل Transaction Log دوباره استفاده نشود و در محیط شما به دلیل نبود فایل Mdf شما باید از این دستور استفاده کنید نه اینکه برای Tail Log Backup از این دستور استفاده شود.

3- اینکه در کل Tail Log Backup قبل از هر Restore باید گرفته شود و از SQL Server 2008 به بعد اگر شما بخواهید یک پایگاه داده را بازگردانی کنید باید Log Backup گرفته شود که این همان Tail Log Backup است.

4- اینکه در حالت Bulk-Logged به این دلیل نمی شود که نیاز به کپی کردن تمامی Data Page هایی را دارد که در عملیات Bulk Operation تحت تاثیر قرار گرفته اند.

امیدوارم از صراحت لهجه بنده دلگیر نشده باشید.

با تشکر

حمید ج. فرد

fotros

سلام؛

از اینکه نکات بالا رو فرمودید و مشکلات متن رو دوستانه تذکر دادید ممنونم آقای مهندس.

در مورد حذف دیتافایل منظور این بوده که به هردلیلی ممکنه دیتا رو از دست داده باشیم، مثلا پاک شدن آن و یا حتی Crash دیتابیس و یا اینکه Recovery Pending شدن آن و یا خراب بودن دیتا فایل.برای مثال من mdf رو پاک کردم.

باز هم از همکاری صمیمانه شما سپاسگزارم

حسن ضرابی

با سلام

از بابت اطلاعات مفیدتون ممنونم

بسیار برای من عالی و مفید بود

با تشکر

حسن ضرابی

با سلام و خسته نباشید خدمت شما

از این آموزش بسیار عالی ممنونم فقط با اجازه شما من کدهای restore را می گذارم که اگر کسی خواست استفاده بکنه :

USE [master]
RESTORE DATABASE [Test] FROM  DISK = N'c:\database\Test_Full.bak' WITH  FILE = 1,  NORECOVERY,  NOUNLOAD,  REPLACE,  STATS = 5
RESTORE LOG [Test] FROM  DISK = N'c:\database\Test_Log1.bak' WITH  FILE = 1,  NORECOVERY,  NOUNLOAD,  STATS = 5
RESTORE LOG [Test] FROM  DISK = N'c:\database\Test_Log_Tail.bak' WITH  FILE = 1,  NOUNLOAD,  STATS = 5

GO



نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر