خانه > Administration, Persian Contents, SQL Server > خلاص شدن از دست حجم زیاد فایل‌های Log در SQL Server

خلاص شدن از دست حجم زیاد فایل‌های Log در SQL Server

مدت‌ها است که دارای یک فایل پایگاه داده هستیم که حجم خود فایل داده‌ها (mdf) حدود ۴۵۰ مگابایت است، این در حالی است که حجم فایل log آن حدود ۱۲.۵ گیگابایت است. این حجم زیاد مشکلاتی برای ما ایجاد کرده بود از جمله از بین بردن فضای هارددیسک سرورمان و بالا بودن حجم آن برای ارسال ازطریق اینترنت.

همان‌طور که می‌دانید هر پایگاه داده شامل ۲ فایل می‌باشد، فایل اول، فایل اصلی است که اصل داده‌ها روی آن نگهداری می‌شوند (فایلی با پسوند mdf)  و حجم آن عددی کاملا متعارف است. دومین فایل مربوط به ثبت وقایع اتفاق افتاده روی پایگاه داده است و هر تراکنشی که روی پایگاه داده انجام می‌شود روی این فایل ذخیره می‌شود (فایلی با پسوند ldf)، به همین دلیل حجم این فایل به سرعت در حال زیاد شدن است و زمانی که کل فضای هارددیسک را اشغال کند، عملا دیگر هیچ عملیاتی روی پایگاه داده انجام نمی‌شود. لازم به ذکر است که ابزارهایی برای بازیابی داده‌ها از روی این فایل وجود دارد.

فکر می‌کردم که با یک Shrink ساده از طریق خود SQL Server  می‌توانم این فضا را آزاد کنم ولی وقتی این کار را انجام دادم دیدم که فقط حدود یک گیگابایت از حجم آن کم شده که اصلا برای من قابل قبول نبود. به همین منظور کمی در این زمینه مطالعه کردم و به جاهای خوبی رسیدم.

یادمه که در نسخه ۲۰۰۰ می‌توانستیم یک پایگاه داده را Detach کنیم و فایل ldf مربوط به آن را حذف کنیم، زمانیکه دوباره پایگاه داده را attach می‌کردیم یک فایل ldf جدید ساخته می‌شد اما در نسخه‌های بعد از آن چنین امکانی وجود ندارد.

در نسخه‌های جدید برای shrink کردن ابتدا باید عملیات log truncation را انجام دهیم. این عملیات در دو حالت اتفاق می‌افتد:

۱- در مدل بازیابی ساده (simple recovery model) بعد از یک checkpoint اتفاق می‌افتد.

۲- در مدل بازیابی کامل (full recovery model) و مدل بازیابی bulked-log ، پس از پشتیبان‌گیری از log .

هر فایل log دارای یک بخش غیرفعال است که در عملیات  truncate کردن فقط این بخش از پایگاه داده آزاد می‌شود. بخش غیر فعال به بخشی گفته می‌شود که مربوط به اتفاقاتی است که commit شده‌اند و عملا بودن یا نبودن آن‌ها هیچ مزیتی برای ما ندارند.

طبق مواردی که در بالا بیان شد برای اینکه بتوانیم حجم این فایل را کم کنیم باید ابتدا عملیات truncation را انجام دهیم و سپس آن را shrink کنیم. برای truncate کردن باید از فایل log پشتیبان بگیریم. برای انجام این کار از طریق SQL Server Management Studio کاری شبیه به پشتیبان‌گیری معمولی انجام می‌شود، فقط باید نوع پشتیبان‌گیری را از نوع  Transaction Log انتخاب کرد. زمانی که این نوع انتخاب شود می‌توان از بخش Options تعیین کرد که آیا عملیات truncate کردن انجام شود یا خیر. از این بخش مقدار پیش‌فرض را تغییر ندهید. زمانی‌که محل مورد نظر برای پشتیبان‌گیری را انتخاب کردید روی دکمه OK کلیک کنید تا پشتیبان‌گیری انجام شود.

بعد از این مرحله برای shrink کردن پایگاه داده روی نام پایگاه داده کلیک راست ماوس را زده و از بخش Tasks گزینه Shrink و سپس Database را انتخاب نمایید و روی دکمه OK در صفحه جدید کلیک نمایید. با این کار حجم فایل من که حدود ۱۲.۵ گیگابایت بود به حدود ۱۶۰ مگابایت رسید!!!؟؟!!

