بازگردانی پایگاه داده بدون فایل لاگ
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: دو دقیقه

در بعضی مواقع ممکن است که در حین کار و با تراکنش‌های باز، دیتابیس SQL Server دچار مشکل شود و از دسترس خارج شود و این فرض را هم در نظر بگیرید که بک آپ دیتابیس مربوط به زمانی بیش از حد انتظار است. آیا ممکن است که دیتابیس را با وجود از دست دادن فایل لاگ آن بازگردانی کرد؟
جواب: بله ولی بدون عواقب نیست.
بطور معمول در زمانی که تراکنش‌های باز بر روی سرور دیتابیس وجود دارد و بانک کرش میکند، کرش ریکاوری، تراکنش‌های باز را رول بک میکند. این امر مانع از اثرات پراکنده از تراکنش‌های فعلی در پایگاه داده می‌باشد.
اگر لاگ در دسترس نباشد هنگامی که کار سرور SQL شروع می‌شود، پایگاه داده در حالت SUSPECT  قرار داده می‌شود. در این مواقع تنها راه آن لاین نمودن بانک ( البته منظور آماده بکار نمودن بانک نیست) استفاده از حالت قابلیت تعمیر اورژانسی است که از نسخه 2005 افزده شده است که با ساخت یک فایل لاگ جدید و سپس اجرا نمودن DBCC CHECKDB با استفاده از REPAIR_ALLOW_DATA_LOSS انجام می‌شود.
مشکل اینجاست که اگر شما به همین طریق بخواهید ادامه بدهید و از این قابلیت اورژانسی استفاده کنید، مسلما امکان وجود دسته‌ای از تغییرات در بانک که ممکن است در میانه اعمال بروز رسانی چند رکورد فروش در یک جدول نیمی از تراکنش‌های آن‌ها روی بانک اعمال شده و بعد از راه اندازی دوباره با لاگ جدید، امکان برگرداندن آن‌ها وجود داشته باشد، مواجه شوید. به این معنی که در بهترین حالت، پایگاه داده بدست آمده با برنامه هماهنگ نیست و یا اینکه به بک آپی که وجود دارد رضایت بدهید.
حالت تعمیر اورژانسی، زمانیکه همه راه‌حل‌های بازگردانی بانک مغلوب شوند آخرین روش مانده است. این حالت، حالتی بین دو شر، ریکاور کردن بانک به حالتی نا هماهنگ با نرم افزار و یا برگرداندن به زمانی خیلی عقب‌تر است که در نهایت اقدام به انجام هر دو و هماهنگ‌تر کردن بانک برای کار با برنامه میشوید که بسیار وقت گیر و مشکل ساز است.
ولی باز ممکن است این وضعیت پیش بیاد چون شما از اتفاقی که در زمان کرش در بانک افتاده اطلاعی ندارید. برای جلوگیری از این موارد در آینده سازوکار بک آپ گیری از بانک را باید تغییر بدهید و دفعات بک آپ گیری را افزایش بدهید و نیز از روش‌های جدید که قابلیت دسترسی بالا دارند استفاده کنید همانند mirroring و SQL Server 2012 Availability Groups است.

 منبع: ^

