لاگ فایل چیست؟
لاگ فایل یکی از فایلهای دیتابیس است که در زمان ایجاد دیتابیس ساخته میشود و کار آن ثبت تمام تراکنشها و تغییرات دیتابیس است. وجود لاگ فایل بسیار حیاتی است چرا که زمان وقوع مشکل، SQL Server از طریق آن میتواند وضعیت دیتابیس را به یک حالت پایدار برساند. به عنوان مثال اگر ما یک کوئری update بر روی یک جدولی که ۱۰۰ میلیون رکورد دارد اجرا کنیم اگر تا رکورد ۹۹ میلیون رفته باشد و سرور ریست شود زمانی که سرور بالا می آید SQL Server از طریق لاگ فایل، جدول مربوطه در دیتابیس را به حالت قبل از اجرای دستور Update برمیگرداند.
با دستور زیر میتوان وضعیت آنها و فایل های یک دیتابیس را مشاهده کرد:
USE <database name> GO EXEC sp_helpfile
رشد لاگ فایل به چه دلیل است؟
اگر تغییرات یک دیتابیس زیاد باشد به طبع آن رکوردها در لاگ فایل بیشتر و حجم لاگ فایل هم بزرگتر میشود.
چگونه می توان رشد لاگ فایل را کنترل کرد؟
به دو روش می توان رشد لاگ فایل را کنترل نمود:
۱– تغییر ریکاوری مدل به حالت Simple
اگر حساسیت دادهها در دیتابیس شما خیلی زیاد نیست و در صورت بروز مشکل بازگشت به آخرین فول بکاپ برای شما قابل پذیرش است پس بهتر است ریکاوری مدل دیتابیس خود را به صورت Simple قرار دهید. در این حالت زمانی که وضعیت تراکنشهای شما مشخص می شود فضای مرتبط با آن تراکنش در لاگ فایل مجددا مورد استفاده قرار میگیرد و این باعث میشود که رشد لاگ فایل کنترل شود.
با دستور زیر میتوانید وضعیت ریکاوری مدل دیتابیس خود را مشاهده نمایید:
SELECT name , recovery_model_desc FROM sys.databases WHERE name = '<database name>'
و با دستور زیر میتوان ریکاوری مدل خود را به حالت Simple تغییر داد:
USE [master] GO ALTER DATABASE <database name> SET RECOVERY SIMPLE WITH NO_WAIT GO
2- گرفتن Transaction Log Backup به صورت دورهایی
گرفتن این نوع بکاپ از دیتابیس باعث میشود فضای مورد استفاده تراکنشهایی که تعیین تکلیف شدهاند مجددا مورد استفاده قرار بگیرد. کاربرد این نوع بکاپها در دیتابیسهایی با حساسیت دادهایی بالا و نیاز به بازگردانی دیتابیس به یک لحظه زمانی خاص در صورت بروز مشکل است. برای گرفتن این نوع بکاپ میبایست حتما ریکاوری مدل دیتابیس Full و یک بار هم فول بکاپ از دیتابیس گرفته شده باشد.
برای گرفتن این نوع بکاپ میتوان از دستور زیر استفاده کرد:
BACKUP LOG [<db-name>] TO DISK = N'<location>\sdp-backup.trn' WITH NOFORMAT, NOINIT, NAME = N'<db-name>-Full Log Backup'
با توجه به اینکه معمولا این نوع بکاپها به صورت دورهایی و مرتب گرفته میشوند میتوانید در قالب یک job از دستور فوق و یا از Maintenance Plans استفاده نمایید.
نکته : حتی با رعایت کردن نکات بالا در شرایطی که حجم تغییرات در یک تراکنش بسیار زیاد باشد به ناچار این فایل رشد میکند. مثلا زمان Convert داده که حجم زیادی از دادهها تغییر میکنند این فایل به شدت رشد میکند.
کاهش فضای Log File با استفاده از Shrink کردن
پس از بکاپگیری از Log File در حالت فول میتوانیم با Shrink کردن فایل Log، حجم دیتابیس آن را کاهش دهیم.
برای اینکار در SQL Server Management Studio روی پایگاه داده خود راست کلیک کنید ، به Tasks -> Shrink -> Files بروید.
در پنجره Shrink File در بخش File Type گزینه Log را انتخاب کنید و در بخش Shrink Action گزینه Release unused space را انتخاب کرده و OK را بزنید تا عملیات Shrinking آغاز شده و فضای اختصاص یافته به Log File در دیتابیس مجددا آزاد گردد.