دسته‌ها:Administration, Persian Contents, SQL Server برچسب‌ها: , , , ,
  1. سپتامبر 25, 2010 در 4:07 ب.ظ.

    ممنون استفاده کردیم:)

  2. مصطفی
    سپتامبر 25, 2010 در 6:25 ب.ظ.

    Recovey mode رو Simple کنید تا لازم نباشه هر دفعه Truncate کنید .

    • سپتامبر 25, 2010 در 7:55 ب.ظ.

      انجام این کار خیلی توصیه نمیشود.

      • مصطفی
        سپتامبر 27, 2010 در 6:57 ب.ظ.

        وقتی PIT Recovery رو لازم ندای , چرا Simple نباشه ؟

      • سپتامبر 28, 2010 در 3:20 ب.ظ.

        در این صورت باید simple باشد.

  3. سحر
    سپتامبر 25, 2010 در 8:12 ب.ظ.

    خیلی عالی بود

  4. سپتامبر 25, 2010 در 9:42 ب.ظ.

    من فکر کنم توی 2005 هم من detach میکنم و بعد که وصل میکنم فایل جدید ساخته شده ؟!

    • سپتامبر 25, 2010 در 10:40 ب.ظ.

      سلام دوست عزیز

      فکر نمی‌کنم چنین اتفاقی بیفتد.

  5. سپتامبر 26, 2010 در 1:58 ب.ظ.

    با سلام و تشکر از شما بابت این پست
    میخواستم بدونم دلیل استفاده از مدل full تو دیتابیس شما چی بوده؟؟؟
    با توجه به اینکه دنبال راهکاری برای فرار از دست حجم زیاد لاگ هم هستید

    • سپتامبر 26, 2010 در 2:17 ب.ظ.

      سلام

      چون داده‌های بسیار حساسی داشتیم همیشه می‌بایستی از این نوع استفاده می‌کردیم تا در صورت بروز مشکل بتوانیم آن را حل نماییم.

  6. سپتامبر 26, 2010 در 2:43 ب.ظ.

    پس با این اوصاف شما 12 گیگ سابقه ی این بانک رو پاک کردید(فایل لاگ)
    حالا برفرض اگه بخواهید دیتاتون رو به ۱ هفته قبل برگردونید چیکار میکنید؟؟؟؟

    • سپتامبر 26, 2010 در 2:50 ب.ظ.

      دوست عزیز این مورد زمانی اتفاق افتاد که می‌خواستم یک پایگاه داده خالی داشته باشم. یعنی داده‌های اصلی رو حذف کردم ولی فایل لاگ همچنان حجم زیادی داشت. در ضمن حذف لاگ مربوط به داده‌هایی که commit شده‌اند مشکلی ایجاد نمی‌کند. (از آنجایی که از درستی داده‌ها اطمینان دارند)

  7. حمید
    سپتامبر 26, 2010 در 3:08 ب.ظ.

    سلام
    خیلی ممنونم.
    اگه ممکنه در مورد نحوه تعریف backup deffrentioal, full نیز راهنمایی کنید()

    • سپتامبر 26, 2010 در 4:50 ب.ظ.

      سلام دوست عزیز
      قبلا مطلبی در این زمینه نوشته بودم. لطفا به آن مراجعه فرمایید.

  8. سپتامبر 26, 2010 در 3:30 ب.ظ.

    پس شما در واقع میخواستید فایل لاگ رو بپرونید
    روشی که من برای پراندن لاگ استفاده میکنم
    ۱-عوض کردن به simple
    2-عوض کردن به Full
    با این روش لاگ جدید برای شما ساخته میشه با حجمی کمتر از ۱۶۰ مگابایت

  9. مهدی سیل سپور
    سپتامبر 26, 2010 در 10:55 ب.ظ.

    دوست گرامی در ورژن های جدید هم میتوان دیتابیس را Dettach کرد و لاگ فابل آن را پاک نمود و مجددا از طریق کامند sp_attach_db آن را مجددا Attach نمود.قابل ذکر است از طریق Wizard خود SQL برای Attach نمودن دیتابیس ، این کار امکان پذیر نمیباشد.
    موفق باشید.

    • سپتامبر 26, 2010 در 11:18 ب.ظ.

      دوست عزیز بابت مطلبی که نوشتید ممنونم.

  10. سپتامبر 27, 2010 در 4:20 ب.ظ.

    در اراکل اگر دیزاین درست نباشد, کم کردن حجم فایلها به سختی امکانپذیر است.
    در اینجا شما نحبه هستید.

  11. ژوئن 13, 2011 در 8:35 ق.ظ.

    سلام
    در يكي از سيستمهايي كه در اختيار من است، سايز لاگ فايل به 840 گيگا بايت رسيده و همين موضوع باعث پر شدن فضاي سرور و كند شدن ثبت اطلاعتم شده. از يه طرف نگرانم با انجام روشهاي گفته شده توسط دوستان، backup هايي كه قبلا گرفتم قابل Restore كردن نباشه. ممكنه منو بيشتر راهنمايي كنيد ؟

    • ژوئن 13, 2011 در 7:55 ب.ظ.

      دوست عزیز ۱ گیگ و ۸۴۰ گیگ خیلی فرقی نداره. در ضمن اگر هاردی با حجم زیاد دارید می‌توانید این کار را روی یک کپی از پایگاه داده تست نمایید.

  12. رامين
    ژوئن 28, 2011 در 6:50 ب.ظ.

    سلام
    من از SQL 2008 استفاده ميكنم. Database من الان حجمشGIG 30 هست ، ولاگ فايل من 13MB من ميخوام روي يكي از Table ها يك Query اجرا كنم كه بشدت حجم لاگ فايلو بالا ميبره. Recovery Model رو Simple گذاشتم و Auto growth براي لاگ فايلو رو هم disable كردم. ,ولي زمانيكه Store procedure مربوطه رو Run ميكنم بلافاصله Error ميگيرم كه لاگ فايل پر شده!
    اينم بگم كه توي sys.databases رو هم چك كردم مقدار log_reuse_wait 0 ,و log_reuse_wait_desc مقدار Nothing داره كه مطابق reference قاعدتا نبايد مشكلي باشه. آيا كسي ميتونه كمكي بكنه توي اين زمينه.
    قبلا سپاسگزاري ميكنم
    رامين

  1. No trackbacks yet.

پاسخی بگذارید

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

نشان‌وارهٔ وردپرس.کام

شما در حال بیان دیدگاه با حساب کاربری WordPress.com خود هستید. بیرون رفتن / تغییر دادن )

تصویر توییتر

شما در حال بیان دیدگاه با حساب کاربری Twitter خود هستید. بیرون رفتن / تغییر دادن )

عکس فیسبوک

شما در حال بیان دیدگاه با حساب کاربری Facebook خود هستید. بیرون رفتن / تغییر دادن )

عکس گوگل+

شما در حال بیان دیدگاه با حساب کاربری Google+ خود هستید. بیرون رفتن / تغییر دادن )

درحال اتصال به %s

%d وب‌نوشت‌نویس این را دوست دارند: