Bilindiği gibi bir veritabanından veri sildiğimizde fiziksel dosya boyutu aynı kalır. Fiziksel olarak dosya boyutunu küçültmek için shrink işlemi yapmamız gerekiyor.

Bazen shrink işlemi tepkisiz kalabiliyor. Bunun belli başlı sebepleri var. Data dosylarının tutarsız olması gibi yada initial boyutunun çok fazla olması gibi.

Eğer ki data dosyalarınız shrink işleminizin başarılı sonuçlanmasına rağmen aynı kalıyorsa çok büyük ihtimal initial size’ı yüksek kalmıştır. Yani aslında shrink başarılı. Fakat dosyanın başlangıç boyutu çok büyük olduğundan shrink olmamış gibi bir sonuç çıkıyor.

Bunun için shrink ekranında aşağıdaki adımları izleyerek dosya boyutunu azaltabilirsiniz;

AdventureWorks veritabanından gidelim;

Data dosyası toplam 282 MB ve bunun 101 MB kadarının boş olduğunu yazıyor.

Shrink ekranınında aşağıdaki seçeneklerden en üsttekini yani “Release unused space” seçeneğini seçtiğimizde tüm boş alanı bırakması gerekiyordu. Ama initial size buna izin vermedi.

Biz 2. seçeneği seçip “Shrink file to:” kısmına parantez içinde minimum olabilecek dosya boyutunu veriyoruz. Benim ekranımda 181 MB olarak giriyorum.


OK’i tıklamamız yeterli. Fakat canlı, büyük ve sık kullanılan veritabanlarında shrink işlemi kritik bir konum alıyor. Bunun önüne geçebilmek için. İşlemin scriptini alıyorum ve bu scripti veritabanını “Single Mode”a aldıktan sonra çalıştırıyorum;

 

-- Veritabanı Single Mode'a alınıyor.
USE [master]
GO
ALTER DATABASE [AdventureWorks] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO 

-- Shrink işlemi yapılıyor.
USE [AdventureWorks]
GO
DBCC SHRINKFILE (N'AdventureWorks_Data' , 181)
GO

-- Veritabanı MultiUser Mode'a alınıyor.
USE [master]
GO
ALTER DATABASE [AdventureWorks] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

 

Scripti çalıştırdıktan sonra tekrardan shrink ekranını açıp kontrol ediyorum.

Sonuç mükemmel

Ayrıca unutmamalıdır ki veritabanı single mode’a alındığında sadece ilk session erişim sağlayabilecektir.

Shrink ekranındaki 3. seçenek ( Emtpy file by migrating the data to other files in the same filegroup ) ise birden fazla data dosyası olduğunda, seçili olanın içini fiziksel olarak aynı filegrouptaki başka bir dosyaya aktarmak için kullanılıyor. Böylece .ndf dosyası tamamen silinebilir duruma geliyor.