ورود

نسخه کامل مشاهده نسخه کامل : حذف فضای خالی دیتابیس SQL Server 2005



bad_boy_2007
03-12-2008, 23:33
سلام دوستان
من یه مشکل دارم ، وقتی که دیتابیسها بعد از یه مدت کار میکنن حجمشون بطور فزاینده ای بالا میره ، مثلا دیتابیس SQL Server2005 من که مربوط به یک سیستم مالیه حجمی در حدود 250 MByte داره .
یادمه تو اکسس گزینه Compac Database یا همچین چیزی رو میزدیم که دیتابیس اطلاعات اضافی رو حذف کنه ، اگه ممکنه راهنماییم کنین برای SQL Server 2005 باید چیکار کنم که حجم کاهش پیدا کنه ؟؟؟ :10:

_H2_
04-12-2008, 02:09
سلام
حجم دیتابیس عموماً به دو دلیل افزایش مییابد ( جدای از بحث افزایش دیتا)
فایل mdf
فایل ldf
!
(حتماً دارید فکر میکنید، این بابا هم چشم بسته زیر آبی ... !:31:)

فایل mdf دیتای اصلی را نگاه میدارد که به مرور زمان و با کارکردن، دارای فضاهای خالی اضافه ای هم میشود که با وجود افزایش حجم ولی بهتر است در صورت امکان این فضا را شیرینک نکنیم، چون وجود این فضاهای خالی اضافه موجب میشود sqlserver در قبال insert داده های جدید مجبور به بزرگ کرن فایل نشود که این کاری پر هزینه است و بازدهی را کاهش میدهد.

=====

ولی اغلب اوقات افراد به شرایط و قوانین حاکم بر ldf ها دقت نمیکنند و حجم ldf است که چندین و چند برابر دیتاهای اصلی میشود. (اگر کسی به شرایط دقت نکند.)

این فایل تمام اعمال انجام شده روی دیتابیس را نگاه میدارد!!
تا در صورت مشکل بتوان آخرین backupfull را اعمال کرد و تمام اعمال از زمان اخرین backup را دوباره و مجدداً اجرا کرد!!

نتیجتاً اگر recoverymodel دیتابیس شما روی full تنظیم شده باشد، از زمان اخرین backup ای که از دیتابیس گرفته اید (که احتمالاً نگرفته اید!) تمام اعمال و دستورات شما به صورت مجزا و پشت سرهم مثل یک جعبه سایه هواپیما در این فایل log ذخیره شده است و حجم را .... !

دو راه چاره اصلی دارید:
1) از کل دیتابیس backup full تهیه کنید تا فایل log آزاد شود (و احتمالاً دستی فایل log را شیرینک کنید.)
2) recoverymodel را روی sample قرار دهید تا کلاً sqlserver بیخیال backup شود. (و احتمالاً دستی فایل log را شیرینک کنید.)


دستور TSQL تهیه backupfull
BACKUP DATABASE [databasename] TO DISK = N'E:\filename.bak'

دستور TSQL تغییر recoverymodel
ALTER DATABASE [databasename] SET RECOVERY SIMPLE

دستور TSQL جهت شیرینک
(DBCC SHRINKFILE (N'databaselogfilename' , 0, TRUNCATEONLY

databaselogfilename نیاز به درج پسوند ldf ندارد.

موفق باشید.

bad_boy_2007
04-12-2008, 18:42
ممنون استاد :31:
توضیحاتت کامل و جامع بود
خیلی وقت بود که Full Backup از دیتابیسم نگرفته بودم
الان بکاپ کامل گرفتم حجم از 350 به 78 رسید که هنوز هم زیاده باید یه چیزی حدود 5 مگ باشه ، میشه بگی دلیلش چیه ؟؟ :20:

_H2_
05-12-2008, 02:15
سلام
در نهایت اگر فکر میکنید همچنان دیتابستان بزرگ است، ان را Shrink کنید که خیلی مشابه فرمان Compact در اکسس است.
اگر هر دو فایل ldf و mdf را شیرینک کنید، چیزی که باقی خواهد ماند دیگر حداقل دیتاهایتان است و دیگر قابل کاهش نیست.
(ldf شامل دیتا نیست و در حداقل سایز دو یا سه مگ میشود)

bad_boy_2007
06-12-2008, 00:00
سلام
در نهایت اگر فکر میکنید همچنان دیتابستان بزرگ است، ان را Shrink کنید که خیلی مشابه فرمان Compact در اکسس است.
اگر هر دو فایل ldf و mdf را شیرینک کنید، چیزی که باقی خواهد ماند دیگر حداقل دیتاهایتان است و دیگر قابل کاهش نیست.
(ldf شامل دیتا نیست و در حداقل سایز دو یا سه مگ میشود)

اوووووو اشتباه شد !
دیتابیس اصلیم که حدود 350 مگ حجم د اره رو ازش Backup کامل گرفتم حجمش تغییر نکرد ، Shrink هم کردم (هم دیتابیس و هم فایلها رو) ولی باز هم فایل Log حجم 356 مگ و فایل دیتابیس حجم 5 مگ داره ، بکاپ اطلاعاتم هم 4.9 مگ شده
دیتابیس حاوی اطلاعات فروش یک فروشگاه با دو کلاینت و یک سرور هست حدود 6 یا 7 جدول اصلی داره که تقریبا هر کدوم 4 تا 6 هزار رکورد داره ، حالا میشه بگید این حجم عادیه ؟؟
حجم دیتا تو فایل دیتابیس هست نه ؟؟؟ فایل Log توش دیتا های اصلی نیست نه ؟ فقط عملیات هایی رو که روی دیتا ها انجام دادیم رو سطر به سطر توضیح داده نه ؟ :20:

bad_boy_2007
06-12-2008, 00:10
یک بکاپ از دیتابیس رو تو یک دیتابیس جدید Restore کردم حجم کل دو تا فایل شد 5 مگ
ولی نفهمیدم هنوز چطور میتونم بدون ایجاد دیتابیس جدید فایل Log رو تمیز کنم

bad_boy_2007
06-12-2008, 00:45
:31:
حالا شد !
ممنون استاد عزیز ، ظاهرا من دو اجرای دستورات مشکل داشتم !
با این کد کارم راه افتاد :

BACKUP LOG DatabaseName WITH TRUNCATE_ONLY
DBCC SHRINKDATABASE (DatabaseName)

حالا میشه توضیح بدی این دستورات چه کاری انجام میدن ؟؟؟ :11:

_H2_
06-12-2008, 01:19
سلام

و فایل دیتابیس حجم 5 مگ داره
حجم اصلی دیتای شما همین مقدار است.


باز هم فایل Log حجم 356 مگ است
شاید اینطوری حل شود:

1- recoverymodel را sample کنید.
2- فایل log را شیرینک کنید.
3- درصورت تمایل مجدداً recoverymodel را full کنید.

(برای کلیه این اعمال میتوانید از رابط کاربری قوی SSMS هم استفاده کنید.)