Kesilmiş 200GB'lık tablo ancak disk alanı serbest bırakılmamış


23

Sadece 2GB'ım kaldı, bu yüzden bu tarihçe tablosunu kaldırmam gerekiyor. Bu tablo şimdi boş ancak veritabanı disk alanı serbest bırakılmamış. Ve veritabanı dosyası 320 GB'dir.


Veritabanında bazı Çoğaltma izleri kurdum, bu kütük boyutunu büyük ölçüde artırıyor ve silmeyi veya daralmayı engelliyor.
Lucas Rodrigues Sena,

Yanıtlar:


25

Birimdeki gerçek veritabanı dosyası tüketimine atıfta bulunuyorsanız, SQL Server bunu otomatik olarak işlemez . Veritabanından veri kaldırmanız, veritabanı dosyalarının yalnızca mevcut verilere sığacak şekilde küçüleceği anlamına gelmez.

Eğer gelirse ne arıyor olurdu sahip hacmine alanı açmak için, özellikle dosyasını küçülen olacaktır DBCC SHRINKFILE. Bu dokümantasyon uyarınca birkaç en iyi uygulamayı belirtmeye değer:

En İyi Uygulamalar

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

  • Küçültme işlemi en çok, kesikli bir tablo veya bir damlalıklı tablo işlemi gibi çok fazla kullanılmayan alan oluşturan bir işlemden sonra etkilidir.

  • Çoğu veritabanı düzenli günlük işlemler için boş alan gerektirir. Bir veritabanını tekrar tekrar daraltırsanız ve veritabanı boyutunun yeniden arttığını fark ederseniz, bu, küçültülmüş alanın normal işlemler için gerekli olduğunu gösterir. Bu durumlarda, veritabanını tekrar tekrar küçültmek boşa harcanmış bir işlemdir.

  • Bir daralma işlemi, veritabanındaki dizinlerin parçalanma durumunu korumaz ve genellikle parçalanmayı bir dereceye kadar artırır. Bu, veritabanını tekrar tekrar daraltmamak için başka bir nedendir.

  • Aynı veritabanında aynı anda birden çok dosyayı sırayla daraltın. Sistem tablolarındaki çekişmeler blokaj nedeniyle gecikmelere neden olabilir.

Ayrıca not:

DBCC SHRINKFILE işlemler sürecin herhangi bir noktasında durdurulabilir ve tamamlanan işler korunur.

Bunu yaparken mutlaka göz önünde bulundurmanız gereken birkaç şey vardır ve Paul Randal'ın bu işlemi yaparken ne olduğuna dair blog yazısına bir göz atmanızı tavsiye ederim .

İlk adım, dosyalarda kullanılan alanın yanı sıra, gerçekte ne kadar alan ve boş alanın değiştirilebileceğini doğrulamak olacaktır.

use AdventureWorks2012;
go

;with db_file_cte as
(
    select
        name,
        type_desc,
        physical_name,
        size_mb = 
            convert(decimal(11, 2), size * 8.0 / 1024),
        space_used_mb = 
            convert(decimal(11, 2), fileproperty(name, 'spaceused') * 8.0 / 1024)
    from sys.database_files
)
select
    name,
    type_desc,
    physical_name,
    size_mb,
    space_used_mb,
    space_used_percent = 
        case size_mb
            when 0 then 0
            else convert(decimal(5, 2), space_used_mb / size_mb * 100)
        end
from db_file_cte;

6

Bu, tabloyu kestiğinizde ve 128 Kitaptan Başına Çevrimiçi Olarak Kitap Eklentisi'nin kaldırılmasını içeren normal bir davranıştır

Büyük dizinleri düşürdüğünüzde ya da yeniden kurduğunuzda ya da büyük tabloları düşürdüğünüz ya da kısalttığınız zaman, Veritabanı Altyapısı, bir işlem tamamlanıncaya kadar gerçek sayfa ayrılmalarını ve ilişkili kilitlerini savunur. Bu uygulama, çok kullanıcılı bir ortamda hem otomatik işletimi hem de açık işlemleri desteklemektedir ve 128'den fazla uzantı kullanan büyük tablolar ve dizinler için geçerlidir.

Veritabanı Altyapısı, işlemi iki ayrı aşamaya bölerek büyük nesneleri bırakmak için gereken ayırma kilitlerini önler: mantıksal ve fiziksel.

