Comment trouver la raison pour laquelle TempDB est plein dans votre SQL Server

Partage maintenant:

Si la base de données temporaire de votre SQL Server manque d'espace, cela peut provoquer des perturbations majeures dans votre environnement de production et peut interrompre l'exécution réussie des applications utilisateur. Si vous utilisez un script pour suivre la taille de la base de données temporaire, ajoutez le script de cet article pour identifier la cause première du remplissage de la base de données temporaire.

Tempdb complet - un scénario courant

base de données temporaire Des requêtes mal écrites peuvent créer plusieurs temposrary objets résultant en une base de données tempdb croissante. Cela se terminera par des alertes d'espace disque et pourrait causer des problèmes de serveur. Quand beaucoup SQL Server les administrateurs de base de données trouvent qu'il est très difficile de réduire la tempdb, ils optent immédiatement pour la résolution du serveurtart. Si vous avez essayé toutes les méthodes pour réduire la base de données tempdb et si elle ne se réduit toujours pas, la dernière option consiste à restart Service SQL via le gestionnaire de configuration. Ainsi, vos alertes d'espace disque s'arrêteraient et les problèmes de serveur s'arrêteraient également. Cependant, restarting tempdb peut ne pas être disponible si le problème s'est produit sur un serveur de production.

CCDB

CCDBDans de tels cas, il existe plusieurs commandes DBCC qui, lorsqu'elles sont exécutées, vous permettent de réduire tempdb. Si vous avez configuré des scripts pour surveiller de manière proactive la taille de tempdb, vous pouvez utiliser ce script pour trouver les remplisseurs de tempdb. À partir de maintenant, ce script serait exécuté sur tous les serveurs liés. Vous pouvez le contrôler facilement en mettant une clause where. Vous pouvez faire en sorte que le script ne soit exécuté qu'en cas de problème avec votre tempdb. La table @Tserver est utilisée pour stocker tous vos noms de serveurs liés. Pour une base de données tempdb, Corruption SQL changerait le statut de la base de données en SUSPECT et cela interromprait SQL Server service de starting.

DECLARE @Tserver TABLE 
  ( 
     cserver VARCHAR(200) 
  ) 

INSERT INTO @Tserver 
VALUES      ('SERVERNAME') 

DECLARE @LogTable TABLE 
  ( 
     cservername VARCHAR(200), 
     cssionid    SMALLINT, 
     callocmb    BIGINT, 
     cdeallocmb  BIGINT, 
     ctext       VARCHAR(4000), 
     cstatement  VARCHAR(4000) 
  ) 
DECLARE c1 CURSOR FOR 
  SELECT * 
  FROM   @Tserver 
DECLARE @cmd    NVARCHAR(4000), 
        @server VARCHAR(200) 

OPEN c1 

FETCH next FROM c1 INTO @server 

WHILE @@FETCH_STATUS = 0 
  BEGIN 
      SET @cmd = 'EXEC(''use tempdb Declare @Table1 table  ( cdeallopages bigint, callopages bigint, cssionid smallint, creqstid int ) insert into @Table1 SELECT SUM(internal_objects_dealloc_page_count), SUM(internal_objects_alloc_page_count), session_id, request_id  FROM sys.dm_db_task_space_usage WITH (NOLOCK) WHERE session_id <> @@SPID GROUP BY session_id, request_id declare @Table2 table ( cssionid smallint, callocmb bigint, cdeallocmb bigint, ctext varchar(4000), cstatement varchar(4000) ) insert into @Table2 SELECT TBL1.cssionid, TBL1.callopages * 1.0 / 128 , TBL1.cdeallopages * 1.0 / 128 , TBL3.text, ISNULL( NULLIF( SUBSTRING( TBL3.text,  TBL2.statement_start_offset / 2,  CASE WHEN TBL2.statement_end_offset < TBL2.statement_start_offset  THEN 0  ELSE( TBL2.statement_end_offset - TBL2.statement_start_offset ) / 2 END ), '''''''' ), TBL3.text ) FROM @Table1 AS TBL1 INNER JOIN sys.dm_exec_requests TBL2 WITH (NOLOCK) ON  TBL1.cssionid = TBL2.session_id AND TBL1.creqstid = TBL2.request_id OUTER APPLY sys.dm_exec_sql_text(TBL2.sql_handle) AS TBL3 OUTER APPLY sys.dm_exec_query_plan(TBL2.plan_handle) AS TBL4 WHERE TBL3.text IS NOT NULL OR TBL4.query_plan IS NOT NULL ORDER BY 3 DESC; Select * from @Table2'') at [' + @server + ']' 

      PRINT @cmd 

      INSERT INTO @LogTable 
                  (cssionid, 
                   callocmb, 
                   cdeallocmb, 
                   ctext, 
                   cstatement) 
      EXEC(@cmd) 

      UPDATE @LogTable 
      SET    cservername = @server 
      WHERE  cservername IS NULL 

      FETCH next FROM c1 INTO @server 
  END 

CLOSE c1 

DEALLOCATE c1 

SELECT * 
FROM   @LogTable

Introduction de l'auteur:

Neil Varley est un expert en récupération de données dans DataNumen, Inc., qui est le leader mondial des technologies de récupération de données, y compris récupérer Outlook et des produits logiciels de récupération Excel. Pour plus d'informations, visitez www.datanumen.com

Partage maintenant:

Les commentaires sont fermés.