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.

boyutunu tempdbdeğ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ı zaman içinde beklenmedik şekilde 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 veritabanının tempdb bir kopyasını kullanarak yeniden oluşturulur model ve son yapılandırılan boyutuna sıfırlanırtempdb. Yapılandırılan boyut, ALTER DATABASE seçeneğiyle veya MODIFY FILE, DBCC SHRINKFILE ya da DBCC SHRINKDATABASE ifadeleriyle bir dosya boyutunu değiştirme işlemi kullanarak ayarladığınız son açık boyuttur. Bu nedenle, farklı değerler kullanmanız gerekmediği veya büyük tempdb bir veritabanını hemen çözümlemek istemediğiniz 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. Küçültme işleminin tempdb başarılı olduğundan emin olmak için, sunucu tek kullanıcı modundayken veya tüm tempdb etkinlikleri durdurduğunuzda bu işlemi gerçekleştirin.

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 varsayılan tempdb mantıksal dosyalarda tempdev ve templogüzerinde çalışır. öğesine tempdbdaha fazla dosya eklerseniz, 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. Ekstra dosyaları tempdb'den kaldırmak için REMOVE FILE seçeneğiyle ALTER DATABASE komutunu kullanın.

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

Not

Sqlcmd, SQL Server Management Studio (SSMS) veya Visual Studio Code için MSSQL uzantısı gibi tanıdık herhangi bir SQL Server istemci aracını kullanarak sql Server örneğine bağlanabilirsiniz.

  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. istediğiniz boyutu <target_size_in_MB> yerine koyun:

    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 istemi penceresinde Ctrl+C tuşuna basın, SQL Server'ı bir hizmet olarak yeniden başlatın ve ardından tempdb.mdf ve templog.ldf dosyalarının boyutunu denetleyin.

DBCC SHRINKDATABASE komutunu kullanma

DBCC SHRINKDATABASE parametresini target_percent alır. Bu parametre, veritabanı daraltıldıktan sonra veritabanı dosyasında bırakmak istediğiniz boş alan yüzdesini ayarlar. kullanıyorsanız DBCC SHRINKDATABASESQL Server'ı yeniden başlatmanız gerekebilir.

  1. Saklı yordamı kullanarak sp_spaceused tarafından tempdb için şu anda kullanılan alanı denetleyin. Ardından parametresi olarak DBCC SHRINKDATABASEkullanılacak 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 komutunu çalıştırmanız 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 = yüzde 25'e bölün ve bu değer sizin target_percentolur. İş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. 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 komutu tempdb üzerinde kullanıldığında sınırlamalar vardır. Veri ve günlük dosyalarının hedef boyutunu, veritabanı oluşturulurken belirtilen boyuttan küçük olacak şekilde ayarlayamazsınız. Ayrıca, bir dosya boyutu değiştirme işlemi olarak ALTER DATABASE ve MODIFY FILE seçeneklerini kullanarak açıkça belirlemiş olduğunuz son boyuttan daha küçük bir boyut ayarlayamazsınız. Başka bir sınırlama, target_percentage parametresinin hesaplanması ve bu hesaplamanın kullanılan mevcut alana olan bağımlılığıdır.

DBCC SHRINKFILE komutunu kullanma

DBCC SHRINKFILE Tek tek tempdb dosyaları küçültmek için 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 parametresini target_size alır. Bu parametre, veritabanı dosyası için istenen son boyutu ayarlar.

  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, Visual Studio Code veya sqlcmd ile SQL Server'a bağlanın. Ardından 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
    

Bunun bir avantajı DBCC SHRINKFILE , dosyanın boyutunu özgün boyutundan daha küçük bir boyuta indirgeyebilmektir. Veri veya günlük dosyalarından herhangi birinde DBCC SHRINKFILE çalıştırabilirsiniz. Veritabanını model veritabanının boyutundan küçük yapamazsınız.

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

Eğer tempdb kullanımdaysa ve DBCC SHRINKDATABASE veya DBCC SHRINKFILE komutlarını kullanarak küçültmeye çalışırsanız, aşağıdaki çıkışa benzer iletiler alabilirsiniz. Tam ileti, kullandığınız SQL Server sürümüne bağlıdır:

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.