محمد نصیری
بنیانگذار انجمن تخصصی فناوری اطلاعات ایران ، هکر کلاه خاکستری ، کارشناس امنیت اطلاعات و ارتباطات

Shrinking و Truncation در Transaction Log های SQL سرور چیست ؟

Transaction Log ها یک نقش حیاتی و اساسی در Database های SQL سرور دارند. با استفاده از Transaction Log ها شما می توانید تمامی موارد مورد نیاز جهت Backup گیری درست و بازیابی اطلاعات در مواقع حادثه را در کنار هم داشته باشید. اگر می خواهید اطلاعات بیشتری در خصوص Transaction Log ها داشته باشید می توانید به نکته بنده با عنوان منظور از Transaction Log در SQL سرور چیست؟ مراجعه کنید. به هر حال هر چند استفاده از این Log ها در SQL سرور امری حیاتی محسوب می شود اما مشکلاتی را نیز در پی دارد ، در یک Database بسیار فعال در سطح کلان ممکن است اطلاعاتی که در Transaction Log ها قرار می گیرند به شدت زیاد شوند و همین امر باعث بالا رفتن حجم این فایل و در نتیجه مصرف شدن فضای دیسک می شود. SQL سرور برای اینکه بتواند این مشکل حجم اطلاعات در Transaction Log ها را مدیریت کند از دو روش به نام های Truncation و Log File Shrinking استفاده می کند.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

کاربرد Log File Truncation در SQL سرور

Trunk کردن در اصطلاح یعنی بریدن و کوتاه کردن ، زمانیکه صحبت از Log File Truncation می شود کل اطلاعاتی که در Transaction Log ها موجود دارند از آن خارج و حذف می شوند ، البته این بدین معنا نیست که اطلاعات از بین می روند بلکه اطلاعات در Database اصلی قرار می گیرند. بصورت معمول خود SQL Server بصورت خودکار عملیات Truncation را انجام می دهد و نیازی به انجام دادن فرآیند های مدیریتی در اینکار نیست. وهله های زمانی که فرآیند Truncation انجام می شود کاملا بستگی به Recovery Model ای دارد که شما در Database خود استفاده کرده اید. اگر اطلاعات زیادی در خصوص Recovery Model ها در SQL سرور ندارید می توانید به مقاله بنده با عنوان معرفی انواع Recovery Model در SQL سرور مراجعه کنید.

هرگاه شما در Database های خود از مدل ریکاوری یا Recovery Model ای به شکل Full یا Bulk-logged استفاده کردید بعد از اینکه فرآیند Backup گیری از Transaction Log ها انجام شد اطلاعات موجود در Transaction Log ها را Truncate می کند. اگر شما از Simple Recovery Model استفاده می کنید ، به دلیل اینکه در این حالت ریکاوری که قابلیت بازگردانی Transaction Log ها را ندارد ، SQL سرور هر بار که Checkpoint ای ایجاد شود Transaction Log ها را Truncate می کند ، در واقع Truncate کردن یعنی خارج کرده اطلاعات از Transaction Log ها و وارد کرد اطلاعات در Database اصلی . همچنین علاوه بر این فرآیند های خودکار ، شما می توانید SQL سرور را مجبور کنید که بصورت خودکار طی وهله های زمانی معین اطلاعات موجود در Transaction Log ها را Truncate کند. مثلا شما می توانید به SQL سرور بگویید که یک عملیات Backup انجام دهد اما در این فرآیند فقط Truncation مربوط به Transaction Log ها را انجام دهد ، برای مثال دستور زیر برای شما فقط Transaction Log ها را Truncate می کند :

BACKUP LOG <database_name> WITH TRUNCATE_ONLY;

کاربرد Log Shrinking در SQL سرور

نکته منفی در خصوص Log Truncation این است که درست است که اطلاعات از فایل Transaction Log ها به Database منتقل می شوند و Truncate می شوند اما حجم فایل تغییری نمی کند و تغییری در میزان فضای اشغالی این موارد در هارد دیسک مشاهده نمی شود. این دقیقا چیزی است که شما در VMware در هنگام ایجاد کردن هارد دیسک ها بر می خورید اگر به خاطر داشته باشید اگر هارد دیسک خود را در حالت Thin Provision قرار بدهید در وهله اول اطلاعات حجم چندانی ندارند ، با وارد کردن اطلاعات درون این هارد مجازی فضای بیشتری اشغال می شود حال اگر این اطلاعات را از درون این هارد دیسک مجازی حذف کنید همچنان فضا اشغال شده است.

با توجه به اینکه SQL Server پیشبینی می کند که ممکن است حجم داده های موجود در Transaction Log های شما به همان اندازه قبلی که Truncate شده است برسد بنابراین فضای هارد دیسکی که برای نگهداری این Log ها استفاده کرده است را رها نمی کند. خوب طبیعی است که اگر این فرآیند ادامه پیدا کند ممکن است ظرفیت زیادی از دیسک شما به یکباره اشغال شود و حجم Log File شما نیز افزایش پیدا کند . در چنین مواقعی شما باید بصورت دستی طی فرآیندی به نام Shrinking فضای اشغال شده توسط Log را رها کنید ، واژه Shrink به معنی چروک کردن ، کوچک کردن و جمع کردن است و این کاری است که دقیقا شما قرار است انجام دهید ، در صورتیکه با چنین مواردی مواجه شدید می توانید با استفاده از دستوری شبیه به دستور زیر Transaction Log خود را Shrink کنید :

DBCC SHRINKFILE(<filename>,<desired_shrink_size>)

توجه کنید که در دستور بالا قسمت desired__Shrink__Size فضایی که شما می خواهید در نهایت برای Log File شما بر روی دیسک وجود داشته باشد ، این فضا بر اساس مگابایت در نظر گرفته می شود و بهترین زمان برای اینکه کمترین میزان حجم را در این قسمت قرار دهید زمانی است که Transaction Log شما Truncate شدن است و شما مطمئن هستید اطلاعاتی در Transaction Log وجود ندارد.


محمد نصیری
محمد نصیری

بنیانگذار انجمن تخصصی فناوری اطلاعات ایران ، هکر کلاه خاکستری ، کارشناس امنیت اطلاعات و ارتباطات

محمد نصیری هستم ، هکر قانونمند و کارشناس امنیت سایبری ، سابقه همکاری با بیش از 50 سازمان دولتی ، خصوصی ، نظامی و انتظامی در قالب مشاور ، مدرس و مدیر پروژه ، مدرس دوره های تخصص شبکه ، امنیت ، هک و نفوذ ، در حال حاضر در ایران دیگه رسما فعالیتی غیر از مشاوره انجام نمیدم و مقیم کشور ترکیه هستم ، عاشق آموزش و تدریس هستم و به همین دلیل دوره های آموزشی که ضبط می کنم در دنیا بی نظیر هستند.

نظرات