Jak znaleźć powód, dla którego TempDB jest pełny w Twoim SQL Server

Podziel się teraz:

Jeśli baza danych temp DB twojego SQL Server zabraknie miejsca, może spowodować poważne zakłócenia w środowisku produkcyjnym i uniemożliwić pomyślne ukończenie aplikacji użytkownika. Jeśli używasz skryptu do śledzenia rozmiaru tymczasowej bazy danych, dołącz skrypt z tego artykułu, aby zidentyfikować główną przyczynę wypełniania tymczasowej bazy danych.

Pełna tempdb – częsty scenariusz

Tempdb Źle napisane zapytania mogą tworzyć wiele obiektów tymczasowych, co prowadzi do rozrastania się bazy danych tempdb. To z kolei skutkuje alertami o braku miejsca na dysku i może powodować problemy z serwerem. Gdy wiele… SQL Server Administratorzy baz danych mają trudności ze zmniejszeniem bazy danych tempdb, dlatego natychmiast decydują się na restart serwera. Jeśli wypróbowano wszystkie metody zmniejszenia bazy danych tempdb i nadal nie udało się jej zmniejszyć, ostatnią opcją jest ponowne uruchomienie usługi SQL za pomocą menedżera konfiguracji. W ten sposób alerty dotyczące miejsca na dysku i problemy z serwerem również ustaną. Jednak ponowne uruchomienie bazy danych tempdb może być niemożliwe, jeśli problem wystąpił na serwerze produkcyjnym.

DBCC

DBCCW takich przypadkach istnieje kilka poleceń DBCC, które po uruchomieniu pozwolą zmniejszyć tempdb. Jeśli skonfigurowałeś skrypty do proaktywnego monitorowania rozmiaru bazy danych tempdb, możesz użyć tego skryptu, aby znaleźć wypełniacze bazy danych tempdb. Od teraz ten skrypt będzie wykonywany na wszystkich połączonych serwerach. Możesz to łatwo kontrolować, umieszczając klauzulę where. Możesz sprawić, aby skrypt był wykonywany tylko wtedy, gdy wystąpi problem z twoją bazą danych tempdb. Tabela @Tserver służy do przechowywania wszystkich połączonych nazw serwerów. W przypadku bazy danych tempdb Uszkodzenie kodu SQL zmieni status bazy danych na PODEJRZANY, co spowoduje przerwanie SQL Server usługi od początku.

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

Wprowadzenie autora:

Neil Varley jest ekspertem w dziedzinie odzyskiwania danych w DataNumen, Inc., która jest światowym liderem w technologiach odzyskiwania danych, w tym odzyskać Outlooka i doskonałe oprogramowanie do odzyskiwania. po więcej informacji odwiedź www.datanumen.com

Podziel się teraz:

Możliwość dodawania komentarzy nie jest dostępna.