Aracılığıyla paylaş


Tempdb veritabanını küçültme

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

Bu makalede, SQL Server'da tempdb veritabanını küçültmek için kullanabileceğiniz çeşitli yöntemler ele alınmaktadır.

tempdbboyutunu değiştirmek için aşağıdaki yöntemlerden herhangi birini kullanabilirsiniz. İlk üç seçenek bu makalede açıklanmıştır. SQL Server Management Studio'yu (SSMS) kullanmak istiyorsanız, Veritabanını daraltiçindeki yönergeleri izleyin.

Yöntem Yeniden başlatma gerekiyor mu? Daha fazla bilgi
ALTER DATABASE Evet Varsayılan tempdb dosyalarının (tempdev ve templog) boyutu üzerinde tam denetim sağlar.
DBCC SHRINKDATABASE Hayır Veritabanı düzeyinde çalışır.
DBCC SHRINKFILE Hayır Tek tek dosyaları küçültmenizi sağlar.
SQL Server Management Studio Hayır Grafik kullanıcı arabirimi aracılığıyla veritabanı dosyalarını küçültün.

Açıklamalar

Varsayılan olarak, tempdb veritabanı gerektiğinde otomatik olarak büyüyecek şekilde yapılandırılır. Bu nedenle, bu veritabanı beklenmedik bir şekilde zaman içinde istenen boyuttan daha büyük bir boyuta büyüyebilir. Daha büyük tempdb veritabanı boyutları SQL Server'ın performansını olumsuz etkilemez.

SQL Server başlatıldığında, tempdbmodel veritabanının bir kopyası kullanılarak yeniden oluşturulur ve tempdb son yapılandırılan boyutuna sıfırlanır. Yapılandırılan boyut, ALTER DATABASE seçeneğini veya MODIFY FILE ya da DBCC SHRINKFILE deyimlerini kullanan DBCC SHRINKDATABASE gibi bir dosya boyutu değiştirme işlemi kullanılarak ayarlanan son açık boyutdur. Bu nedenle, farklı değerler kullanmanız veya büyük bir tempdb veritabanına anında çözüm almanız gerekmediği sürece, boyutun azalması için SQL Server hizmetinin bir sonraki yeniden başlatılmasını bekleyebilirsiniz.

tempdb etkinliği devam ederken tempdb'ı küçültebilirsiniz. Ancak, engelleme, kilitlenmeler vb. gibi küçültmenin tamamlanmasını engelleyebilecek başka hatalarla karşılaşabilirsiniz. Bu nedenle, bir küçültme işleminin tempdb başarılı olduğundan emin olmak için, sunucu tek kullanıcı modundayken veya tüm tempdb etkinliği durdurduğunuzda bunu yapmanızı öneririz.

SQL Server, bir işlemi geri almak için tempdb işlem günlüğüne yalnızca yeterli bilgiyi kaydeder, ancak veritabanı kurtarma sırasında işlemleri yinelemez. Bu özellik, INSERTiçindeki tempdb deyimlerinin performansını artırır. Ayrıca, SQL Server'ı her yeniden başlattığınızda tempdb yeniden oluşturulduğundan, herhangi bir işlemi yeniden gerçekleştirmek için bilgileri kaydetmenize gerek yoktur. Bu nedenle, ileri taşımak veya geri almak için hiçbir işlem yapılmamıştır.

tempdbyönetimi ve izlenmesi hakkında daha fazla bilgi için bkz. Kapasite planlama ve tempdb kullanımı izleme.

ALTER DATABASE komutunu kullanma

Not

Bu komut yalnızca tempdb ve tempdevvarsayılan templog mantıksal dosyaları üzerinde çalışır. tempdbdaha fazla dosya eklenirse, SQL Server'ı hizmet olarak yeniden başlattıktan sonra bunları küçültebilirsiniz. Tüm tempdb dosyaları başlatma sırasında yeniden oluşturulur. Ancak, bu dosyalar boş ve kaldırılabilir. tempdb'daki ek dosyaları kaldırmak için ALTER DATABASE seçeneğiyle REMOVE FILE komutunu kullanın.

