Як знайти причину, чому TempDB повна у вашому SQL Server

Поділитися зараз:

Якщо тимчасова база даних БД вашого SQL Server не вистачає місця, це може спричинити серйозні збої у виробничому середовищі та перервати користувацькі програми від успішного завершення. Якщо ви використовуєте сценарій для відстеження розміру тимчасової БД, додайте скрипт із цієї статті, щоб визначити першопричину заповнення тимчасової БД.

Tempdb full - типовий сценарій

Tempdb Погано написані запити можуть створювати кілька тимчасових об'єктів, що призведе до зростання бази даних tempdb. Це призведе до сповіщень про нестачу місця на диску та може спричинити проблеми з сервером. Коли багато SQL Server Адміністраторам баз даних дуже важко стиснути тимчасову базу даних, вони негайно обирають перезапуск сервера. Якщо ви перепробували всі методи стиснення тимчасової бази даних, і вона все ще не зменшується, останнім варіантом є перезапуск служби SQL через диспетчер конфігурації. Таким чином, ваші сповіщення про дисковий простір припиняться, як і проблеми із сервером. Однак перезапуск тимчасової бази даних може бути недоступним, якщо проблема виникла на робочому сервері.

DBCC

DBCCУ таких випадках існує кілька команд DBCC, які під час запуску дозволять вам зменшити tempdb. Якщо ви налаштували сценарії для попереднього моніторингу розміру tempdb, ви можете скористатися цим сценарієм для пошуку наповнювачів tempdb. На даний момент цей скрипт буде виконуватися на всіх пов'язаних серверах. Ви можете легко ним керувати, поставивши речення where. Ви можете зробити сценарій для виконання лише тоді, коли у вас є проблема з вашим tempdb. Таблиця @Tserver використовується для зберігання всіх імен зв'язаних серверів. Для бази даних tempdb: Пошкодження SQL змінить стан бази даних як SUSPECT, і це перерве роботу 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

Поділитися зараз:

Коментарі закриті.