مقدمه

اغلب شاهد این قضیه هستیم که افراد، داده‌ ها را به اشتباه حذف و یا دست‌ کاری می ‌کنند. اینکه افراد به اشتباه داده‌ ها را حذف کنند قابل درک است، اما هنگامی که از داده‌ های خود را Back UP نگرفته باشند دچار مشکل خواهند شد. در اینجا باید افراد را به حفظ آرامش خود دعوت کنیم تا فجایع بیشتری رخ ندهد و سپس به افراد کمک کنیم تا داده ‌های خود بازیابی و یا ریکاوری کنند. در ادامۀ این مقاله قصد داریم تا نحوۀ ریکاوری پایگاه داده SQL با Tail Log را برای شما آموزش دهیم. پس با ما همراه باشد.

ریکاوری پایگاه داده SQL با Tail log

پشتیبان گیری ازSQL Server با Tail-Log در سال 2005 معرفی شد. این ویژگی برای فرآیند پشتیبان گیری بسیار مفید و کاربردی است. قبل از شروع به هرگونه توضیحی در این مورد باید به این نکته اشاره کنیم که، این ویژگی تنها در صورتی کار می کند که یک بار از پایگاه داده خود یک نسخه پشتیبان تهیه کرده باشید و پایگاه داده شما در مدل‌ های بازیابی کامل یا فله ذخیره شده باشد. اگر پشتیبان کامل پایگاه داده خود را تهیه نکرده ‌اید، این ویژگی برای شما کار نخواهد کرد.
پشتیبان گیری از Tail-Logیک نسخه پشتیبان تهیه شده از پرونده ‌های ثبت شده و هر گونه پروندۀ ثبت شده که هنوز توسط آخرین نسخۀ پشتیبان ‌گیری تراکنش، پشتیبان گیری نشده است را ضبط می کند. هنگامی که بخواهیم نسخۀ پشتیبان تهیه کنیم، سناریوهای متعددی وجود دارد، اما باید توجه داشته باشید که همه سناریوهای بازیابی نیازی به تهیه نسخه پشتیبان از گزارش ندارند. اگر نقطه بازیابی قبلاً در پشتیبان ‌گیری ورود به سیستم قبلی وجود داشته باشد، مجبور به تهیه نسخه پشتیبان نیستید. علاوه بر این در صورت تعویض پایگاه داده نیز نیازی به پشتیبان‌ گیری نیست، این تعویض شامل بازنویسی یا جابجایی پایگاه داده است و نیازی به بازگرداندن آن به حالت بعد از پشتیبان گیری جدید ندارد. در ادامه به شرایطی که نیاز به ریکاوری پایگاه داده SQL با tail log دارند اشاره خواهیم کرد.

شرایط ریکاوری پایگاه داده SQL با Tail Log

توصیه می ‌کنیم در شرایط زیر یک نسخه پشتیبان تهیه کنید:

  •  اگر پایگاه داده آنلاین است و قصد دارید عملیات بازگرداندن پایگاه داده را انجام دهید، با پشتیبان گیری از دایره گزارش شروع کنید. برای جلوگیری از خطا در پایگاه داده آنلاین، باید از گزینه WITH NORECOVERY در دستور BACKUP Transact-SQL استفاده کنید.
  •  اگر پایگاه داده آفلاین است و شروع به کار نمی کند و شما نیاز به بازگرداندن پایگاه داده دارید، ابتدا از گزارش پشتیبان بگیرید. در اینجا نیز استفاده از نرم افزار WITH NORECOVERY اختیاری است.
  •  اگر پایگاه داده آسیب دیده است، سعی کنید با استفاده از گزینه WITH CONTINUE_AFTER_ERROR در دستور BACKUP یک نسخۀ پشتیبان تهیه کنید

مراحل ریکاوری پایگاه داده SQL با Tail log

در این قسمت قصد داریم مراحل بازیابی پایگاه داده SQL با tail log را در 5 مرحله برای شما بیاوریم. مراحل بازیابی پایگاه داده SQL با tail log به شرح زیر است:
1. یک نسخۀ tail log backup تهیه کنید.
برای تهیه نسخۀ پشتیبان دستور را بدین شکل اجرا کنید:

BACKUP LOG  TO  WITH NORECOVERY

این دستور ورودی ‌های ورود به سیستم، که پشتیبان گیری نشده اند را ضبط می ‎کند و پایگاه داده را در حالت RESTORING قرار می ‌دهد تا هیچ داده جدیدی اضافه نشود. معمولاً در پشتیبان گیری معمولی t-log از گزینۀ NORECOVERY استفاده نمی‌ کنند.

