DBCC SHRINKFILE (Transact-SQL)

Geçerli veritabanı için belirtilen veri ya da günlük dosyasının boyutunu küçültür veya veritabanından kaldırılması dosyanın açılmasına aynı dosya grubu, diğer dosyalar için belirtilen dosyadan veri taşıyarak bir dosyaya boşaltır.Dosya boyutu, oluşturulma belirtilenden daha küçük bir boyuta küçültebilirsiniz.Bu en küçük dosya boyutunu yeni değere sıfırlar.

Konu bağlantısı simgesiTransact-SQL sözdizimi 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
    mantıksal ad şu kadar küçülttü için dosyanın adıdır.

  • file_id
    Kimlik (ID) şu kadar küçülttü dosya sayısıdır.Dosya Kimliği edinmek için FILE_IDEX sistem işlev veya sorgu sys.database_files katalog Görünüm geçerli veritabanında.

  • target_size
    Megabayt cinsinden bir tamsayı ifade edilen dosya boyutudur.Belirtilmezse, dbcc SHRINKFILE varsayılan dosya boyutunu küçültür.Dosyanın oluşturulduğu boyutu belirtilen varsayılan boyutudur.

    Not

    dbcc SHRINKFILE kullanarak boş bir dosya varsayılan boyutunu küçültebilirsiniz target_size.Örneğin, 5 MB'lık dosyası oluşturup, sonra dosya hala boş iken 3 mb dosya daraltma varsayılan dosya boyutu 3 MB küme kümesidir.Bu hiçbir zaman veri içeren yalnızca boş dosyalar için geçerlidir.

    target_size Belirtilmişse, dbcc SHRINKFILE çalışır, shrink dosyası için belirtilen boyut.Boşaltılacak dosyasının bir parçası olarak kullanılan sayfaları kullanılabilir boş alanla korunan dosya bölümünde konumlandırılır.Örneğin, 10 MB'lık veri dosyası, dbcc SHRINKFILE işlemleri ile ise bir target_size 8 yeniden ayrılan ilk 8 mb ayrılmamış tüm sayfalar halinde dosyaya son 2 mb kullanılan tüm sayfalarında nedendosya.dbcc SHRINKFILE bir dosya veri dosyasında depolamak için gereken boyut sınırları küçülmez.Örneğin, 7 mb 10 MB'lık veri dosyası kullanılırsa, dbcc SHRINKFILE deyim ile bir target_size 6 küçültür dosyasına yalnızca 7 mb, değil 6 mb.

  • EMPTYFILE
    Tüm veriler, aynı dosya grubudiğer dosyalar için belirtilen dosyadan geçirir.Çünkü Veritabanı Altyapısı artık boş dosyasında yerleştirilmesi veri sağlar dosya kullanılarak kaldırılabilir alter database deyim.

  • NOTRUNCATE
    Hamle ile dosyayı belirtmeden önünde sayfalara bir veri dosyası sonundan sayfaları tahsis target_percent.Dosyanın sonundaki boş alan işletim sistemine geri dönmez ve fiziksel dosya boyutu değişmez.Bu nedenle, notruncate belirtildiğinde dosya daraltma değil görünüyor.

    notruncate, yalnızca veri dosyaları için geçerlidir.Günlük dosyalar etkilenmez.

  • TRUNCATEONLY
    İşletim sistemi için dosya sonunda tüm boş alanı bırakır ancak dosyası içindeki tüm sayfa taşıma gerçekleştirmez.Veri dosyası, yalnızca son ayrılmış kapsamşu kadar küçülttü.

    target_sizetruncateonly ile belirtilen yoksayılır.

    truncateonly, yalnızca veri dosyaları için geçerlidir.

  • NO_INFOMSGS İLE
    Bilgi tüm iletileri bastırır.

Sonuç Kümeleri

Aşağıdaki tablo , sonuç kümesisütunları açıklar.

Sütun adı

Açıklama

DBID

Veritabanı dosya kimlik numarası Veritabanı Altyapısı çalıştı küçültme.

Win32_filespecification '

Dosyanın dosya kimlik numarası Veritabanı Altyapısı çalıştı küçültme.

