📣#آموزش تفاوت truncate با shrink لاگ فایل
❓تا به حال پیش آمده است که قصد shrink کردن لاگ فایل را داشته باشید اما با اجرای دستور shrinkfile هیچ کاهش حجمی در لاگ فایل مشاهده نکنید!!!
📎همانطور که می دانید، در sql server از لاگ فایل جهت نگهداری سابقه عملیات انجام شده بر روی رکوردهای دیتابیس استفاده می شود و یکی از کاربردهای آن، ایجاد قابلیت بازگرداندن اطلاعات به وضعیت قبلی آن، در صورت بروز هر گونه مشکل(rollback شدن تراکنش و ...) است.
یک دیتابیس حداقل از یک فایل mdf برای نگهداری داده های اصلی و یک فایل ldf برای نگهداری سوابق تشکیل شده که در آن لاگ فایل(ldf) بر خلاف mdf که از pageها تشکیل شده، از قسمت هایی به نام VLF یا virtual log file تشکیل شده است و اطلاعات بصورت sequential در این vlfها نوشته می شوند. نکته مهم این است که vlfها قابل بازنویسی و استفاده مجدد هستند اگر یکی از رکوردهای موجود در یک vlf متعلق به تراکنش فعال باشد، این vlf در حالت used/active قرار دارد و قابل استفاده مجدد نیست. اما در صورتی که vlf قابل استفاده مجدد باشد در وضعیت free/inactive قرار می گیرد.
👌با پر شدن لاگ فایل، از ابتدای آن جهت یافتن vlf با حالت free جستجو می شود و در صورت آزاد بودن vlf مورد استفاده مجدد قرار می گیرد، در غیر اینصورت، لاگ فایل ما به اندازه file growth تعیین شده در تنظیمات دیتابیس رشد می کند.
توجه داشته باشید به عملیات آزادسازی vlf (تغییر از used به free) عملیات truncate گفته می شود و به عملیات کاهش حجم لاگ فایل shrink می گوییم.
👈ما با shrink کردن لاگ فایل در واقع vlfهایی که دارای وضعیت free/inactive هستند و هیچ مورد استفاده ای ندارند را از فضای لاگ فایل حذف می کنیم. نکته مهم این است که کاهش حجم لاگ فایل از انتهای آن به سمت آخرین vlf فعال انجام می شود. پس در نتیجه اگر آخرین vlf در لاگ فایل، مورد استفاده باشد شما هر چند بار هم که دستور shrinkfile را اجرا کنید باز هم حجم لاگ فایل کاهش پیدا نمی کند!
—----------------------------------------------------------------------------------
✍️برخی از مواردی که منجر به فعال بودن یک vlf می شوند:
1️⃣فعال بودن تراکنش
2️⃣عدم تهیه لاگ بک آپ در حالت full recovery model
3️⃣عدم commit، لاگ در سرور ثانویه در صورت استفاده از mirroring , ...
و ...
در آموزش های آتی به جزئیات بیشتری در این مورد خواهیم پرداخت .
محسن بندامیر
@mohsen_bandamir