Bu yöntem SQL Server'ı yeniden başlatmanızı gerektirir.

  1. SQL Server'ın durdurulması.

  2. Komut isteminde örneği en düşük yapılandırma modunda başlatın. Bunu yapmak için şu adımları izleyin:

    1. Komut isteminde SQL Server'ın yüklü olduğu klasöre geçin (aşağıdaki örnekte <VersionNumber> ve <InstanceName> değiştirin):

      cd C:\Program Files\Microsoft SQL Server\MSSQL<VersionNumber>.<InstanceName>\MSSQL\Binn
      
    2. Örnek SQL Server'ın adlandırılmış bir örneğiyse aşağıdaki komutu çalıştırın (aşağıdaki örnekteki <InstanceName> değiştirin):

      sqlservr.exe -s <InstanceName> -c -f -mSQLCMD
      
    3. Örnek SQL Server'ın varsayılan örneğiyse aşağıdaki komutu çalıştırın:

      sqlservr -c -f -mSQLCMD
      

      Not

      -c ve -f parametreleri, SQL Server'ın veri dosyası için tempdb boyutu 1 MB ve günlük dosyası için 0,5 MB olan en düşük yapılandırma modunda başlamasına neden olur. -mSQLCMD parametresi, sqlcmd dışındaki tüm uygulamaların tek kullanıcılı bağlantıyı devralmasını engeller.

  3. sqlcmdile SQL Server'a bağlanın ve ardından aşağıdaki Transact-SQL komutlarını çalıştırın. <target_size_in_MB> istediğiniz boyutla değiştirin:

    ALTER DATABASE tempdb MODIFY FILE
    (NAME = 'tempdev', SIZE = <target_size_in_MB>);
    
    ALTER DATABASE tempdb MODIFY FILE
    (NAME = 'templog', SIZE = <target_size_in_MB>);
    
  4. SQL Server'ın durdurulması. Bunu yapmak için komut isteminde Ctrl+C tuşuna basın, SQL Server'ı bir hizmet olarak yeniden başlatın ve tempdb.mdf ve templog.ldf dosyalarının boyutunu doğrulayın.

DBCC SHRINKDATABASE komutunu kullanma

DBCC SHRINKDATABASE target_percentparametresini alır. Bu, veritabanı küçültüldikten sonra veritabanı dosyasında istenen boş alan yüzdesidir. DBCC SHRINKDATABASEkullanıyorsanız SQL Server'ı yeniden başlatmanız gerekebilir.

  1. tempdb saklı yordamını kullanarak sp_spaceused'da şu anda kullanılan alanı belirleyin. Ardından, DBCC SHRINKDATABASEparametresi olarak kullanılmak üzere kalan boş alan yüzdesini hesaplayın. Bu hesaplama, istenen veritabanı boyutunu temel alır.

    Not

    Bazı durumlarda, kullanılan alanı yeniden hesaplamak ve güncelleştirilmiş bir rapor almak için yürütmeniz sp_spaceused @updateusage = true gerekebilir. Daha fazla bilgi için bkz. sp_spaceused.

    Aşağıdaki örneği göz önünde bulundurun:

    tempdb iki dosyası olduğunu varsayalım: 1.024 MB olan birincil veri dosyası (tempdb.mdf) ve 360 MB olan günlük dosyası (tempdb.ldf). sp_spaceused birincil veri dosyasının 600 MB veri içerdiğini bildirdiğini varsayalım. Ayrıca, birincil veri dosyasını 800 MB'a küçültmek istediğinizi varsayalım. Küçültmeden sonra kalan istenen boş alan yüzdesini hesaplayın: 800 MB - 600 MB = 200 MB. Şimdi, 200 MB'ı 800 MB'ye bölün = yüzde 25 ve bu sizin target_percent. İşlem günlüğü dosyası buna göre küçülür ve veritabanı küçültükten sonra yüzde 25 veya 200 MB boş alan bırakır.

  2. SSMS, Azure Data Studio veya sqlcmdile SQL Server'a bağlanın ve aşağıdaki Transact-SQL komutunu çalıştırın. <target_percent> değerini istenen yüzdeyle değiştirin:

    DBCC SHRINKDATABASE (tempdb, '<target_percent>');
    

