Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Microsoft Fabric'te SQL veritabanı
Geçerli olan veritabanındaki belirtilen veri veya günlük dosyası boyutunu küçültür. Dosyayı boşaltan ve veritabanının kaldırılmasına izin veren bir dosyadan aynı dosya grubundaki diğer dosyalara veri taşımak için bu dosyayı kullanabilirsiniz. Bir dosyayı oluşturma sırasında boyutunun altına küçülterek en düşük dosya boyutunu yeni değere sıfırlayabilirsiniz.
Küçültme uzun süreli ve kaynak yoğun bir operasyon olduğu için sadece gerekli olduğunda kullanın DBCC SHRINKFILE .
Not
Küçültme işlemlerini düzenli bakım olarak görmeyin. Düzenli ve yinelenen iş işlemleri nedeniyle büyüyen veri ve günlük dosyaları için küçültme işlemleri gerekmez.
Transact-SQL söz dizimi kuralları
Sözdizimi
DBCC SHRINKFILE
(
{ file_name | file_id }
{ [ , EMPTYFILE ]
| [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ]
}
)
[ WITH
{
[ WAIT_AT_LOW_PRIORITY
[ (
<wait_at_low_priority_option_list>
) ]
]
[ , NO_INFOMSGS ]
}
]
<wait_at_low_priority_option_list> ::=
<wait_at_low_priority_option>
| <wait_at_low_priority_option_list> , <wait_at_low_priority_option>
<wait_at_low_priority_option> ::=
ABORT_AFTER_WAIT = { SELF | BLOCKERS }
Tartışmalar
file_name
Dosyanın küçültülmesi gereken mantıklı adı.
file_id
Dosyanın küçültülmesi gereken kimlik (ID) numarası. Dosya kimliği almak için FILE_IDEX sistem işlevini kullanın veya geçerli veritabanındaki sys.database_files katalog görünümünü sorgular.
hedef_boyut
Dosyanın yeni megabayt boyutunu temsil eden bir tamsayı.
target_size'yi0 ayarlarsanız veya belirtmezseniz, DBCC SHRINKFILE dosya oluşturulduğu boyuta düşürülür.
DBCC SHRINKFILE <target_size>kullanarak boş bir dosyanın varsayılan boyutunu küçültebilirsiniz. Örneğin, 5 MB'lık bir dosya oluşturur ve sonra dosya boşken dosyayı 3 MB'a küçültürseniz, varsayılan dosya boyutu 3 MB olarak ayarlanır. Bu yalnızca hiç veri içermeyen boş dosyalar için geçerlidir.
Bu seçenek FILESTREAM dosya grubu kapsayıcıları için desteklenmez.
Belirtilirse, DBCC SHRINKFILE dosyayı target_size daraltmaya çalışır. Boşaltılacak dosyanın alanındaki kullanılan sayfalar, dosyanın tutulan alanlarındaki boş alana taşınır. Örneğin, 10 MB veri dosyasıyla, DBCC SHRINKFILE8 içeren bir işlemi, dosyanın son 2 MB içindeki tüm kullanılan sayfaları dosyanın ilk 8 MB'lık ayrılmamış sayfalarına taşır.
DBCC SHRINKFILE, gerekli depolanan veri boyutunu geçen bir dosyayı küçültmez. Örneğin, 10 MB'lık bir veri dosyasının 7 MB'ı kullanılırsa, 6 DBCC SHRINKFILE içeren bir deyimi dosyayı 6 MB'a değil yalnızca 7 MB'a küçültür.
Eğer ileTRUNCATEONLYtarget_size belirtirseniz, DBCC SHRINKFILE dosyanın sonunda boş alan açmayabilir.
BOŞ DOSYA
Belirtilen dosyadaki tüm verileri aynı dosya grubundaki diğer dosyalara geçirir. Başka bir deyişle, EMPTYFILE belirtilen bir dosyadaki verileri aynı dosya grubundaki diğer dosyalara geçirir.
EMPTYFILE, bu dosya salt okunur olmasa da dosyaya yeni veri eklenmemesini sağlar. Bu ALTER DATABASE ifadeyi kullanarak bir dosyayı kaldırabilirsiniz. Dosya boyutunu değiştirmek için bu ALTER DATABASE ifadeyi kullanırsanız, yalnızca okuma bayrağı sıfırlanır ve veri eklenebilir.
FILESTREAM dosya grubu kapsayıcıları için, FILESTREAM Çöp Toplayıcısı çalıştırılıp, ALTER DATABASE tarafından başka bir kapsayıcıya kopyalanan tüm gereksiz dosya grubu kapsayıcı dosyalarını sildikten sonra, dosyayı kaldırmak için EMPTYFILE kullanamazsınız. Daha fazla bilgi için bkz. sp_filestream_force_garbage_collection. FILESTREAM konteynerinin kaldırılması hakkında bilgi için, Dosya ve Dosya Grubu Seçenekleri bölümündeki ilgiliALTER DATABASE bölüme bakınız.
EMPTYFILEAzure SQL Veritabanı, Azure SQL Veritabanı Hyperscale veya Microsoft Fabric'te SQL veritabanı desteklenmez.
NOT ÇALIŞMASI
target_percentbelirterek veya belirtmeden, ayrılmış sayfaları bir veri dosyasının sonundan dosyanın önündeki ayrılmamış sayfalara taşır. Dosyanın sonundaki boş alan işletim sistemine döndürülmüyor ve dosyanın fiziksel boyutu değişmez. Bu nedenle, NOTRUNCATE belirtilirse dosya küçülmeyecek gibi görünür.
NOTRUNCATE yalnızca veri dosyaları için geçerlidir. Günlük dosyaları etkilenmez.
Bu seçenek FILESTREAM dosya grubu kapsayıcıları için desteklenmez.
SADECE KESİNTİ
Dosyanın sonundaki tüm boş alanı işletim sistemine bırakır, ancak dosya içinde herhangi bir sayfa hareketi gerçekleştirmez. Veri dosyası yalnızca son ayrılan ölçüde küçültüldü.
ile target_size belirtilirseTRUNCATEONLY, dosyanın sonundaki boş alan serbest bırakılmayabilir.
Bu TRUNCATEONLY seçenek günlükteki bilgileri taşımaz, ancak kayıt dosyasının sonundan aktif olmayan sanal log dosyalarını (VLF) kaldırır. Bu seçenek FILESTREAM dosya grubu kapsayıcıları için desteklenmez.
BİLGİ_MSJSIZ
Tüm bilgilendirme iletilerini gizler.
Küçültme işlemleriyle WAIT_AT_LOW_PRIORITY
Şunlara uygulanır: SQL Server 2022 (16.x) ve sonraki sürümler, Azure SQL Veritabanı, Azure SQL Yönetilen Örneği, SQL database in Microsoft Fabric
Düşük öncelikli bekleme özelliği, küçültme işlemi sırasında kilit çatışmasını azaltır. Daha fazla bilgi için bkz. DBCC SHRINKFILE ile eşzamanlılık sorunlarını anlamak.
Bu özellik, çevrimiçi dizin işlemleri ile bazı farklılıklarlaWAIT_AT_LOW_PRIORITY özelliğine benzer.
- Seçeneği
ABORT_AFTER_WAITNONEbelirtemezsiniz. - Seçeneği
MAX_DURATIONayarlayamazsınız. Bir küçültme işlemi için düşük öncelikli kilit süresi her zaman bir dakikadır.
DÜŞÜK_ÖNCELİKTE_BEKLE
Bir küçültme komutu modda WAIT_AT_LOW_PRIORITY çalıştırıldığında, Index Allocation Map (IAM) sayfalarında şema kararlılığı (Sch-S) kilitleri gerektiren sorgular küçültme işlemi tarafından engellenmez. Ancak, küçültme işlemi bir IAM sayfasında bir Sch-S kilitle engellenebilir. Shrink, yalnızca ihtiyaç duyduğu bir IAM sayfasında şema değiştiren kilidi (Sch-M) kilidi elde edebildiğinde çalışmaya devam eder.
Eğer moddaki WAIT_AT_LOW_PRIORITY bir küçültme işlemi, uzun süreli bir sorgu kilidi Sch-S tuttuğu için bu kilidi elde edemiyorsa, küçültme işlemi 49516 hatasıyla zaman doluyor, örneğin: Msg 49516, Level 16, State 1, Line 134 Shrink timeout waiting to acquire schema modify lock in WLP mode to process IAM pageID 1:2865 on database ID 5.
{ ABORT_AFTER_WAIT = [ BENLIK | BLOKERLAR ] }
Şunlara uygulanır: SQL Server (SQL Server 2022 (16.x) ve sonraki sürümler), Azure SQL Veritabanı, Microsoft Fabric'teki SQL veritabanı.
SELFSELFvarsayılan seçenektir. Şu anda yürütülen küçültme dosyası işleminden başka bir işlem yapmadan çıkın.BLOCKERSİşlemin devam edebilmesi için dosya küçültme işlemini engelleyen tüm kullanıcı işlemlerini sonlandırma. Bu
BLOCKERSseçenek, giriş işleminin veyaKILL DATABASE CONNECTIONiznineALTER ANY CONNECTIONsahip olmasını gerektirir.
Sonuç kümesi
Aşağıdaki tabloda sonuç kümesi sütunları açıklanmaktadır.
| Sütun adı | Açıklama |
|---|---|
DbId |
Veritabanı Altyapısı'nın küçültmeye çalıştığı dosyanın veritabanı kimlik numarası. |
FileId |
Veritabanı Altyapısı'nın küçültmeye çalıştığı dosyanın dosya tanımlama numarası. |
CurrentSize |
Dosyanın şu anda kapsamakta olduğu 8 KB sayfa sayısı. |
MinimumSize |
Dosyanın kaplayabileceği en az 8 KB'lık sayfa sayısı. Bu sayı, bir dosyanın en küçük boyutuna veya başlangıçta oluşturulan boyutuna karşılık gelir. |
UsedPages |
Dosya tarafından şu anda kullanılan 8 KB'lık sayfa sayısı. |
EstimatedPages |
Veritabanı Altyapısı'nın dosyanın küçültülebileceğini tahmin edebileceği 8 KB sayfa sayısı. |
Açıklamalar
DBCC SHRINKFILE geçerli veritabanının dosyaları için geçerlidir. Mevcut veritabanını nasıl değiştireceğiniz hakkında daha fazla bilgi için USE'a bakınız.
herhangi bir noktada DBCC SHRINKFILE işlemleri durdurabilirsiniz ve tamamlanan tüm çalışmalar korunur.
EMPTYFILE parametresini kullanır ve işlemi iptal ederseniz, ek verilerin eklenmesini önlemek için dosya işaretlenmez.
Diğer kullanıcılar, dosya küçültme sırasında veritabanında çalışabilir; veritabanının tek kullanıcılı modda olması gerekmez. Sistem veritabanlarını küçültmek için SQL Server örneğini tek kullanıcılı modda çalıştırmanız gerekmez.
Bilinen sorunlar
Uygulanır: SQL Server, Azure SQL Veritabanı, SQL database in Microsoft Fabric, Azure SQL Yönetilen Örneği, Azure Synapse Analytics dedicated SQL pool
- SQL Server 2025 (17.x) sürümünden önceki SQL Server sürümlerinde, sıkıştırılmış columnstore segmentlerinde büyük nesne (LOB) sütun türleri (varbinary(max), varchar(max) ve nvarchar(max)) tarafından kullanılan
DBCC SHRINKDATABASEDBCC SHRINKFILEsayfalar ve tarafından taşınamaz. Daha fazla bilgi için bkz . Columnstore dizinlerindeki yenilikler.
DBCC SHRINKFILE ile ilgili eşzamanlılık sorunlarını anlama
Veritabanını küçültme ve dosyayı küçültme komutları, özellikle indekslerin yeniden oluşturulması gibi aktif bakım sırasında veya yoğun çevrimiçi işlem işleme (OLTP) ortamlarında eşzamanlılık sorunlarına yol açabilir.
Örneğin, bir kullanıcı sorgusu bir Indeks Tahsis Haritası (IAM) sayfasında bir şema kararlılığı (Sch-S) kilidi edinebilir ve tamamlanana kadar tutabilir. Düzenli kullanım sırasında alanı geri kazanmaya çalışırken, veritabanını küçültme ve dosya küçültme işlemleri, IAM sayfalarını taşınırken veya silerken şema değişikliği (Sch-M) kilidi gerektirir ve kullanıcı sorgularının ihtiyaç duyduğu kilitleri Sch-S engeller. Sonuç olarak, uzun süreli sorgular bir küçültme işlemini engelleyebilir. Bu ayrıca, bir IAM sayfasında kilitlenme gerektiren Sch-S yeni sorguların küçültme işleminin arkasında sıraya girebileceği ve bu eşzamanlılık sorununu daha da kötüleştirebileceği anlamına gelir.
SQL Server 2022 (16.x) ile tanıtılan küçültme işlemleri için düşük öncelikli bekleme özelliği, moddaki WAIT_AT_LOW_PRIORITY IAM sayfalarında şema değiştirme kilidini alarak bu sorunu çözer. Daha fazla bilgi için bkz. WAIT_AT_LOW_PRIORITYküçültme işlemleri.
Kilitler ve kilitler hakkında daha fazla bilgi Sch-S için İşlem kilitleme ve satır sürümleme rehberine bakınız.Sch-M
Günlük dosyasını küçültme
Günlük dosyaları için Veritabanı Altyapısı, günlüğün hedef boyutunun tamamını hesaplamak için target_size kullanır. Bu nedenle target_size, küçültme işleminden sonra günlüğün boş alanıdır. Ardından tüm günlüğün hedef boyutu her günlük dosyasının hedef boyutuna çevrilir.
DBCC SHRINKFILE her fiziksel günlük dosyasını hedef boyutuna hemen küçültmeye çalışır. Ancak, mantıksal günlüğün bir bölümü sanal günlüklerde hedef boyutun ötesinde yer alırsa, Veritabanı Altyapısı mümkün olduğunca fazla alan boşaltıp bilgilendiren bir ileti gönderir. Mesaj, mantıksal günlüğün dosyanın sonundaki sanal günlüklerin dışına taşınması için gereken eylemleri açıklar. Eylemler gerçekleştirildikten sonra, kalan alanı boşaltmak için DBCC SHRINKFILE kullanılabilir.
Günlük dosyası yalnızca sanal günlük dosyası sınırına küçültülebileceğinden, günlük dosyasını sanal günlük dosyasının boyutundan daha küçük bir boyuta küçültmek, kullanılmasa bile mümkün olmayabilir. Veritabanı Altyapısı, günlük dosyaları oluşturulduğunda veya genişletildiğinde sanal dosya günlüğü boyutunu dinamik olarak seçer.
En iyi yöntemler
Bir dosyayı küçültmeyi planlarken aşağıdaki bilgileri göz önünde bulundurun:
Küçültme işlemi, tabloyu kısaltma veya tabloyu silme işlemi gibi büyük miktarda kullanılmayan alan oluşturan bir işlemden sonra en etkilidir.
Çoğu veritabanı, normal günlük işlemler için kullanılabilir boş alan gerektirir. Bir veritabanı dosyasını tekrar tekrar küçültür ve veritabanı boyutunun yeniden büyüdüğünü fark ederseniz, bu normal işlemler için boş alanın gerekli olduğunu gösterir. Bu durumlarda, veritabanı dosyasını tekrar tekrar küçültmek ters etki sağlar. Küçültme sonrası yeni alan tahsis etmek için gereken dosya büyümesi performansı engelleyebilir.
Bir küçültme işlemi, veritabanındaki indekslerin parçalanma durumunu korumaz ve indeks parçalanmasını artırabilir; bu da büyük taramalar yapılan sorgularda okuma G/Ç akışını azaltabilir.
Büyük bir veritabanının veri dosyalarını küçültmeniz gerekiyorsa, ShrinkDriver PowerShell betikini kullanmayı düşünün. Script, küçültme sürecini otomatikleştirir ve basitleştirir, bunu tek, gözlemlenebilir ve devam ettirilebilir bir operasyona dönüştürür. Script, birden fazla dosyayı paralel olarak küçültür, kesildiğinde tekrar dener ve çalışırken ayrıntılı durum raporları verir.
Sorun gidermek
Bu bölümde, DBCC SHRINKFILE komutu çalıştırılırken oluşabilecek sorunları tanılama ve düzeltme işlemleri açıklanmaktadır.
Dosya küçülmüyor
Hatasız bir küçültme işleminden sonra dosya boyutu değişmezse, dosyanın yeterli boş alanı olup olmadığını doğrulamak için aşağıdaki adımları deneyin:
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;İşlem günlüğü dosyasını küçültmek istiyorsanız, işlem günlüğünde kullanılan alanı görmek için sys.dm_db_log_space_usage dinamik yönetim görünümünü (DMV) kullanın.
Küçültme işlemi, yeterli boş alan yoksa dosya boyutunu daha fazla azaltamaz.
İşlem günlüğü dosyasının küçülmemesinin yaygın bir nedeni, düzenli işlem günlüğü yedeklemelerinin olmamasıdır. Günlüğün kesilmesi için işlem günlüğünü yedekleyin ve DBCC SHRINKFILE işlemini yeniden çalıştırın. Eğer noktada kurtarma gerekmiyorsa, log dosyası büyümesini önlemek için Recovery modellerini (SQL Server) düşünün.
Küçültme işlemi engellendi
satır sürüm tabanlı bir yalıtım düzeyi altında çalışan bir işlem, küçültme operasyonlarını engelleyebilir. Örneğin, satır sürümleme tabanlı bir yalıtım düzeyinde çalışan büyük bir silme işlemi sırasında bir DBCC SHRINKDATABASE işlemi çalıştırıldığında, küçültme işlemi, silme işlemi tamamlanmadan önce bekler. Bu engelleme gerçekleştiğinde, DBCC SHRINKFILE ve DBCC SHRINKDATABASE işlemleri SQL Server hata günlüğüne bir bilgi iletisi (SHRINKDATABASE için 5202 ve SHRINKFILEiçin 5203) yazdırır. Bu ileti ilk saatte beş dakikada bir ve ardından saatte bir günlüğe kaydedilir. Mesela:
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 ileti, zaman damgaları 109'dan eski olan anlık görüntü işlemlerinin (küçültme işleminin tamamlandığı son işlem) küçültme işlemini engellediği anlamına gelir. Ayrıca, transaction_sequence_num dinamik yönetim görünümündeki first_snapshot_sequence_numveya sütunlarının 15 değerini içerdiğini gösterir.
transaction_sequence_num veya first_snapshot_sequence_num görünüm sütunu, küçültme işleminin son tamamlanan işleminden (109) daha küçük bir sayı içeriyorsa, küçültme işlemi bu işlemlerin bitmesini bekler.
Sorunu çözmek için aşağıdaki adımlardan birini yapın:
- Küçültme işlemini engelleyen işlemi sonlandırın.
- Küçültme işlemini sonlandırın. Tamamlanan çalışmalar, küçültme işlemi sona erdiğinde tutulur.
- Hiçbir şey yapma ve engelleme işlemi tamamlanana kadar küçültme işleminin beklemesine izin verin.
İzinler
Sysadmin sabit sunucu rolüne veya db_owner sabit veritabanı rolüne üyelik gerektirir.
Örnekler
Bu makaledeki kod örneklerinde AdventureWorks2025 veya AdventureWorksDW2025 örnek veritabanı kullanılır; bunları Microsoft SQL Server Samples and Community Projects ana sayfasından indirebilirsiniz.
A. Veri dosyasını belirtilen hedef boyuta küçültme
Aşağıdaki örnek, DataFile1 kullanıcı veritabanındaki UserDB adlı veri dosyasının boyutunu 7 MB'a küçültür.
USE UserDB;
GO
DBCC SHRINKFILE (DataFile1, 7);
GO
B. Günlük dosyasını belirtilen hedef boyuta küçültme
Aşağıdaki örnek, AdventureWorks2025 veritabanındaki günlük dosyasını 1 MB'a küçültür. Komutun DBCC SHRINKFILE dosyayı küçültmesine izin vermek için, dosya önce veritabanı kurtarma modeli olarak ayarlanarak SIMPLEkısaltılır.
USE AdventureWorks2025;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks2025
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks2025_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks2025
SET RECOVERY FULL;
GO
C. Veri dosyasını kısaltma
Aşağıdaki örnek, AdventureWorks2025 veritabanındaki birincil veri dosyasını keser. veri dosyasının sys.database_files elde etmek için file_id katalog görünümü sorgulanır.
USE AdventureWorks2025;
GO
SELECT file_id,
name
FROM sys.database_files;
GO
DBCC SHRINKFILE (1, TRUNCATEONLY);
D. Dosyayı boşaltma
Aşağıdaki örnekte, veritabanından kaldırılabilmesi için dosyanın boşaltılması gösterilmektedir. Bu örneğin amaçları doğrultusunda, önce bir veri dosyası oluşturulur ve veriler içerir.
USE AdventureWorks2025;
GO
-- Create a data file and assume it contains data.
ALTER DATABASE AdventureWorks2025
ADD FILE (NAME = Test1data, FILENAME = 'C:\t1data.ndf', SIZE = 5 MB);
GO
-- Empty the data file.
DBCC SHRINKFILE (Test1data, EMPTYFILE);
GO
-- Remove the data file from the database.
ALTER DATABASE AdventureWorks2025
REMOVE FILE Test1data;
GO
E. WAIT_AT_LOW_PRIORITY ile veritabanı dosyasını küçültme
Aşağıdaki örnek, geçerli kullanıcı veritabanındaki bir veri dosyasının boyutunu 1 MB'a küçültmeye çalışır.
sys.database_files katalog görünümü, veri dosyasının file_id elde etmek için sorgulanır, bu örnekte file_id 5. Bir dakika içinde kilit alınamazsa küçültme işlemi durdurulür.
USE AdventureWorks2025;
GO
SELECT file_id,
name
FROM sys.database_files;
GO
DBCC SHRINKFILE (5, 1) WITH WAIT_AT_LOW_PRIORITY (ABORT_AFTER_WAIT = SELF);
İlgili içerik
- Veritabanını küçültme
- Dosyayı küçültme
- DBCC KÜÇÜLTME VERITABANI (Transact-SQL)
- SQL Server'da otomatik büyütme ve otomatikshrink ayarlarıyla ilgili dikkat edilmesi gerekenler
- Veritabanı dosyaları ve dosya grupları
- sys.database_files (Transact-SQL)
- sys.databases (Transact-SQL)
- FILE_ID (Transact-SQL)
- ALTER DATABASE (Transact-SQL)
- Azure SQL Veritabanı'ndaki veritabanları için dosya alanını yönetme