Aracılığıyla paylaş


DBCC KÜÇÜLTME VERITABANI (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'de Azure Synapse AnalyticsSQL veritabanı

Belirtilen veritabanındaki verilerin ve günlük dosyalarının boyutunu küçültür.

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

SQL Server söz dizimi:

DBCC SHRINKDATABASE   
( database_name | database_id | 0   
     [ , target_percent ]   
     [ , { 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 }

Azure Synapse Analytics söz dizimi:

DBCC SHRINKDATABASE
( database_name
     [ , target_percent ]
)
[ WITH NO_INFOMSGS ]

Argümanlar

| database_namedatabase_id | 0

Küçültülecek veritabanının adı veya kimliği. 0, geçerli veritabanının kullanıldığını belirtir.

target_percent

Küçültme işlemi tamamlandıktan sonra veritabanı dosyasında kalan boş alan yüzdesi.

ile target_percent belirtilirseTRUNCATEONLY, dosyanın sonundaki boş alan serbest bırakılmayabilir.

NOT ÇALIŞMASI

Atanan sayfaları dosyanın sonundan, dosyanın önündeki atanmamış sayfalara taşır. Bu eylem, dosya içindeki verileri sıkıştırıyor. target_percent isteğe bağlıdır. Azure Synapse Analytics bu seçeneği desteklemez.

Dosyanın sonundaki boş alan işletim sistemine döndürülmüyor ve dosyanın fiziksel boyutu değişmez. Bu nedenle, NOTRUNCATEbelirttiğinizde veritabanı küçülmeyecek gibi görünür.

NOTRUNCATE yalnızca veri dosyaları için geçerlidir. NOTRUNCATE günlük dosyasını etkilemez.

SADECE KESİNTİ

Dosyanın sonundaki tüm boş alanı işletim sistemine bırakır. Dosyanın içindeki sayfaları taşımaz. Veri dosyası yalnızca son atanan uzantıya küçültür. Azure Synapse Analytics bu seçeneği desteklemez.

ile target_percent belirtilirseTRUNCATEONLY, dosyanın sonundaki boş alan serbest bırakılmayabilir.

BİLGİ_MSJSIZ

Önem düzeyi 0 ile 10 arasında olan 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 SHRINKDATABASE ile ilgili eşzamanlılık sorunlarını anlama.

Bu özellik, bazı farklılıklarla birlikte, online dizin işlemleriile WAIT_AT_LOW_PRIORITY'ye benzer.

  • ABORT_AFTER_WAIT seçeneği NONEbelirtemezsiniz.

DÜŞÜK_ONCELIKTE_BEKLE

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 kilidini (Sch-M) 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 alamazsa, küçültme işlemi varsayılan olarak 1 dakika sonra zaman aşımına uğrayacak ve hatasız sonlanacaktı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ğrayacaktır ve hata vermeden sona erer. Bu durum, küçültme işlemi eşzamanlı sorgu veya sorguların Sch-S kilitlerini tutması nedeniyle Sch-M kilidini alamadığında oluşur. Zaman aşımı oluştuğunda, SQL Server hata günlüğüne 49516 hatası gö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 = [ SELF | ENGELLEYICILER ]

  • KENDİ

    SELF varsayılan seçenektir. Herhangi bir işlem yapmadan yürütülmekte olan veritabanı küçültme işleminden çıkın.

  • Engelleyiciler

    İşlemin devam edebilmesi için veritabanı küçültme işlemini engelleyen tüm kullanıcı işlemlerini sonlandırma. BLOCKERS seçeneği, oturum açma işleminin ALTER ANY CONNECTION iznine sahip olmasını gerektirir.

Sonuç kümesi

Aşağıdaki tabloda sonuç kümesindeki 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 kaplaması muhtemel, en az 8 KB'lık sayfa sayısı. Bu değer, bir dosyanın en küçük boyutuna veya başlangıçta oluşturulan boyutuna karşılık gelir.
UsedPages Şu anda dosya tarafından kullanılmakta olan 8 KB'lık sayfa sayısı.
EstimatedPages Veritabanı Motorunun dosyanın küçültülebileceğini tahmin ettiği 8 KB'lık sayfa sayısı.

Not

Veritabanı Altyapısı, küçültülmeyen dosyaların satırlarını görüntülemez.

Açıklamalar

Belirli bir veritabanına ilişkin tüm verileri ve günlük dosyalarını küçültmek için DBCC SHRINKDATABASE komutunu yürütür. Belirli bir veritabanı için bir kerede bir veri veya günlük dosyasını küçültmek için DBCC SHRINKFILE komutunu yürütebilirsiniz.

Veritabanındaki geçerli boş (ayrılmamış) alanı görüntülemek için sp_spaceused çalıştırın.

DBCC SHRINKDATABASE işlemler işlemin herhangi bir noktasında durdurulabilir ve tamamlanan tüm işler tutulur.

Veritabanı, veritabanının yapılandırılan minimum boyutundan küçük olamaz. Veritabanı ilk oluşturulduğunda minimum boyutu belirtirsiniz. Alternatif olarak, dosya boyutu değiştirme işlemi kullanılarak minimum boyut açıkça ayarlanan son boyut da olabilir. DBCC SHRINKFILE veya ALTER DATABASE gibi işlemler, dosya boyutu değiştirme işlemlerine örnek olarak verilebilir.

Veritabanının başlangıçta 10 MB boyutunda oluşturulduğunu düşünün. Daha sonra 100 MB'a kadar büyür. Veritabanındaki tüm veriler silinmiş olsa bile veritabanının en küçük boyutu 10 MB'a düşürülebilir.

NOTRUNCATEçalıştırdığınızda TRUNCATEONLY veya DBCC SHRINKDATABASE seçeneğini belirtin. Aksi takdirde sonuç, DBCC SHRINKDATABASE ile bir NOTRUNCATE işlemi çalıştırdığınız ve ardından DBCC SHRINKDATABASEile bir TRUNCATEONLY işlemi çalıştırdığınızla aynıdır.

Küçülen veritabanının tek kullanıcı modunda olması gerekmez. Veritabanı küçültülürken, sistem veritabanları da dahil olmak üzere, diğer kullanıcılar veritabanında çalışıyor olabilir.

Veritabanı yedeklenirken veritabanını küçültemezsiniz. Buna karşılık, veritabanındaki bir küçültme işlemi devam ederken veritabanını yedekleyemezsiniz.

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

Azure Synapse SQL havuzlarında yoğun G/Ç kullanan bir işlem olduğundan ve ayrılmış SQL havuzunuzu (eski adı SQL DW) çevrimdışına alabildiği için küçültme komutu çalıştırılması önerilmez. Buna ek olarak, bu komutu çalıştırdıktan sonra veri ambarı anlık görüntülerinize maliyet etkileri olacaktır.

Bilinen sorunlar

Şunlara uygulanır: SQL Server, Azure SQL Veritabanı, Azure SQL Yönetilen Örneği, Azure Synapse Analytics için ayrılmış SQL havuzu

  • Şu anda, sıkıştırılmış columnstore segmentlerinde LOB veri türlerini (varbinary(max), varchar(max)ve nvarchar(max)) kullanan sütunlar ve DBCC SHRINKDATABASEöğelerinden etkilenmezDBCC SHRINKFILE.

DBCC SHRINKDATABASE nasıl çalışır?

DBCC SHRINKDATABASE, veri dosyalarını dosya başına daraltır, ancak tüm günlük dosyaları bir bitişik günlük havuzunda varmış gibi küçültür. Dosyalar her zaman sonundan küçültülr.

Birkaç günlük dosyanız, bir veri dosyanız ve mydbadlı bir veritabanınız olduğunu varsayalım. Veri ve günlük dosyalarının her biri 10 MB, veri dosyası ise 6 MB veri içerir. Veritabanı Altyapısı her dosya için bir hedef boyutu hesaplar. Bu değer, dosyanın küçültülecek boyutudur. DBCC SHRINKDATABASE veritabanı altyapısı, target_percent ile belirtildiğinde, hedef boyutu daraltıldıktan sonra dosyadaki target_percent boş alan miktarı olacak şekilde hesaplar.

Örneğin, daraltmak için 25 mydb belirtirseniz, Veritabanı Altyapısı veri dosyasının hedef boyutunu 8 MB (6 MB veri artı 2 MB boş alan) olarak hesaplar. Bu nedenle, Veritabanı Altyapısı veri dosyasının son 2 MB'ından verileri, veri dosyasının ilk 8 MB'lık içindeki herhangi bir boş alana taşır ve ardından dosyayı küçültür.

mydb veri dosyasının 7 MB veri içerdiğini varsayalım. 30 target_percent belirtilmesi, bu veri dosyasının boş yüzde 30'a küçültülmesini sağlar. Ancak, veri dosyasının geçerli toplam boyutunda yeterli boş alan oluşturulamadığından, 40 target_percent belirtilmesi veri dosyasını küçültmez.

Bu sorunu başka bir şekilde düşünebilirsiniz: yüzde 40 boş alan + yüzde 70 tam veri dosyası (10 MB'ın 7 MB'si) yüzde 100'den fazladır. 30'dan büyük target_percent veri dosyasını küçültmez. İstediğiniz boş alan yüzdesi ile veri dosyasının kapladığı mevcut yüzdelik oranının toplamı 100'ü aştığından küçülmeyecek.

Günlük dosyaları için Veritabanı Altyapısı, tüm günlüğün hedef boyutunu hesaplamak için target_percent kullanır. Bu nedenle target_percent, küçültme işleminden sonra günlükteki boş alan miktarıdır. Tüm günlüğün hedef boyutu daha sonra her bir günlük dosyasının hedef boyutuna dönüştürülür.

DBCC SHRINKDATABASE her fiziksel günlük dosyasını hedef boyutuna hemen küçültmeye çalışır. Mantıksal günlüğün hiçbir bölümünün sanal günlüklerde günlük dosyasının hedef boyutunun ötesinde kalmadığını düşünelim. Ardından dosya başarıyla kesilir ve DBCC SHRINKDATABASE ileti olmadan tamamlanır. Ancak, mantıksal günlüğün bir bölümü sanal günlüklerde hedef boyutun ötesinde kalırsa, Veritabanı Altyapısı mümkün olduğunca fazla alan boşaltıp bilgilendiren bir ileti gönderir. İleti, mantıksal günlüğü dosyanın sonundaki sanal günlüklerin dışına taşımak için gereken eylemleri açıklar. Eylemler çalıştırıldıktan sonra, kalan alanı boşaltmak için DBCC SHRINKDATABASE kullanılabilir.

Günlük dosyası yalnızca sanal günlük dosyası sınırına küçültülebilir. Bu nedenle günlük dosyasını sanal günlük dosyasının boyutundan daha küçük bir boyuta küçültmek mümkün olmayabilir. Kullanılmasa bile mümkün olmayabilir. Günlük dosyaları oluşturulduğunda veya genişletildiğinde sanal günlük dosyasının boyutu Veritabanı Altyapısı tarafından dinamik olarak seçilir.

DBCC SHRINKDATABASE 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 kilit gerektiren tüm yeni sorgular da bekleyen küçültme işleminin arkasında kuyruğa alınır ve bu eşzamanlılık sorununu daha da artıracak şekilde engellenir. 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 (WLP) özelliği, WAIT_AT_LOW_PRIORITY modunda bir şema değişikliği kilidi alarak bu sorunu çözer. Daha fazla bilgi için bkz. WAIT_AT_LOW_PRIORITY küçültme işlemleriyle.

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

En iyi yöntemler

Veritabanını küçültmeyi planlarken aşağıdaki bilgileri göz önünde bulundurun:

  • Küçültme işlemi, en çok kullanılmayan alan oluşturan bir işlemden (örneğin, kesme tablosu veya bırakma tablosu işlemi) sonra etkili olur.
  • Ç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 sonuç, veritabanını tekrar tekrar küçültmemek için başka bir nedendir.
  • Belirli bir gereksiniminiz yoksa AUTO_SHRINK veritabanı seçeneğini ON olarak ayarlamayın.

Sorun gidermek

satır sürüm oluşturma tabanlı yalıtım düzeyialtında çalışan bir işlemle küçültme işlemlerini engellemek mümkündür. Örneğin, bir DBCC SHRINKDATABASE işlemi yürütülürken satır sürüm oluşturma tabanlı yalıtım düzeyi altında çalışan büyük bir silme işlemi devam eder. Bu durum oluştuğunda, küçültme işlemi dosyaları küçültmeden önce silme işleminin tamamlanmasını bekler. Küçültme işlemi beklediğinde, DBCC SHRINKFILE ve DBCC SHRINKDATABASE işlemleri bir bilgilendirme iletisi yazdırır (SHRINKDATABASE için 5202 ve SHRINKFILEiçin 5203). Bu ileti, ilk saatte beş dakikada bir ve ardından gelecek saatte bir SQL Server hata günlüğüne yazdırılır. Örneğin, hata günlüğü aşağıdaki hata iletisini içeriyorsa:

DBCC SHRINKDATABASE for database ID 9 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 hata, zaman damgaları 109'dan eski olan anlık görüntü işlemlerinin küçültme işlemini engelleyeceği anlamına gelir. Bu işlem, küçültme işleminin tamamlandığı son işlemdir. Ayrıca transaction_sequence_num dinamik yönetim görünümündeki first_snapshot_sequence_num veya sütunlarının 15 değerini içerdiğini gösterir. Görünümdeki transaction_sequence_num veya first_snapshot_sequence_num sütunu, küçültme işlemi (109) tarafından tamamlanan son işlemden küçük bir sayı içerebilir. Bu durumda, küçültme işlemi bu işlemlerin tamamlanmasını bekler.

Sorunu çözmek için aşağıdaki görevlerden birini gerçekleştirebilirsiniz:

  • Küçültme işlemini engelleyen işlemi sonlandırın.
  • Küçültme işlemini sonlandırın. Tamamlanan tüm çalışmalar korunur.
  • 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. Veritabanını küçültme ve boş alan yüzdesi belirtme

Aşağıdaki örnek, UserDB kullanıcı veritabanındaki verilerin ve günlük dosyalarının boyutunu azaltarak veritabanında yüzde 10 boş alan sağlar.

DBCC SHRINKDATABASE (UserDB, 10);
GO

B. Veritabanını boşalt

Aşağıdaki örnek, AdventureWorks2025 örnek veritabanındaki veri ve günlük dosyalarını son atanan uzaya kadar küçültür.

DBCC SHRINKDATABASE (AdventureWorks2022, TRUNCATEONLY);

C. Azure Synapse Analytics veritabanını küçültme

DBCC SHRINKDATABASE (database_A);
DBCC SHRINKDATABASE (database_B, 10);

D. veritabanını WAIT_AT_LOW_PRIORITY ile küçültme

Aşağıdaki örnek, veritabanında 20% boş alan sağlamak için AdventureWorks2025 veritabanındaki veri ve günlük dosyalarının boyutunu küçültmeye çalışır. Bir dakika içinde kilit alınamazsa küçültme işlemi durdurulür.

DBCC SHRINKDATABASE ([AdventureWorks2022], 20) WITH WAIT_AT_LOW_PRIORITY (ABORT_AFTER_WAIT = SELF);