Existe-t-il un moyen de réduire / réduire la taille de tempdb.mdf sans redémarrer SQL Server

15

Est-il nécessaire de redémarrer SQL Server après avoir DBCC SHRINKFILEactivé tempdb.mdfou existe-t-il une autre méthode pour réduire la taille de tempdb.mdfsans redémarrer SQL Server?

Veuillez m'aider car j'ai besoin de cela pour un serveur de production et j'espère faire le rétrécissement sans aucun temps d'arrêt.

Manii
la source
2
DBCC SHRINKFILE ne nécessite pas de redémarrage du service.
Greg
Vous ne pouvez pas réduire le tempdb tel qu'il est en cours d'utilisation. Et oui, il existe une solution pour cela, mais ce n'est pas très propre et a des effets secondaires.
Ionic

Réponses:

15

Vous pouvez le faire de cette façon:

-- 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

La dernière étape est la plus délicate. Pendant le processus de réduction, aucune autre action ne doit utiliser tempdb, car cela pourrait entraîner un abandon de votre SHRINKFILEopération. En raison du fait que le tempdb est assez facile à rétrécir, il ne devrait pas prendre trop de temps pour le rétrécir.

Attention, cela ressemble à un "redémarrage en douceur". Tout sera supprimé des tampons et écrit sur le disque. Cela signifie un impact sur votre sous-système d'E / S (écriture) car il doit gérer toutes les opérations d'écriture. Après cela, vous pouvez réduire le fichier (ce qui a un impact sur les performances de lecture et d'écriture) et à la fin, tous les processus qui interrogent n'importe quelle table devront récupérer les données du sous-système d'E / S dans les tampons. Cela peut faire plus de mal qu'un redémarrage.

Si vous exécutez un système de développement, vous devez simplement redémarrer la machine au lieu de cette façon. Mais sur certains systèmes de production sans partenaire de basculement, cela peut être utile.

Ionique
la source
merci Ionic pour la belle explication. tempdb.mdf est de 46 Go dans mon cas. Si aucune transaction n'est en cours, puis-je la réduire à 100%. Veuillez suggérer.
Manii
Oui, le 40960MB n'est qu'un exemple. Sur mon système, le tempdb fonctionne normalement à ~ 50 Go et dans de rares cas, atteint 200 Go. :-)
Ionic
<pre> J'exécute la requête en tant que DBCC SHRINKFILE (tempdev, 1024); </b> </b> Et il a réussi à libérer de l'espace mais encore une fois je l'exécute comme </b> </b> J'exécute la requête en tant que DBCC SHRINKFILE (tempdev, 30000); </b> </b> Et cela m'a donné le résultat ci-dessous: </b> </b> Champ DbId Taille actuelle Taille minimale Pages utilisées Pages estimées </b> 2 1 5699352 1024 696 696 </b> </b> Mais comme vérifié, la taille de tempdb n'a pas été réduite. </pre>
Manii
Ce message peut se produire si une transaction utilise tempdb lors de la réduction. Il se peut également que votre taille de rétrécissement définie (~ 30 Go) soit supérieure à la limite gratuite de votre tempdb.
Ionic
1

Vous pouvez simplement aller avec l'étape ci-dessous uniquement

USE tempdb;
GO;
dbcc freeproccache;
DBCC SHRINKFILE (tempdb_file_name, memory_in_MB);
GO;
JERRY
la source
En quoi votre réponse est-elle différente de la précédente?
Kin Shah
1
Bonjour Kin, Tempdb La taille du fichier sera réduite avec DBCC FREEPROCCACHE; puis réduisez le fichier tempdb. Nous n'avons pas besoin de l'instruction ci-dessous pour rétrécir tempdb. DBCC DROPCLEANBUFFERS; DBCC FREESYSTEMCACHE («TOUS»); DBCC FREESESSIONCACHE;
JERRY
1
C'est la réponse la plus simple, dans la plupart des cas, seul le DBCC FREEPROCCACHE est nécessaire pour vous permettre de réduire la tempdb. Voir la question connexe
James Jenkins