CurrentSize

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

Desiredsize

Dosya, en azından kaplayacak 8 kb sayfa sayısı.Bu minimum boyuta karşılık gelen veya dosyanın boyutu başlangıçta oluşturulmuş.

UsedPages

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

EstimatedPages

8 kb sayısı sayfaları Veritabanı Altyapısı dosya olabilir tahminleri kapalı için şu kadar küçülttü.

Açıklamalar

dbcc SHRINKFILE geçerli veritabanında dosyalara uygulanır.Geçerli veritabanını değiştirme hakkında daha fazla bilgi için bkz: Kullanım (Transact-SQL).

dbcc SHRINKFILE işlemleri işlem herhangi bir noktada durdurulur ve Tamamlanan bir çalışma korunur.

, Bir hata oluşturdu dbcc SHRINKFILE işlemi başarısız olduğunda.

Şu kadar küçülttü veritabanı tek kullanıcı moduolması gerekmez; Dosya şu kadar küçülttü, diğer kullanıcıların veritabanında çalışma.örnek çalıştırmak zorunda değilsiniz SQL Server sistem veritabanlarıdaraltmak için tek kullanıcı modu .

Bir günlük dosyası daraltma

Günlük dosyaları için Veritabanı Altyapısı kullanan target_size tam günlük; hedef boyutunu hesaplamak için Bu nedenle, target_size olan sonra günlüğünde boş alan miktarıküçültme işlemi.Tüm günlüğü için hedef boyut, her günlük dosyası için hedef boyutuna sonra çevrilir.Her fiziksel günlük dosyası hemen hedef boyutunu küçültmek, dbcc SHRINKFILE çalışır.Ancak, hedef boyutunu aşan sanal günlüklerinde parçası mantıksal bulunsa bile Veritabanı Altyapısı , olabildiğince çok alanı serbest bırakır ve ardından sorunları bilgilendirici bir ileti.İletinin mantıksal günlük dosyasının sonunda sanal günlükler dışına taşımak için gereken eylemleri açıklar.Eylemleri gerçekleştirmesinden sonra kalan alanı boşaltmak için dbcc SHRINKFILE kullanılabilir.Daha fazla bilgi için, bkz. İşlem günlüğünü daraltma.

Şu kadar bir günlük dosyası yalnızca bir sanal günlük dosyası sınırına kadar küçülttü çünkü değil kullanılıyor olsa bile, bir günlük dosyası bir sanal günlük dosyası boyutundan daha küçük bir boyuta daraltılması mümkün olmayabilir.sanal günlük dosyası boyutu dinamik olarak seçilen Veritabanı Altyapısı Günlük dosyalarının ne zaman oluşturulan veya genişletilmiş.Sanal günlük dosyaları hakkında daha fazla bilgi için bkz: İşlem günlüğünün fiziksel yapısı.

En iyi yöntemler

Bir dosya daraltma planlarken aşağıdaki bilgileri göz önüne alın:

  • Küçültme işlemi çok fazla kesilme tablo veya tablo bırakma işlemini gibi kullanılmayan alan yaratan bir operasyondan sonraki en etkili olandır.

  • Çoğu veritabanı, günlük normal işlemler için kullanılabilir olması için bir miktar boş alan gerektirir.Sürekli olarak bir veritabanı daraltma ve veritabanı boyutu yeniden büyüyor dikkat edin, bu şu kadar küçülttü alanı normal işlemler için gerekli olduğunu gösterir.Bu durumda, veritabanı sürekli küçülterek bir harcanan işlemdir.

  • Küçültme işlemi veritabanında dizinler parçalanma durumunu korumaz ve genellikle parçalanma bir derecede artar.Sürekli olarak veritabanını küçültmek değil başka bir nedeni budur.

Sorun giderme

Bu bölüm nasıl tanılanacağı ve dbcc SHRINKFILE komutu çalışırken oluşabilecek sorunları açıklar.

Dosya küçülmez