Mantıksal aşamada, tablo veya indeks tarafından kullanılan mevcut tahsis birimleri tahsisat için işaretlenir ve işlem tamamlanıncaya kadar kilitlenir. Bırakılan kümelenmiş bir dizinde, veri satırları kopyalanır ve daha sonra kümelenmiş bir dizine veya bir yığına yeniden oluşturulmuş yeni ayırma birimlerine taşınır. (Dizin yeniden oluşturma durumunda, veri satırları da sıralanır.) Bir geri alma olduğunda, yalnızca bu mantıksal aşamanın geri alınması gerekir.

İşlem tamamlandıktan sonra fiziksel aşama gerçekleşir. Uzaklaştırma için işaretlenmiş tahsis birimleri, gruplar halinde fiziksel olarak düşürülür. Bu damlalar arka planda gerçekleşen kısa işlemlerin içinde gerçekleştirilir ve çok fazla kilit gerektirmez.

Bir işlemin ardından fiziksel aşama gerçekleştiğinden, tablonun veya dizinin depolama alanı hala kullanılamıyor gibi görünebilir. Fiziksel faz tamamlanmadan önce veritabanının büyümesi için bu alan gerekliyse, Veritabanı Altyapısı, ayrılması için işaretlenmiş ayırma birimlerinden alan kurtarmaya çalışır. Şu anda bu ayırma birimleri tarafından kullanılan alanı bulmak için, sys.allocation_units katalog görünümünü kullanın.

Ertelenen bırakma işlemleri tahsis edilen alanı derhal serbest bırakmaz ve Veri Tabanı Motorunda ek masraflar getirir. Bu nedenle, 128 veya daha az uzantı kullanan tablolar ve dizinler, SQL Server 2000'deki gibi düşürülür, kesilir ve yeniden oluşturulur. Bu, hem işlem hem de işlemden önce gerçekleşen mantıksal ve fiziksel aşamaları ifade eder.

Beklemeniz gerekecek ve tabii ki dosyayı geri almak için el ile daraltmak zorunda kalacaksınız , ayrıca daralmanın mantıksal parçalanmaya neden olduğunu ve ihtiyaçlarınız mezar olmadıkça kaçınılması gerektiğini belirtmek gerekir. Küçülen ve parçalanma arasında nasıl bir denge kuracağınız belli olacaktır. Küçültmenin gerçekte sorunu yeniden çözüp çözemeyeceğini kendinize sormak daha iyidir.

Veritabanında ne kadar boş alan olduğunu kontrol etmek için aşağıdaki sorguyu kullanın

SELECT name ,size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB
FROM sys.database_files;

6

Tom ve Shanky'nin cevaplarına ek olarak, eğer veritabanınız LOB / BLOB verilerini içeriyorsa, DBCC SHRINKFILE çalışmayabilir. Bu durumda, veritabanını çevrimdışına alıp alamayacağınıza bağlı olarak iki seçeneğiniz vardır. Veritabanını çevrimdışı duruma getirebilirseniz, boş alanı kaldırmak için verileri kopyalamanız ve yeniden kopyalamanız gerekir. Bunu aşağıdakilerden biriyle yapabilirsiniz:

  1. Tüm tabloyu yeni bir tabloya aktarmak için SELECT INTO deyimi kullanarak . Özgün tabloyu bırakın, DBCC SHRINKFILE komutunu çalıştırın . Yeni tabloyu özgün tablo adına yeniden adlandırın.
  2. Tabloyu yerel modda kopyalamak için bcp'yi kullanarak tabloyu bırakın, DBCC SHRINKFILE komutunu çalıştırın , tablo oluşturun ve ardından verileri tabloya bcp olarak yerleştirin.
  3. Kullanılması İhracat / İçe yeni bir veritabanına tüm verileri taşımak varolan veritabanını bırak, özgün veritabanı adıyla yeni bir veritabanı yeniden adlandırmak için.

Veritabanını çevrimdışına alamazsanız , DBCC SHRINKFILE komutunu EMPTYFILE seçeneğiyle birlikte kullanabilirsiniz .

Çevrimdışı kopya için ayrıntılar: http://support.microsoft.com/kb/324432/tr

EMPTYFILE seçeneği için güncel bilgiler http://msdn.microsoft.com/en-us/library/ms189493(v=sql.105).aspx

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.