DBCC SHRINKDATABASEüzerinde tempdb komutuyla ilgili sınırlamalar vardır. Veri ve günlük dosyalarının hedef boyutu, veritabanı oluşturulduğunda belirtilen boyuttan küçük veya ALTER DATABASE seçeneğini kullanan MODIFY FILE gibi dosya boyutu değiştirme işlemi kullanılarak açıkça ayarlanan son boyuttan küçük olamaz. DBCC SHRINKDATABASE'nin bir diğer sınırlaması, target_percentage parametresinin hesaplanması ve kullanımda olan geçerli alana bağımlılığıdır.

DBCC SHRINKFILE komutunu kullanma

tek tek DBCC SHRINKFILE dosyalarını küçültmek için tempdb komutunu kullanın. DBCC SHRINKFILE, aynı veritabanına ait diğer dosyaları etkilemeden tek bir veritabanı dosyasında kullanabileceğiniz için DBCC SHRINKDATABASE daha fazla esneklik sağlar. DBCC SHRINKFILE target_size parametresini alır. Bu, veritabanı dosyası için istenen son boyutdur.

  1. birincil veri dosyası (tempdb.mdf), günlük dosyası (templog.ldf) ve tempdbeklenen ek dosyalar için istenen boyutu belirleyin. Dosyalarda kullanılan alanın istenen hedef boyutuna eşit veya daha küçük olduğundan emin olun.

  2. SSMS, Azure Data Studio veya sqlcmdile SQL Server'a bağlanın ve küçültmek istediğiniz belirli veritabanı dosyaları için aşağıdaki Transact-SQL komutlarını çalıştırın. <target_size_in_MB> istediğiniz boyutla değiştirin:

    USE tempdb;
    GO
    
    -- This command shrinks the primary data file
    DBCC SHRINKFILE (tempdev, '<target_size_in_MB>');
    GO
    
    -- This command shrinks the log file, examine the last paragraph.
    DBCC SHRINKFILE (templog, '<target_size_in_MB>');
    GO
    

DBCC SHRINKFILE bir avantajı, dosyanın boyutunu özgün boyutundan daha küçük bir boyuta indirgeyebilmektir. Veri veya günlük dosyalarından herhangi birine DBCC SHRINKFILE ekleyebilirsiniz. Veritabanını model veritabanının boyutundan küçük yapamazsınız.

Küçültme işlemlerini çalıştırdığınızda hata 8909

tempdb kullanılıyorsa ve DBCC SHRINKDATABASE veya DBCC SHRINKFILE komutlarını kullanarak küçültmeye çalışırsanız, kullandığınız SQL Server sürümüne bağlı olarak aşağıdakine benzer iletiler alabilirsiniz:

Server: Msg 8909, Level 16, State 1, Line 1 Table error: Object ID 0, index ID -1, partition ID 0, alloc unit ID 0 (type Unknown), page ID (6:8040) contains an incorrect page ID in its page header. The PageId in the page header = (0:0).

Bu hata, tempdb'de gerçek bir bozulma olduğunu göstermez. Ancak, fiziksel veri bozulması hatalarının 8909 hatası gibi başka nedenleri olabilir ve bu nedenler G/Ç alt sistemi sorunlarını içerebilir. Bu nedenle, hata küçültme işlemleri dışında oluşursa, daha fazla araştırmanız gerekir.

Uygulamaya veya küçültme işlemini yürüten kullanıcıya bir 8909 iletisi döndürülse de, küçültme işlemleri başarısız olmaz.