Küçültme işlemi hatasız çalışır, ancak dosya boyutu değişti görünmüyor, dosyayı aşağıdaki işlemlerden birini gerçekleştirerek 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;
    
  • Çalıştır dbcc sqlperf hareket günlüğüne kullanılan alanı dönmek için komutu.

Yeterli boş alan varsa, küçültme işlemi dosya boyutu herhangi bir daha da azaltmak olamaz.

Genellikle değil görünmesi için günlük dosyası olduğunu.Bu genellikle değil kesilmiş olan bir günlük dosyası sonucudur.Günlük veritabanı kurtarma modelini basit olarak ayarlama veya günlüğünü yedekleme ve dbcc SHRINKFILE işlemi yeniden çalıştırarak kırpabilirsiniz.Daha fazla bilgi için, bkz. Hareket günlüğü kesme ve İşlem günlüğünü daraltma.

Küçültme işlemi engellenen

Altında çalışan bir işlem tarafından engellenmesi küçültme işlemleri için olası bir satır sürüm oluşturma tabanlı yalıtım düzeyi.Örneğin, dbcc veritabanı DARALTMA işlemi çalıştırıldığında bir satır sürüm oluşturma tabanlı yalıtım düzeyi altında çalışan büyük delete işlemi devam ederken, dosyalarının daraltılması önce tamamlamak silme işlemi küçültme işlemi bekler.Bu durumda, dbcc SHRINKFILE ve dbcc SHRINKDATABASE işlemleri (5202 SHRINKDATABASE için) ve 5203 SHRINKFILE için bilgilendirici bir ileti SQL Server hata günlüğü her beş dakikada bir ilk saati ve her saat sonra sonra yazdırmak.Örneğin, aşağıdaki hata iletisini hata günlüğü içeriyorsa:

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.

Yani, küçültme işlemi küçültme işlemi tamamlanan son hareketi olduğu zaman damgaları 109 eski olan anlık görüntü hareketleri tarafından engellendi.Onu da belirten transaction_sequence_num, veya first_snapshot_sequence_num sütunlarında sys.dm_tran_active_snapshot_database_transactions dinamik yönetim görünümü 15 değeri içerir.Ya da, transaction_sequence_num, veya first_snapshot_sequence_num görünümünde sütun içeren bir küçültme işlemi (109) tamamlandı son hareketi'den küçük bir sayı, küçültme işlemi bu işlemlerin bitmesini bekler.

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

  • Küçültme ilemi engelleyen işlemi sona erdirir.

  • Küçültme işlemi sonlandırır.Küçültme işlemi sona erdiğinde, tamamlanan bir çalışma korunur.

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

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

İzinler

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

Örnekler

A.Veri dosyası için belirtilen hedef boyutunu küçültme

Aşağıdaki örnek adlı bir veri dosyasının boyutunu küçültür DataFile1 , UserDB kullanıcı veritabanı 7 mb.

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

B.Bir günlük dosyası için belirtilen hedef boyutunu küçültme

Günlük dosyasında aşağıdaki örnekte küçülür AdventureWorks2008R2 veritabanı 1 mb.dbcc SHRINKFILE komutu dosya için SHRINK izin vermek için dosyayı önce veritabanı kurtarma modelini basit olarak ayarlama kesildi.

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

C.Bir veri dosyası kesiliyor

Aşağıdaki örnek birincil veri dosyasında keser AdventureWorks2008R2 veritabanı.sys.database_files Elde etmek için Katalog görünümü sorgulanan file_id veri dosyası.

USE AdventureWorks2008R2;
GO
SELECT file_id, name
FROM sys.database_files;
GO
DBCC SHRINKFILE (1, TRUNCATEONLY);

D.Bir dosya boşaltma

Böylece veritabanından kaldırılması dosya boşaltma yordamı aşağıdaki örnekte gösterilmiştir.Bu örneðin amaçlarý bakýmýndan, bir veri dosyası ilk olarak oluşturulduğunda gerçekleşir ve dosya veri içerdiğini kabul edilir.

USE AdventureWorks2008R2;
GO
-- Create a data file and assume it contains data.
ALTER DATABASE AdventureWorks2008R2 
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 AdventureWorks2008R2
REMOVE FILE Test1data;
GO