Как да намерите причината, поради която TempDB е пълен във вашия SQL Server

Споделете сега:

Ако временната DB база данни на вашата SQL Server изчерпва пространството, това може да причини големи смущения във вашата производствена среда и може да прекъсне успешното завършване на потребителските приложения. Ако използвате скрипт за проследяване на размера на временната DB, добавете скрипта от тази статия, за да идентифицирате основната причина за попълването на временната DB.

Tempdb пълен – често срещан сценарий

Tempdb Лошо написаните заявки могат да създадат няколко временни обекта, което ще доведе до нарастваща tempdb база данни. Това ще доведе до предупреждения за дисково пространство и може да причини проблеми със сървъра. Когато много SQL Server Администраторите на бази данни намират за много трудно да свият tempdb базата данни и веднага избират рестартиране на сървъра. Ако сте опитали всички методи за свиване на tempdb базата данни и тя все още не се свива, последната опция е да рестартирате SQL Service чрез конфигурационния мениджър. По този начин вашите предупреждения за дисково пространство ще спрат и проблемите със сървъра също ще спрат. Рестартирането на tempdb обаче може да не е налично за вас, ако проблемът е възникнал на производствен сървър.

DBCC

DBCCВ такива случаи има няколко DBCC команди, които при изпълнение биха ви позволили да свиете tempdb. Ако сте настроили скриптове за проактивно наблюдение на размера на tempdb, можете да използвате този скрипт, за да откриете пълнителите на tempdb. Към момента този скрипт ще се изпълнява на всички свързани сървъри. Можете лесно да го контролирате, като поставите клауза where. Можете да направите скрипта да се изпълнява само когато има проблем с вашата tempdb. Таблицата @Tserver се използва за съхраняване на всички ваши имена на свързани сървъри. За tempdb база данни, SQL корупция ще промени статуса на базата данни като ПОДОЗРЕН и това ще прекъсне SQL Server услуга от самото начало.

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

Въведение на автора:

Нийл Варли е експерт по възстановяване на данни в DataNumen, Inc., която е световен лидер в технологиите за възстановяване на данни, включително възстановяване на Outlook и excel софтуерни продукти за възстановяване. За повече информация посетете WWW.datanumen.com

Споделете сега:

Коментарите са забранени.