لینکهای مرتبط:
1. Is the recovery interval guaranteed? ^
2. Scaling and Sharding Deep Freeze ^
3. Why Database Operations Hit the Wall ^
4. Avoiding logging for user operations ^
5. Resolving the Database Performance Problem Blame Game ^
  • #
    ‫۱۲ سال و ۲ ماه قبل، سه‌شنبه ۱۰ مرداد ۱۳۹۱، ساعت ۱۵:۳۹
    لطفا کاملتر توضیح بدید.
    من دیتابیسی دارم که فایل لاگ آن پاک شده باید چیکار کنم؟
    • #
      ‫۱۲ سال و ۲ ماه قبل، سه‌شنبه ۱۰ مرداد ۱۳۹۱، ساعت ۱۶:۵۱
      سوالتون کلی هست لطفا توضیح بیشتری بدید و البته باید توجه داشته باشید که با توجه به اطلاعات بالا اگه میخواهید از تعمیر اورژانسی استفاده کنید نسخه بانک باید از 2005 به بالا باشه
      • #
        ‫۱۲ سال و ۲ ماه قبل، پنجشنبه ۱۲ مرداد ۱۳۹۱، ساعت ۰۴:۳۷
        سوال این هست که من یک دیتابیس دارم که فایل LDF آن (فایل log) پاک شده حالا من بدون فایل LDF چطور این دیتابیس را attach کنم.فایل MDF را واسه Attach انتخاب میکنم Error میده! چون فایل LDF را پیدا نمیکنه.
          • #
            ‫۱۲ سال و ۲ ماه قبل، پنجشنبه ۱۲ مرداد ۱۳۹۱، ساعت ۰۴:۵۰
            آقای نصیری ممنون با همون روش اول حل شد.
            USE [master]
            GO
            -- Method 1: I use this method
            EXEC sp_attach_single_file_db @dbname='TestDb',
            @physname=N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\TestDb.mdf'
            GO 
            

  • #
    ‫۱۱ سال و ۸ ماه قبل، پنجشنبه ۱۲ بهمن ۱۳۹۱، ساعت ۰۲:۲۳
    سلام
    دیتابیسی هست که به حالت InRecovery رفته. در SQL Server Management Studio در لیست دیتابیس‌ها وجود داره ولی جلوی اسم اون عبارت InRecovery رو نوشته. در این حالت که هست نمیشه که ساختار این دیتابیس اعم از جدول ها، داده‌های داخل اون جداول، stored procedure‌ها و ... رو ببینیم. از اطلاعات اون هم پشتیبان گیری نشده و به داده‌های داخل اون نیاز هست. شما می‌دونید مشکل چیه و چطور حل میشه ؟
    با تشکر
    • #
      ‫۱۱ سال و ۸ ماه قبل، پنجشنبه ۱۲ بهمن ۱۳۹۱، ساعت ۰۲:۳۱
      چیز مهمی نیست. احتمالا فضا کم اومده روی هارد یا لاگ پر شده. به علاوه فقط باید بهش زمان بدی تا کارش تموم شه.
      • #
        ‫۱۱ سال و ۸ ماه قبل، پنجشنبه ۱۲ بهمن ۱۳۹۱، ساعت ۱۷:۳۲
        این اسکریپت رو پیدا کردم، منتهی اجراش که میکنم زمان باقی مونده رو اعلام نمیکنه.

        DECLARE @DBName VARCHAR(64) = 'databasename'
         
        DECLARE @ErrorLog AS TABLE([LogDate] CHAR(24), [ProcessInfo] VARCHAR(64), [TEXT] VARCHAR(MAX))
         
        INSERT INTO @ErrorLog
        EXEC sys.xp_readerrorlog 0, 1, 'Recovery of database', @DBName
         
        SELECT TOP 5
         [LogDate]
        ,SUBSTRING([TEXT], CHARINDEX(') is ', [TEXT]) + 4,CHARINDEX(' complete (', [TEXT]) - CHARINDEX(') is ', [TEXT]) - 4) AS PercentComplete
        ,CAST(SUBSTRING([TEXT], CHARINDEX('approximately', [TEXT]) + 13,CHARINDEX(' seconds remain', [TEXT]) - CHARINDEX('approximately', [TEXT]) - 13) AS FLOAT)/60.0 AS MinutesRemaining
        ,CAST(SUBSTRING([TEXT], CHARINDEX('approximately', [TEXT]) + 13,CHARINDEX(' seconds remain', [TEXT]) - CHARINDEX('approximately', [TEXT]) - 13) AS FLOAT)/60.0/60.0 AS HoursRemaining
        ,[TEXT]
         
        FROM @ErrorLog ORDER BY [LogDate] DESC

         در ضمن دیتابیس روی درایو D هست و فضای چند ده گیگ خالی داره. حجم فایل ldf هم تا حدود 400 مگ هست. وقتی هم یک کوئری بخوام روی دیتابیس اجرا کنم خطای زیر رو میده:
        Database 'Manager' is being recovered. Waiting until recovery is finished.