DBCC SHRINKDATABASE (Transact-SQL)

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

Topic link iconTransact-SQL sözdizimi kuralları

DBCC SHRINKDATABASE 
( database_name | database_id | 0 
     [ , target_percent ] 
     [ , { NOTRUNCATE | TRUNCATEONLY } ] 
)
[ WITH NO_INFOMSGS ]

Bağımsız değişkenler

  • database_name | database_id | 0
    Adı veya shrunk için veritabanı KIMLIĞI'ni uyumsuz.0 Belirtilirse, geçerli veritabanı kullanılır.

  • target_percent
    Veritabanı shrunk sonra istediğiniz veritabanı dosyasında sol boş alanın yüzdesidir.

  • notruncate
    Compacts the data in data files by moving allocated pages from the end of a file to unallocated pages in the front of the file.target_percent is optional.

    Dosyanın sonunda boş bir alan için işletim sistemi döndürdü ve fiziksel dosya boyutu değişmez.Bu nedenle, NOTRUNCATE belirtildiğinde, veritabanını değil daraltmak için görünür.

    NOTRUNCATE, yalnızca veri dosyaları için geçerlidir.Günlük dosyaları bu açıktan etkilenmez.

  • truncateonly
    Sonunda, işletim sistemi için dosya, tüm boş alanı serbest bırakır, ancak herhangi bir sayfa hareket dosyasında gerçekleştirmez.The data file is shrunk only to the last allocated extent.target_percent is ignored if specified with TRUNCATEONLY.

    TRUNCATEONLY, yalnızca veri dosyaları için geçerlidir.Günlük dosyaları bu açıktan etkilenmez.

  • no_infomsgs İLE
    0 Ile 10 arasındaki önem derecelerine sahip bilgi tüm iletileri bastırır.

Sonuç Kümeleri

Aşağıdaki tabloda, sonuç kümesindeki sütunların açıklar.

Sütun adı

Açıklama

DbId

Dosyanın kimlik numarasını veritabanı Database Engine Küçült denediniz.

FileId

Dosyanın kimlik numarasını dosya Database Engine Küçült denediniz.

CurrentSize

Dosya şu anda kapladığı 8 KB sayfa sayısı.

MinimumSize

Dosya, en azından kaplayacak 8 KB sayfa sayısı.Bu işlem, en küçük boyuta karşılık gelen veya özgün dosyanın boyutunu oluşturulmuş.

UsedPages

Şu anda dosya tarafından kullanılan 8 KB sayfa sayısı.

EstimatedPages

8 KB sayısı sayfaları Database Engine Tahminler, dosyayı kapalı shrunk.

Not

The Database Engine does not display rows for those files not shrunk.

Remarks

Tüm verileri sıkıştırmak ve günlük dosyalarının belirli bir veritabanı için DBCC SHRINKDATABASE komutunu yürütün.Bir veri daraltmak veya belirli bir veritabanı için birer günlük dosyası hakkında bilgi için yürütmek DBCC SHRINKFILE komutu.

Veritabanında boş () ayrılmamış geçerli miktarı görüntülemek için , çalıştırma sp_spaceused.

Işlemdeki herhangi bir noktada DBCC SHRINKDATABASE işlemleri durduruldu ve tüm tamamlanan çalışma korunur.

Veritabanını, veritabanının en küçük boyuttan daha küçük yapılamıyor.En küçük boyut veritabanını özgün olarak oluşturduğunuzda veya son boyutuna açıkça boyutudur küme kullanarak bir dosya boyutu, işlem gibi DBCC SHIRNKFILE veya ALTER DATABASE değiştirme.Bir veritabanı boyutu 10 MB boyutunda olan oluşturulur ve 100 MB olarak büyüyor, veritabanındaki tüm verileri silinmiş olsa bile, en küçük için veritabanında sınırlı 10, MB'dir.

DBCC SHRINKDATABASE NOTRUNCATE seçeneği ya da TRUNCATEONLY seçeneği DBCC SHRINKDATABASE bir işlem ile NOTRUNCATE eşdeğerdir belirtmeden çalışan TRUNCATEONLY ile bir DBCC SHRINKDATABASE işlemi çalıştırarak izler.

