Sådan finder du årsagen til, at TempDB er fuld i din SQL Server

Hvis temp DB-databasen for din SQL Server løber tør for plads, kan det forårsage store forstyrrelser i dit produktionsmiljø og kan afbryde brugerapplikationer fra vellykket afslutning. Hvis du bruger et script til at spore temp DB-størrelse, skal du tilføje scriptet fra denne artikel for at identificere grundårsagen til temp DB-udfyldning.

Tempdb fuld - et almindeligt scenario

Tempdb Dårligt skrevne forespørgsler kan skabe flere temporary-objekter, der resulterer i en voksende tempdb-database. Dette ender i diskpladsadvarsler og kan forårsage serverproblemer. Når mange SQL Server databaseadministratorer finder det meget vanskeligt at formindske tempdb, vælger de straks serverrestart. Hvis havde prøvet alle metoder til at formindske tempdb-databasen, og hvis den stadig ikke krymper, er den sidste mulighed at restart SQL Service gennem konfigurationsstyring. Dermed stopper dine diskpladsadvarsler og serverproblemer stopper også. Restarting tempdb er muligvis ikke tilgængelig for dig, hvis problemet havde fundet sted på en produktionsserver.

DBCC

DBCCI sådanne tilfælde er der flere DBCC-kommandoer, som når de køres, giver dig mulighed for at formindske tempdb. Hvis du havde oprettet scripts til proaktivt at overvåge tempdb-størrelsen, kan du bruge dette script til at finde ud af fyldere af tempdb. Fra nu af bliver dette script udført på alle linkservere. Du kan nemt kontrollere det ved at sætte en hvor-klausul. Du kan kun få scriptet til at blive udført, når der er et problem med din tempdb. Tabellen @Tserver bruges til at gemme alle dine tilknyttede servernavne. For en tempdb-database, SQL-korruption ville ændre status for databasen som SUSPECT, og dette vil afbryde SQL Server service fra 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

Forfatter Introduktion:

Neil Varley er en datagendannelsesekspert i DataNumen, Inc., som er verdens førende inden for datagendannelsesteknologier, herunder gendanne Outlook og excel-genopretningssoftwareprodukter. For mere information besøg www.datanumen.com

Kommentarer er lukket.