web-dev-qa-db-fra.com

TEMPDB augmente continuellement dans SQL Server

J'ai utilisé des tables TEMP et déposez la même chose dans la procédure stockée dans ma base de données. Quand j'essaie de vérifier mes données tempdb à l'aide de Select * from tempdb.sys.tables, Je reçois de nombreuses tables avec des noms comme # A002FF4B, # A08A53F2 ... etc (nom avec des caractères hexagonaux).

Ces tables sont activement ajoutées dans mon TEMPDB et il est complet. Donc, parfois, mon application s'arrête en raison de cela n'est pas capable d'accéder à SQL Server une fois que TEMPDB est plein.

Comment puis-je résoudre ce problème?

2
Riddhi

Si vous faites une recherche rapide sur ce même site, vous trouverez de nombreuses questions similaires. Fondamentalement, un certain processus prend de long et fait grandir votre TEMDB jusqu'à ce que vous manquiez d'espace. Selon Brent Ozar "TEMPDB est comme une toilette publique", tout le monde (toutes sortes de processus) l'utilisent et généralement pour faire des choses sale.

Ce que vous devriez faire est de localiser ce qui rend votre tempdb croissance, recherchez cette cause première et la résolvez-la. Si vous ne faites pas cela, vous allez toujours traiter avec des problèmes tels que celui-ci. Vous pouvez, en tant que solution temporelle, courez un rétrécissement sur la TEMPDB pour libérer de l'espace. S'il vous plaît s'il vous plaît éviter d'avoir un travail automatisé à faire des contractions.

Vous avez plusieurs options pour trouver la cause, exécutant une trace de profileur SQL Server pour suivre l'activité TEMPDB. De plus, vous pouvez utiliser SP_WhoisActiveCactive Pour enregistrer l'activité sur le serveur, tandis que tout ce qui est en cours d'exécution, vous pouvez donc vérifier ce journal après et voir des requêtes possibles ou des processus qui le causent. Kendra Little a une entrée de blog complet sur la façon de faire cela .

Pour certains échantillons de code spécifiques, look ici et ici . Ce ne sont que quelques échantillons, comme commenté la première ligne, ce problème commun, vous devriez donc trouver des tonnes de réponses utiles ici sur le site Stackexchange.

1
Yaroslav

Votre demande a probablement une fuite de table Temp. Si une session crée une table TEMP mais ne le dépose pas, cette table TEMP restera dans TEMPDB jusqu'à ce que la session soit terminée (ou SQL Server est redémarré). Donc, si l'application ne dépose pas spécifiquement une table TEMPDB, mais conserve de créer de nouveaux chaque fois qu'une certaine requête est exécutée, vous vous retrouvez avec de nombreuses tables dans TEMPDB qui sont "orphelins" pour ainsi dire.

Cela peut se produire si le code comprend une instruction DROP pour déposer la table TEMP, mais elle n'atteint jamais l'instruction DROP, car le code prend une autre voie ou jette une erreur avant la DROP Déclaration et le traitement des erreurs n'incluent pas la déclaration DROP. Donc, le code doit être analysé pour que toutes les tables temporaires soient abandonnées, quelle que soit la voie du code du code, ou lorsqu'il pourrait rencontrer une erreur. Juste parce qu'il y a une instruction DROP ne signifie pas que c'est exécuté.

Solutions de contournement immédiat jusqu'à ce que le code puisse être corrigé:

  • Donnez suffisamment d'espace disque pour TEMPDB qu'il peut contenir toutes les tables de fuite jusqu'à la prochaine redémarrage/redémarrage
  • Redémarrez le serveur (ou au moins Stop/Démarrez SQL Server) plus souvent si possible
  • Arrêter/démarrer le (s) serveur (s) d'application) plus souvent

Si aucun de ceux-ci n'est possible et que vous êtes désespéré, vous risquez de courir quelque chose pour laisser tomber périodiquement une table ancienne (voir - nettoyage TEMPDB ), mais sachez que cela pourrait causer des problèmes si vous avez fini par supprimer des tables TEMP. que l'application s'attend à être là.

0
Tony Hinkle