Hoe u de reden kunt vinden waarom TempDB vol is in uw SQL Server

Als de tijdelijke DB-database van uw SQL Server onvoldoende ruimte heeft, kan het grote verstoringen in uw productieomgeving veroorzaken en kan het de succesvolle voltooiing van gebruikerstoepassingen onderbreken. Als u een script gebruikt om de tijdelijke DB-grootte bij te houden, voegt u het script uit dit artikel toe om de hoofdoorzaak van de tijdelijke DB-vulling te identificeren.

Tempdb full - een veelvoorkomend scenario

Tempdb Slecht geschreven query's kunnen meerdere tijdelijke objecten aanmaken, wat resulteert in een groeiende tempdb-database. Dit leidt tot waarschuwingen over onvoldoende schijfruimte en kan serverproblemen veroorzaken. Wanneer veel SQL Server Databasebeheerders vinden het vaak erg lastig om de tempdb-database te verkleinen en kiezen daarom direct voor een serverherstart. Als alle methoden om de tempdb-database te verkleinen zijn geprobeerd en dit nog steeds niet lukt, is de laatste optie om de SQL-service via Configuration Manager opnieuw te starten. Hierdoor zouden de waarschuwingen over schijfruimte moeten verdwijnen en de serverproblemen opgelost moeten zijn. Het opnieuw starten van tempdb is echter mogelijk geen optie als het probleem zich voordoet op een productieserver.

DBCC

DBCCIn dergelijke gevallen zijn er verschillende DBCC-opdrachten waarmee u tempdb kunt verkleinen wanneer u ze uitvoert. Als u scripts had ingesteld om proactief de tempdb-grootte te controleren, kunt u dit script gebruiken om vulstoffen van tempdb te achterhalen. Vanaf nu zou dit script op alle linked servers worden uitgevoerd. U kunt het gemakkelijk besturen door een where-clausule te plaatsen. U kunt het script alleen laten uitvoeren als er een probleem is met uw tempdb. De tabel @Tserver wordt gebruikt om al uw gekoppelde servernamen op te slaan. Voor een tempdb-database, SQL-corruptie zou de status van de database veranderen als SUSPECT en dit zal onderbreken SQL Server service vanaf het begin.

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

Auteur Introductie:

Neil Varley is een expert op het gebied van gegevensherstel in DataNumen, Inc., de wereldleider in technologieën voor gegevensherstel, waaronder Outlook herstellen en Excel-herstelsoftwareproducten. Voor meer informatie bezoek www.datanumen.com

Reacties zijn gesloten.