SQL Server'ı yeniden başlatmadan tempdb.mdf boyutunu küçültmek / küçültmek için herhangi bir yol var mı


15

O sonra SQL Server yeniden başlatmak için gerekli mi DBCC SHRINKFILEüzerine tempdb.mdfveya boyutunu azaltmak için başka bir yöntem yoktur tempdb.mdfSQL Server yeniden başlatmadan?

Lütfen bir üretim sunucusu için buna ihtiyaç duyduğumdan ve herhangi bir kesinti olmadan küçülmeyi umuyorum.


2
DBCC SHRINKFILE hizmetin yeniden başlatılmasını gerektirmez.
Greg

Tempdb'yi kullanımda olduğu gibi küçültemezsiniz. Ve evet bunun için bir çözüm var ama çok temiz değil ve bazı yan etkileri var.
İyonik

Yanıtlar:


15

Bunu şu şekilde yapabilirsiniz:

-- write everything from your buffers to the disc!
CHECKPOINT; 
GO
-- Clean all buffers and caches
DBCC DROPCLEANBUFFERS; 
DBCC FREEPROCCACHE;
DBCC FREESYSTEMCACHE('ALL');
DBCC FREESESSIONCACHE;
GO
-- Now shrink the file to your desired size
DBCC SHRINKFILE (TEMPDEV, 40960);
-- Make sure that there is no running transaction which uses the tempdb while shrinking!
-- This is most trickiest part of it all.
GO

Son adım en zor olanıdır. Küçültme işlemi sırasında tempdb'yi başka hiçbir işlem kullanmamalıdır, çünkü bu işleminizin iptal edilmesine neden olabilir SHRINKFILE. Tempdb'nin büzülmesi oldukça kolay olduğu için, büzülmesi uzun sürmemelidir.

Bunun "yumuşak yeniden başlatma" gibi bir şey olduğuna dikkat edin. Her şey tamponlardan kaldırılacak ve diske yazılacak. Bu, tüm yazma işlemlerini gerçekleştirmesi gerektiği için G / Ç alt sisteminiz (yazma) üzerinde bir etki anlamına gelir. Bundan sonra dosyayı (okuma ve yazma performansı üzerinde etkisi olan) küçültebilirsiniz ve sonunda, herhangi bir tabloyu sorgulayan tüm işlemlerin verileri G / Ç alt sisteminden arabelleklere geri alması gerekir. Bu, yeniden başlatmanın ötesine zarar verebilir.

Bir geliştirme sistemi kullanıyorsanız, makineyi bu şekilde yeniden başlatmanız yeterlidir. Ancak yük devretme ortağı olmayan bazı üretim sistemlerinde bu yararlı olabilir.


güzel açıklama için teşekkürler Ionic. Benim durumumda tempdb.mdf 46 GB. Hiçbir işlem yapılmıyorsa% 100'e küçültebilirim. Lütfen önermek.
Manii

Evet, 40960MB sadece bir örnektir. Sistemimde tempdb normalde ~ 50GB'da çalışıyor ve nadir durumlarda 200GB'a çıkıyor. :-)
Ionic

<pre> DBCC SHRINKFILE (tempdev, 1024) olarak sorguyu çalıştırıyorum; </b> </b> Ve başarıyla alanı serbest bıraktım, ancak tekrar çalıştırıyorum </b> </b> Sorguyu şu şekilde çalıştırıyorum DBCC SHRINKFILE (tempdev, 30000); </b> </b> Ve bana aşağıdaki gibi sonuç verdi: </b> </b> DbId Alan Geçerli Boyut Minimum Boyut Kullanılan Sayfalar Tahmini Sayfalar </b> 2 1 5699352 1024 696 696 </b> </b> Ancak kontrol edilen tempdb boyutu azaltılmadı. </pre>
Manii

Bu ileti, daraltma sırasında tempdb'yi kullanırsa oluşabilir. Tanımlı küçültme boyutunuzun (~ 30GB) tempdb'nizin serbest sınırının üstünde olması da olabilir.
İyonik

1

Sadece aşağıdaki adımla gidebilirsiniz

USE tempdb;
GO;
dbcc freeproccache;
DBCC SHRINKFILE (tempdb_file_name, memory_in_MB);
GO;

Cevabınız yukarıdaki yanıttan nasıl farklı?
Kin Shah

1
Merhaba Kin, Tempdb DBCC FREEPROCCACHE ile dosya boyutu küçültülecektir; ve sonra tempdb dosyasını küçültün. Shrink tempdb için aşağıdaki ifadeye ihtiyacımız yok. DBCC DROPCLEANBUFFERS; DBCC FREESYSTEMCACHE ('TÜM'); DBCC FREESESSIONCACHE;
JERRY

1
Bu daha basit bir yanıttır, çoğu durumda tempdb'yi küçültmenize izin vermek için sadece DBCC FREEPROCCACHE gereklidir. İlgili soruyu görün
James Jenkins
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.