آموزش بازیابی ( ریکاوری ) پایگاه داده SQL با Tail Log

چگونه بانک اطلاعاتی خراب SQL را بازیابی و تعمیر کنیم؟ معمولا هنگامی که پایگاه داده ایی آسیب دیده است نیاز است که فایل 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 می توان پایگاه داده را به صورت کامل بازیابی کرد.


نظرات