web-dev-qa-db-fra.com

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

Est-il nécessaire de redémarrer SQL Server après DBCC SHRINKFILE sur tempdb.mdf ou existe-t-il une autre méthode pour réduire la taille de tempdb.mdf sans 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.

15
Manii

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 opération SHRINKFILE. 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 utilisez 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.

15
Ionic

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

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