İngilizce dilinde oku

Aracılığıyla paylaş


DBCC SHRINKFILE (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen Örneği

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. DBCC SHRINKFILE'i yalnızca gerektiğinde kullanın.

Not

Küçültme işlemleri normal bir bakım işlemi olarak kabul edilmemelidir. Düzenli, 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

syntaxsql
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

Küçültülecek dosyanın mantıksal adı.

file_id

Küçültülecek dosyanın kimlik numarası. Bir 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ü sorgulayın.

hedef_boyut

Dosyanın yeni megabayt boyutunu temsil eden bir tamsayı. Belirtilmezse veya 0 ise, DBCC SHRINKFILE dosya oluşturma boyutuna düşer.

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.

DBCC SHRINKFILE, belirtilirse, dosyayı hedef boyutkadar 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.

EMPTYFILE

Belirtilen dosyadaki tüm verileri aynı dosya grubundakidiğ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. Dosyayı kaldırmak için ALTER DATABASE deyimini kullanabilirsiniz. Dosya boyutunu değiştirmek için ALTER DATABASE deyimini kullanırsanız, salt okunur bayrağı sıfırlanır ve veriler 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 kapsayıcısını kaldırma hakkında bilgi için ALTER DATABASE Dosya ve Dosya Grubu Seçenekleri (Transact-SQL) ilgili bölüme bakın

EMPTYFILE, Azure SQL Veritabanı veya Azure SQL Veritabanı Hiper Ölçek'te desteklenmez.

NOTRUNCATE

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.

TRUNCATEONLY

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ü.

target_size, TRUNCATEONLYile belirtilirse yoksayılır.

TRUNCATEONLY seçeneği günlükteki bilgileri taşımaz, ancak etkin olmayan VDF'leri günlük dosyasının sonundan 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

Şunlar için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümleri, Azure SQL Veritabanı, Azure SQL Yönetilen Örneği

Düşük öncelikli bekleme özelliği kilit çekişmesini azaltır. Daha fazla bilgi için bkz. DBCC SHRINKDATABASEile ilgili eşzamanlılık sorunlarını anlama.

Bu özellik, çevrimiçi dizin işlemleri ile bazı farklılıklarlaWAIT_AT_LOW_PRIORITY özelliğine benzer.

  • ABORT_AFTER_WAIT seçeneği "YOK" olarak belirlenemez.

DÜŞÜK_ÖNCELİKTE_BEKLE

için geçerlidir: SQL Server (SQL Server 2022 (16.x) ve üzeri) ve Azure SQL Veritabanı.

Bir küçültme komutu WAIT_AT_LOW_PRIORITY modunda yürütülürken, şema kararlılığı (Sch-S) kilitleri gerektiren yeni sorgular, küçültme işlemi beklemeyi durdurup yürütülmeye başlayana kadar bekleyen küçültme işlemi tarafından engellenmez. Küçültme işlemi, şema değiştirme kilidi (Sch-M) kilidi elde edebildiğinde yürütülür. WAIT_AT_LOW_PRIORITY modunda yeni bir küçültme işlemi, uzun süre çalışan bir sorgu nedeniyle kilit alamadığı durumda, bu küçültme işlemi varsayılan olarak 1 dakika sonra sonunda zaman aşımına uğrar ve sessizce sonlanır.

WAIT_AT_LOW_PRIORITY modunda yeni bir küçültme işlemi, uzun süre çalışan bir sorgu nedeniyle kilit alamazsa, küçültme işlemi varsayılan olarak 1 dakika sonra zaman aşımına uğrayacak ve sessizce sonlanacaktır. Bu durum, küçültme işlemi Sch-M kilidi alamazsa, Sch-S kilitleri tutan eşzamanlı sorgu veya sorgular nedeniyle oluşur. Zaman aşımı oluştuğunda, hata 49516 SQL Server hata günlüğünegönderilir, ö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. Küçültme işlemini WAIT_AT_LOW_PRIORITY modunda yeniden deneyin.

ABORT_AFTER_WAIT = [ KENDİ | ENGELLEYICILER ]

için geçerlidir: SQL Server (SQL Server 2022 (16.x) ve üzeri) ve Azure SQL Veritabanı.

  • KENDİ

    Hiçbir işlem yapmadan yürütülmekte olan dosya küçültme işleminden çıkın.

  • BLOKERLER

    İşlemin devam edebilmesi için dosya küçültme işlemini engelleyen tüm kullanıcı işlemlerini sonlandırma. ENGELLEYICILER seçeneği, oturum açma işleminin HERHANGİ Bİr BAĞLANTIYI DEĞIŞTIRME iznine sahip 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. Geçerli veritabanını değiştirme hakkında daha fazla bilgi için bkz. USE (Transact-SQL).

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.

bir DBCC SHRINKFILE işlemi başarısız olduğunda bir hata oluşur.

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.

WAIT_AT_LOW_PRIORITY ile belirtildiğinde, küçültme işleminin Sch-M kilit isteği, komutu yürütürken düşük öncelikli olarak 1 dakika bekler. İşlem süre boyunca engellenirse, belirtilen ABORT_AFTER_WAIT eylemi yürütülür.

Bilinen sorunlar

Şunlar için geçerlidir: SQL Server, Azure SQL Veritabanı, Azure SQL Yönetilen Örneği, Azure Synapse Analytics özel SQL havuzu

  • Şu anda, sıkıştırılmış columnstore segmentlerindeki LOB sütun türleri (varbinary(max), varchar(max)ve nvarchar(max)) DBCC SHRINKDATABASE ve DBCC SHRINKFILEetkilenmez.

DBCC SHRINKFILE ile ilgili eşzamanlılık sorunlarını anlama

Veritabanını küçültme ve küçültme dosyası komutları, özellikle dizinleri yeniden oluşturma gibi etkin bakımlarda veya meşgul OLTP ortamlarında eşzamanlılık sorunlarına yol açabilir. Uygulamanız veritabanı tablolarında sorgu yürüttüğünde, sorgular işlemlerini tamamlayana kadar bu sorgular bir şema kararlılık kilidi (Sch-S) alır ve korur. Normal kullanım sırasında alan kazanma girişiminde bulunurken, dizin ayırma eşlemesi (IAM) sayfalarını taşırken veya silerken şu anda şema değiştirme kilidi (Sch-M) gerektiren veritabanı daraltma ve küçültme işlemleri, kullanıcı sorguları için gereken Sch-S kilitlerini engeller. Sonuç olarak, uzun süre çalışan sorgular, sorgular tamamlanana kadar küçültme işlemini engeller. Başka bir deyişle, Sch-S kilidi gerektiren tüm yeni sorgular, bekleyen küçültme işleminin arkasında kuyruğa alınır ve engellenir, bu da eşzamanlılık sorununu daha da kötüleştirir. Bu, uygulama sorgusu performansını önemli ölçüde etkileyebilir ve ayrıca veritabanı dosyalarını küçültmek için gerekli bakımı tamamlarken zorluklara neden olur. SQL Server 2022'de (16.x) kullanıma sunulan düşük öncelikli küçültme bekleme özelliği, WAIT_AT_LOW_PRIORITY modunda şema değiştirme kilidi alarak bu sorunu ele alır. Daha fazla bilgi için bkz. WAIT_AT_LOW_PRIORITYküçültme işlemleri.

Sch-S ve Sch-M kilitleri hakkında daha fazla bilgi için İşlem kilitleme ve satır sürüm oluşturma kılavuzu 'e bakın.

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 gibi durumlarda veritabanı dosyasının sürekli daraltılması boşa harcanan bir işlemdir. Veritabanı dosyasını büyütmek için gereken otomatik büyütme olayları performansı engeller.

  • Küçültme işlemi, veritabanındaki dizinlerin parçalanma durumunu korumaz ve genellikle parçalanmayı bir dereceye kadar artırır. Bu parçalanma, veritabanını tekrar tekrar küçültmemek için başka bir nedendir.

  • Aynı veritabanındaki birden çok dosyayı eşzamanlı olarak değil sıralı olarak daraltın. Sistem tablolarındaki ihtilaf engel oluşturabilir ve gecikmelere yol açabilir.

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

Hata içermeyen küçültme işleminden sonra dosya boyutu değişmezse, dosyada yeterli boş alan olduğunu doğrulamak için aşağıdakileri deneyin:

  • Aşağıdaki sorguyu çalıştırın.
SQL
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ı döndürmek için DBCC SQLPERF komutunu çalıştırın.

Yeterli boş alan yoksa küçültme işlemi dosya boyutunu daha fazla küçültemez.

Genellikle küçülmemiş gibi görünen günlük dosyasıdır; genellikle normal işlem günlüğü yedeklemesi tarafından kesilmemiş bir günlük dosyasının sonucu olur. Günlüğün kesilmesi için işlem günlüğünü yedekleyin ve DBCC SHRINKFILE işlemini yeniden çalıştırın. Anında kurtarma gerekmiyorsa, sade veritabanı kurtarma modelinigöz önünde bulundurun.

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:

Output
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 görevlerden birini yapabilirsiniz:

  • 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

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.

SQL
USE UserDB;
GO
DBCC SHRINKFILE (DataFile1, 7);
GO

B. Günlük dosyasını belirtilen hedef boyuta küçültme

Aşağıdaki örnek, AdventureWorks2022 veritabanındaki günlük dosyasını 1 MB'a küçültür. DBCC SHRINKFILE komutunun dosyayı küçültmesine izin vermek için, önce veritabanı kurtarma modeli SIMPLE olarak ayarlanarak dosya kesilir.

SQL
USE AdventureWorks2022;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks2022
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks2022_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks2022
SET RECOVERY FULL;
GO

C. Veri dosyasını kısaltma

Aşağıdaki örnek, AdventureWorks2022 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.

SQL
USE AdventureWorks2022;
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.

SQL
USE AdventureWorks2022;
GO
-- Create a data file and assume it contains data.
ALTER DATABASE AdventureWorks2022
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 AdventureWorks2022
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.

SQL
USE AdventureWorks2022;
GO

SELECT file_id, name
FROM sys.database_files;
GO

DBCC SHRINKFILE (5, 1) WITH WAIT_AT_LOW_PRIORITY (ABORT_AFTER_WAIT = SELF);