DBCC SHRINKFILE (Transact-SQL)
Geçerli veritabanının belirtilen verilerinin veya günlük dosyasının boyutunu küçültür veya belirtilen bir dosyadaki verileri aynı dosya grubundaki başka dosyalara taşıyıp dosyayı boşaltarak dosyanın veritabanından kaldırılmasına izin verir. Bir dosyayı dosya oluşturulduğunda belirtilen boyuttan daha düşük bir boyuta küçültebilirsiniz. Bu, dosyanın en düşük boyutunu yeni değere sıfırlar.
Transact-SQL Sözdizim Kuralları
Sözdizimi
DBCC SHRINKFILE
(
{ file_name | file_id }
{ [ , EMPTYFILE ]
| [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ]
}
)
[ WITH NO_INFOMSGS ]
Bağımsız değişkenler
file_name
Küçültülecek dosyanın mantıksal adıdır.file_id
Küçültülecek dosyanın kimlik (ID) numarasıdır. Bir dosya kimliği edinmek için FILE_IDEX sistem işlevini kullanın veya geçerli veritabanındaki sys.database_files katalog görünümünü sorgulayın.target_size
Dosyanın tamsayı olarak ifade edilen megabayt olarak boyutudur. Belirtilmezse, DBCC SHRINKFILE dosyanın boyutunu varsayılan boyuta küçültür. Varsayılan boyut, dosya oluşturulduğunda belirtilen boyuttur.[!NOT]
Boş bir dosyanın varsayılan boyutunu DBCC SHRINKFILE target_size komutunu kullanarak düşürebilirsiniz. Örneğin, 5 MB'lik bir dosya oluşturur ve sonra dosya boşken dosyayı 3 MB'ye küçültürseniz, varsayılan dosya boyutu 3 MB'ye ayarlanır. Bu, yalnızca hiç veri içermemiş boş dosyalar içindir.
Bu seçenek FILESTREAM dosya grubu kapsayıcıları için desteklenmez.
target_size belirtilirse, DBCC SHRINKFILE dosyayı belirtilen boyuta küçültmeye çalışır. Dosyanın geri kazanılacak kısmındaki kullanılmış sayfalar dosyanın tutulan kısmındaki boş alana yerleştirilir. Örneğin, 10 MB'lik bir veri dosyası varsa, target_size parametresi 8 olan bir DBCC SHRINKFILE işlemi dosyanın son 2 MB'sinde kullanılmış tüm sayfaların dosyanın ilk 8 MB'sindeki kullanılmamış sayfalara yerleştirilmesine neden olur. DBCC SHRINKFILE, bir dosyayı dosyadaki verileri saklamak için gereken boyutun ötesinde küçültmez. Örneğin, 10 MB'lik bir veri dosyasının 7 MB'si kullanıldıysa, target_size parametresi 6 olan bir DBCC SHRINKFILE deyimi dosyayı 6 MB'ye değil 7 MB'ye küçültür.
EMPTYFILE
Tüm verileri belirtilen dosyadan aynı dosya grubundaki başka dosyalara geçirir. Veritabanı Altyapısı verilerin boş dosyaya konmasına artık izin vermediğinden, dosya ALTER DATABASE deyimi kullanılarak kaldırılabilir.FILESTREAM dosya grubu kapsayıcılarında, FILESTREAM Atık Toplayıcı çalıştırılıp EMPTYFILE komutunun başka bir kapsayıcıya kopyaladığı tüm gereksiz dosya grubu kapsayıcı dosyalarını silinceye kadar, dosya, ALTER DATABASE kullanılarak kaldırılamaz. Daha fazla bilgi için bkz. sp_filestream_force_garbage_collection (Transact-sql).
[!NOT]
Bir FILESTREAM kapsayıcısını kaldırma hakkında daha fazla bilgi için, alter database dosya ve dosya grubu seçenekleri (Transact-sql) bölümündeki ilgili kısma bakın
NOTRUNCATE
target_percent parametresini kullanarak veya kullanmadan, bir veri dosyasının sonundaki yer ayrılmış sayfaları dosyanın önündeki yer ayrılmamış sayfalara taşır. Dosyanın sonundaki boş alan işletim sistemine döndürülmez ve dosyanın fiziksel boyutu değişmez. Dolayısıyla NOTRUNCATE belirtildiğinde dosya küçülmemiş gibi durur.NOTRUNCATE yalnızca veri dosyalarına uygulanabilir. Günlük dosyaları etkilenmez.
Bu seçenek FILESTREAM dosya grubu kapsayıcıları için desteklenmez.
TRUNCATEONLY
Dosyanın sonundaki tüm boş alanı işletim sistemine bırakır ancak dosya içinde hiçbir sayfa taşıma gerçekleştirmez. Veri dosyası yalnızca ayrılan son kapsama küçültülür.TRUNCATEONLY ile belirtilirse target_size yoksayılır.
TRUNCATEONLY yalnızca veri dosyalarına uygulanabilir. Bu seçenek FILESTREAM dosya grubu kapsayıcıları için desteklenmez.
WITH NO_INFOMSGS
Tüm bilgi iletilerini kapatır.
Sonuç Kümeleri
Aşağıdaki tabloda, sonuç kümesinin sütunlarını açıklanmaktadır.
Sütun adı |
Açıklama |
---|---|
DbId |
Veritabanı Altyapısı uygulamasının küçültmeye çalıştığı dosyanın veritabanı kimlik numarası. |
FileId |
Veritabanı Altyapısı uygulamasının küçültmeye çalıştığı dosyanın dosya kimlik numarası. |
CurrentSize |
Dosyanın halen kapsadığı 8 KB'lik sayfaların sayısı. |
MinimumSize |
Dosyanın kapsayabileceği en düşük 8 KB'lik sayfa sayısı. Bir dosyanın en küçük boyutuna veya ilk oluşturulduğundaki boyutuna karşılık gelir. |
UsedPages |
Dosyanın halen kullandığı 8 KB'lik sayfaların sayısı. |
EstimatedPages |
Veritabanı Altyapısı uygulamasının dosyanın küçültülebileceğini tahmin ettiği 8 KB'ik sayfaların sayısı. |
Açıklamalar
DBCC SHRINKFILE geçerli veritabanındaki dosyalara uygulanır. Geçerli veritabanının nasıl değiştirildiği hakkında daha fazla bilgi için, bkz. USE (Transact-sql).
DBCC SHRINKFILE işlemleri sürecin herhangi bir noktasında durdurulabilir ve o zamana kadar tamamlanan iş korunabilir.
Bir DBCC SHRINKFILE işlemi başarısız olduğunda bir hata çıkarılır.
Küçültülmekte olan veritabanının tek kullanıcı modunda olması gerekmez; dosya küçültülürken diğer kullanıcılar veritabanı üzerinde çalışabilir. Sistem veritabanlarını küçültmek için SQL Server'ı tek kullanıcı modunda çalıştırmanız gerekmez.
Günlük Dosyası Küçültme
Veritabanı Altyapısı, günlük dosyalarında tüm günlüğün hedef boyutunu hesaplamak için target_size parametresini kullanır; dolayısıyla target_size, küçültme işleminden sonra günlükte kalan boş disk alanı miktarıdır. Tüm günlüğün hedef boyutu daha sonra her günlük dosyasının dosya boyutuna çevrilir. DBCC SHRINKFILE her fiziksel günlük dosyasını hemen hedef boyutuna küçültmeye çalışır. Ancak mantıksal günlüğün bir kısmı hedef boyutun ötesinde sanal günlüklerde duruyorsa, Veritabanı Altyapısı olabildiğince çok yer açar ve sonra bir bilgi iletisi gönderir. İleti, mantıksal günlüğün dosyanın sonundaki sanal günlüklerden dışarı taşınması için hangi işlemlerin yapılması gerektiğini açıklar. İşlemler gerçekleştirildikten sonra DBCC SHRINKFILE, kalan alanı boşaltmak için kullanılabilir.
Bir günlük dosyası yalnızca sanal bir günlük dosyası sınırlarına küçültülebileceğinden, günlük dosyasını sanal bir günlük dosyasından daha küçük bir boyuta küçültmek, dosya kullanılmıyor olsa bile olanaklı olamayabilir. Sanal günlük dosyasının boyutu, günlük dosyaları oluşturulduğunda veya genişletildiğinde Veritabanı Altyapısı tarafından dinamik olarak seçilir.
En İyi Yöntemler
Bir dosyayı küçültmeyi planlarken aşağıdaki bilgileri göz önüne alın:
Küçültme işlemi en iyi sonucu çok miktarda kullanılmayan alan oluşturan bir işlemden; örneğin bir tablonun kısaltılmasından veya bırakılmasından sonra verir.
Çoğu veritabanı, günlük işlemler için bir miktar boş alanın kullanılabilmesini gerektirir. Bir veritabanını tekrar tekrar küçültüp veritabanı boyutunun tekrar büyüdüğünü görürseniz, bu, küçültülen alanın olağan işlemler için gerekli olduğunu gösterir. Bu durumlarda veritabanını tekrar tekrar küçültmek boşa giden bir işlemdir.
Küçültme işlemi, veritabanındaki dizinlerin parçalanma durumunu korumaz ve genel olarak parçalanmayı biraz artırır. Bu, veritabanını tekrar tekrar küçültmemek için bir başka nedendir.
Sorun giderme
Bu bölüm, DBCC SHRINKFILE komutu çalıştırılırken oluşabilecek sorunların nasıl tanılanıp düzeltileceğini anlatmaktadır.
Dosya Küçülmüyor
Küçültme işlemi hatasız çalışır ancak dosyanın boyutunun değişmediği görülürse, aşağıdaki işlemlerden birini gerçekleştirerek dosyanın kaldırmak için yeterli boş alanı olduğunu doğrulayın:
Aşağıdaki sorguyu çalıştırın.
SELECT name ,size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB FROM sys.database_files; SELECT name ,size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB FROM sys.database_files;
İşlem günlüğünde kullanılan alanı geri döndürmek için DBCC SQLPERF komutunu çalıştırın.
Yeterli boş alan varsa, küçültme işlemi dosya boyutunu daha fazla düşüremez.
Küçülmediği görülen genellikle günlük dosyasıdır. Bu, genellikle, kısaltılmamış bir günlük dosyasının sonucudur. Günlük dosyasını, veritabanı kurtarma modelini SIMPLE olarak ayarlayarak veya günlüğü yedekleyip sonra DBCC SHRINKFILE işlemini tekrar çalıştırarak kısaltabilirsiniz.
Küçültme İşlemi Engelleniyor
Küçültme işleminin, satır sürümü tabanlı bir yalıtım düzeyi altında çalışmakta olan bir işlem tarafından engellenmesi olasıdır. Örneğin, bir DBCC SHRINK DATABASE işlemi yürütüldüğünde satır sürümü tabanlı bir yalıtım düzeyi altında çalışan büyük bir silme işlemi sürmekteyse, küçültme işlemi, dosyaları küçültmeden önce silme işleminin tamamlanmasını bekler. Bu olduğunda, DBCC SHRINKFILE ve DBCC SHRINKDATABASE işlemleri, SQL Server hata günlüklerine ilk bir saat boyunca her beş dakikada bir ve daha sonra her saatte bir bir bilgi iletisi (SHRINKDATABASE için 5202 ve SHRINKFILE için 5203) yazar. Örneğin, hata günlüğü aşağıdaki hata iletisini içeriyorsa, aşağıdaki hata oluşur:
DBCC SHRINKFILE for file ID 1 is waiting for the snapshot
transaction with timestamp 15 and other snapshot transactions linked to
timestamp 15 or with timestamps older than 109 to finish.
DBCC SHRINKFILE for file ID 1 is waiting for the snapshot
transaction with timestamp 15 and other snapshot transactions linked to
timestamp 15 or with timestamps older than 109 to finish.
Bu, küçültme işleminin, tamamladığı son işlemin zaman damgası olan 109'dan daha eski anlık görüntü işlemleri tarafından engellendiği anlamına gelir. Bu, ayrıca, sys.dm_tran_active_snapshot_database_transactions dinamik yönetim görünümündeki transaction_sequence_num veya first_snapshot_sequence_num sütunlarının 15 değerini içerdiğini de gösterir. Görünümdeki transaction_sequence_num veya first_snapshot_sequence_num sütunları bir küçültme işleminin tamamladığı son işlemden (109) daha küçük bir sayı içeriyorsa, küçültme işlemi bu işlemlerin tamamlanmasını bekler.
Sorunu çözmek için aşağıdaki görevlerden birini gerçekleştirebilir:
Küçültme işlemini engelleyen işlemi sonlandırın.
Küçültme işlemini sonlandırın. Küçültme işlemi sonlandıysa, tamamlanan tüm işler korunur.
Bir şey yapmayın ve küçültme işleminin engelleme işlemleri tamamlanana kadar beklemesine izin verin.
İzinler
sysadmin sabit sunucu rolüne veya db_owner sabit veritabanı rolüne üye olmayı gerektirir.
Örnekler
A.Veri dosyasını belirtilen hedef boyuta küçültme
Aşağıdaki örnek, UserDB kullanıcı veritabanındaki DataFile1 adlı bir veri dosyasının boyutunu 7 MB'ye küçültmektedir.
USE UserDB;
GO
DBCC SHRINKFILE (DataFile1, 7);
GO
B.GÜnlük dosyasını belirtilen hedef boyuta küçültme
Aşağıdaki örnek, AdventureWorks veritabanındaki günlük dosyasının boyutunu 1 MB'ye küçültmektedir. DBCC SHRINKFILE komutunun dosyayı küçültmesine izin vermek için, dosya ilk önce veritabanı kurtarma modeli SIMPLE seçeneğine ayarlanarak kısaltılmaktadır.
USE AdventureWorks2012;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks2012
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks2012_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks2012
SET RECOVERY FULL;
GO
C.Veri dosyasını kısaltma
Aşağıdaki örnek AdventureWorks veritabanındaki ana veri dosyasını kısaltmaktadır. Veri dosyasının file_id değerini almak için sys.database_files katalog görünümü sorgulanmaktadır.
USE AdventureWorks2012;
GO
SELECT file_id, name
FROM sys.database_files;
GO
DBCC SHRINKFILE (1, TRUNCATEONLY);
D.Dosya boşaltma
Aşağıdaki örnek, veritabanından kaldırılabilmesi için bir dosyanın boşaltılma yordamını göstermektedir. Örneğin çalışabilmesi için önce bir dosya oluşturulup dosyanın veri içerdiği varsayılmaktadır.
USE AdventureWorks2012;
GO
-- Create a data file and assume it contains data.
ALTER DATABASE AdventureWorks2012
ADD FILE (
NAME = Test1data,
FILENAME = 'C:\t1data.ndf',
SIZE = 5MB
);
GO
-- Empty the data file.
DBCC SHRINKFILE (Test1data, EMPTYFILE);
GO
-- Remove the data file from the database.
ALTER DATABASE AdventureWorks2012
REMOVE FILE Test1data;
GO
Ayrıca bkz.
Başvuru
alter veritabanı (Transact-sql)
dbcc SHRINKDATABASE (Transact-sql)
sys.database_files (Transact-sql)