2. به شکلFull backup بازیابی کنید.
زمانی که بخواهید آخرین نسخه داده‌ های خود را به شکلFull backup بازیابی کنید. بسته به تنظیمات خود، مطمئن شوید که علاوه بر سایر گزینه‌ های ضروری WITH NORECOVERY را نیز انتخاب کنید. این گزینه به شما امکان می ‌دهد تا پشتیبان گیری و گزارش های اضافی را بازیابی کنید.

--  will point to the device or file for the Full backup RESTORE DATABASE MyDatabase FROM  WITH NORECOVERY, ;

3. ریکاوری Differential backups (optional)
اگر از Differential پشتیبان تهیه می‌ کنید، اکنون می ‌توانید با استفاده از گزینه WITH NORECOVERY داده ‌های پایگاه را بازیابی کنید. انجام این کار به این معنی است که بازیابی t-log کمتری برای انجام دارید.

 will point to the device or file containing the differential RESTORE DATABASE MyDatabase from  WITH NORECOVERY;

4. پشتیبان گیری t-log را به ترتیب با استفاده از STOPAT بازیابی کنید.
اکنون t-log های خود را به ترتیب با قدیمی‌ ترین ‌ها بعد از Full یا Differential شروع کنید. مانند بازگرداندن کامل و احتمالاً Differential ، باید گزینه WITH NORECOVERY را انتخاب کرده و هنگام بازگرداندن نسخه پشتیبان تهیه شده از گزارش، باید حتما گزینه STOPAT = را نیز وارد کنید که در آن هدف شما بازیابی زمان بازیابی است.

 T-Log restore RESTORE LOG MyDatabase FROM  WITH NORECOVERY;
-- T-log restore using STOPAT RESTORE LOG MyDatabase FROM  WITH NORECOVERY, STOPAT='June 22, 2019 3:00 PM';

5. پایگاه داده را دوباره آنلاین کنید.
در آخر این دستور را اجرا کنید. این دستور پاکسازی نهایی را بر روی فرآیند انجام داده و پایگاه داده را برای استفاده مجدد در دسترس قرار می‌ دهد.

RESTORE DATABASE  WITH RECOVERY;

در ادامه برای اینکه بهتر متوجه شوید مثالی از بازیابی پایگاه داده SQL با tail log را برای شما می ‌آوریم:

1. برای مثال در نظر بگیرید که در پایگاه داده 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; 
-- 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

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

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

3. اگر پایگاه داده در حالت آنلاین قرار بگیرد خطاهایی بر روی سیستم ظاهر می ‌شود که به شکل زیر است:

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.

4. پس از طی مراحل بالا زمانی که این دستورها اجرا می ‌شود پایگاه داده در حالت Recovery Pending قرار می‌ گیرد. حال اگر بخواهیم از پایگاه داده به صورت نرمال بک آپ بگیریم حتمال دارد خطای زیر بر روی سیستم ظاهر ‌شود.

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.

5. اگر در زمان تهیه Tail Backup از دستور از دستور NO_TRUNCATE پیروی کنید به سادگی می‌ توانید به Log ها دسترسی داشته باشید.

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).

6. در مرحلۀ آخر باید بگوییم با Restore کردن پایگاه داده و با بهره گرفتن از Tail Backup می‌توان پایگاه داده را به صورت کامل بازیابی کرد.

تفاوت بین گزینه ‌های BACKUP NORECOVERY و CONTINUE AFTER ERROR

وقتی گزینه NORECOVERY را قبل از تهیه نسخه پشتیبان تهیه می‌ کنید، به این معنی است که قصد دارید پس از پشتیبان گیری موفق از پرونده گزارش تراکنش، عملیات بازیابی پایگاه داده را ادامه دهید. گزینه NORECOVERY پایگاه داده را به حالت بازیابی می ‌برد. این گزینه تضمین می ‌کند که پایگاه داده پس از تکمیل نسخه پشتیبان تهیه tail-log تغییر نمی ‌کند. در این هنگام گزارش تراکنش کوتاه می ‌شود مگر اینکه هنگام اجرای نسخه پشتیبان از گزارش تراکنش، گزینه NO_TRUNCATE یا گزینه COPY_ONLY را انتخاب کنید. مایکروسافت توصیه می‌ کند که از استفاده از NO_TRUNCATE اجتناب کنید، مگر زمانی که پایگاه داده آسیب دیده باشد. اما به هنگامی که بخواهید از پرونده گزارش تراکنش ‌ها پشتیبان گیری کنید، اگر پشتیبان گیری از پایگاه داده SQL Server آسیب دیده باشد، باید از گزینۀ CONTINUE_AFTER_ERROR کمک بگیرید.