Shrunk veritabanı tek kullanıcı modunda olması gerekmez; onu shrunk, diğer kullanıcıların veritabanında çalışıyor.Bu, sistem veritabanları içerir.

Bir veritabanı, veritabanı yedekleniyor sırada daraltılamıyor.Tersi durumda, bir veritabanında küçültme işlemi sürecinde, bir veritabanı yedekleyemezsiniz.

DBCC SHRıNKDATABASE'nasıl çalışır?

Dosya başına bazında veri dosyalarını DBCC SHRINKDATABASE küçültür, ancak günlük dosyaları bitişik günlük havuzda gibi varsa shrinks günlük dosyaları.Dosyaları her zaman sondan shrunk.

Adlı bir veritabanı varsayalım. Mydb bir veri dosyası ve bu iki günlük dosyaları.Her 10 MB veri ve günlük dosyalarıdır ve veri 6 MB veri dosyasını içerir.

Her bir dosya için Database Engine bir hedef boyutu hesaplar. Bu dosyayı shrunk ise boyutudur.DBCC SHRINKDATABASE ile ne zaman belirtilmedi target_percent, Database Engine Hedef boyutunu hesaplar target_percent daraltma sonra dosyasındaki boş alan miktarı. Örneğin, belirttiğiniz bir target_percent küçültme için 25 Mydb, the Database Engine Hedef boyutu 8 MB (6 MB veri ve 2 MB'lık boş alan) veri dosyası için hesaplar. Bu nedenle, Database Engine veriler, veri dosyasının son 2 MB veri dosyasının ilk 8 MB olarak boş bir alanı taşır ve sonra dosyayı daraltır.

Veri dosyası varsayalım. Mydb 7 MB veri içerir.Belirten bir target_percent Bu veri dosyası için ücretsiz yüzde 30 shrunk için 30 sağlar. Ancak, belirten bir target_percent 40 ' veri dosyası için Küçült değil Database Engine Dosya verileri şu anda kapladığı daha küçük bir boyuta küçülür. Siz de bu sorunun başka düşünebilirsiniz yolu: boş alan yüzde 40'ını istedi + yüzde 70'inin tam veri (10 MB dışında 7 MB) yüzde 100'den fazla dosyasıdır. Veri dosyası kapladığı geçerli yüzdeyi istedi boş yüzdesini üzerinde (yüzde 10), yüzde 100 her olduğundan target_size 30 veri dosyasını sıkıştırmak için çok büyük.

Günlük dosyalarının, Database Engine kullanır target_percent tüm günlük; hedef boyutunu hesaplamak için bu nedenle, target_percent küçültme işlemi sonra günlüğünde boş alan miktarıdır. Tüm günlük boyutunu hedef, her günlük dosyası için bir hedef boyutuna sonra çevrilir.

Her fiziksel bir günlük dosyası için hedef boyutuna hemen daraltmak, DBCC SHRINKDATABASE çalışır.Hedef günlük dosyası boyutu aşan sanal günlüklerinde hiçbir bölümü mantıksal günlüğünün bulunduğu, dosya başarıyla kesiliyor ve iletileri DBCC SHRINKDATABASE tamamlanır.Ancak, mantıksal günlük bir parçası, hedef boyutu aşan sanal günlüklerinde bulunuyorsa Database Engine olabildiğince çok alanı serbest bırakır ve sonra da bir bilgi iletisi yayımlar. Iletinin hangi eylemleri mantıksal günlük dosyasının sonunda sanal günlükleri dışına taşımak için gerekli açıklar.Eylemler gerçekleştirilir sonra DBCC SHRINKDATABASE kalan alan boşaltmak için kullanılabilir.Daha fazla bilgi için bkz:İşlem günlüğünü daraltma.

Bir günlük dosyası yalnızca bir sanal günlük dosyası sınırına shrunk çünkü değil kullanılıyor olsa bile bir günlük dosyası sanal günlük dosya boyutundan daha küçük bir boyuta daraltma mümkün olmayabilir.Sanal günlük dosyasının boyutu ile dinamik olarak seçilen Database Engine ne zaman günlük dosyaları oluşturulan genişletilmiş veya. Sanal günlük dosyaları hakkında daha fazla bilgi için bkz: Fiziksel işlem günlüğü mimarisi.

En iyi yöntemler

Veritabanını sıkıştırmak planlarken, aşağıdaki bilgileri göz önüne alın:

  • Bir küçültme işlemi çok sayıda kullanılmayan boşluk, kesme tablo ya da bir açılan tabloda işlemi oluşturan bir operasyondan sonraki en etkili olur.

  • Çoğu veritabanı günlük normal işlemler için kullanılabilir olması için bazı boş alan gerektirir.Veritabanı art arda küçültmek ve veritabanı boyutunu yeniden büyüyor dikkat edin, shrunk alanı normal işlemler için gerekli olduğunu gösterir.Bu durumda, tekrar tekrar veritabanı daraltma bir harcanan işlemdir.

  • Bir küçültme işlemi dizin veritabanında parçalanma durumunu korumak ve genellikle bir derecede parçalanma artırır.Art arda veritabanı daraltmanız değil, başka bir nedeni budur.

  • Belirli bir gereksinim yoksa, AUTO_SHRINK veritabanı seçeneği ON olarak ayarlamayın.

Sorun giderme

Küçültme işlem altında çalışan bir işlem tarafından engellenmiş olan bir Satır sürüm tabanlı bir yalıtım düzey.Bir DBCC DATABASE DARALTMA işlemi çalıştırıldığında, örneğin, sürüm oluşturma-based satır altında çalışan bir büyük silme işlemi, yalıtım düzey küçültme işlemi silme işlemi dosyaları daraltma önce tamamlanması için bekleyeceği sürüyor.Bu, bir bilgi iletisi (5203 için SHRINKFILE ve SHRINKDATABASE için 5202) DBCC SHRINKFILE ve DBCC SHRINKDATABASE operasyonlar yazdırmak durumda SQL Server her beş dakikada bir ilk saat ve sonra her saat sonra hata günlüğü. Örneğin, hata günlüğüne 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, küçültme işlemi küçültme işlemi tamamlanmış son hareketi olduğu zaman damgalarını 109'in eski olan hareketleri anlık görüntü engellediği anlamına gelir.Bunu da that indicates transaction_sequence_num, or first_snapshot_sequence_num sütunlarsys.dm_tran_active_snapshot_database_transactions (Transact-SQL) dinamik yönetim görünümü, 15 değerini içerir. Ya da, transaction_sequence_num, or first_snapshot_sequence_num sütun görünümdeki son küçültme işlemi (109) tarafından tamamlanmış hareket'den küçük bir sayı içerir, küçültme işlemi tamamlamak, bu hareketler için bekleyecektir.

Bu sorunu gidermek için , aşağıdaki görevlerden birini yapabilirsiniz:

  • Küçültme işlemi engelleyen hareket sonlandırın.

  • Küçültme işlemini sonlandırın.Tüm tamamlanan çalışma korunur.

  • Hiçbir şey yapmayabilir ve engelleyen işlem tamamlanıncaya kadar beklemek küçültme işlemini izin verir.

Hakkında daha fazla bilgi için SQL Server hata günlüğü için bkz: SQL Server hata günlüğü görüntüleme.

İzinler

Üyelik gerektirir sysadmin sabit sunucu rolü veya db_owner sabit veritabanı rolü.

Örnekler

C.Bir veritabanı daraltma ve boş disk alanı yüzdesi belirtme

Aşağıdaki örnek veri ve günlük dosyalarının boyutunu azaltır UserDB yüzde 10'için izin vermek için kullanıcı veritabanı veritabanında yer boşaltın.

b.Bir veritabanı kesiliyor

Aşağıdaki örnek veri dosyalarında küçültür AdventureWorks Son ayrılmış sürece, örnek veritabanı.