Kako pronaći razlog zašto je TempDB pun u vašem SQL Server

Podijeli sada:

Ako je vaša privremena DB baza podataka SQL Server ponestane prostora, može uzrokovati velike poremećaje u vašem proizvodnom okruženju i može prekinuti korisničke aplikacije od uspješnog završetka. Ako koristite skriptu za praćenje veličine privremene baze podataka, dodajte skriptu iz ovog članka da biste identificirali osnovni uzrok popunjavanja privremene baze podataka.

Tempdb pun – uobičajen scenario

Tempdb Loše napisani upiti mogu kreirati nekoliko privremenih objekata što rezultira rastućom tempdb bazom podataka. To će rezultirati upozorenjima o prostoru na disku i može uzrokovati probleme sa serverom. Kada se mnogo SQL Server Administratori baza podataka imaju velikih poteškoća s smanjivanjem temp baze podataka, pa se odmah odlučuju za ponovno pokretanje servera. Ako ste isprobali sve metode za smanjenje temp baze podataka i ako se ona i dalje ne smanjuje, posljednja opcija je ponovno pokretanje SQL servisa putem upravitelja konfiguracije. Na taj način bi se vaša upozorenja o prostoru na disku zaustavila, a problemi sa serverom bi također prestali. Međutim, ponovno pokretanje temp baze podataka možda vam neće biti dostupno ako se problem dogodio na produkcijskom serveru.

DBCC

DBCCU takvim slučajevima postoji nekoliko DBCC naredbi koje bi vam prilikom pokretanja omogućile da smanjite tempdb. Ako ste postavili skripte za proaktivno praćenje veličine tempdb-a, možete koristiti ovu skriptu da saznate punioce tempdb-a. Od sada, ova skripta bi se izvršavala na svim povezanim serverima. Možete ga lako kontrolisati tako što ćete staviti klauzulu gdje. Možete napraviti da se skripta izvršava samo kada postoji problem sa vašim tempdb. Tabela @Tserver se koristi za pohranjivanje svih vaših povezanih imena servera. Za tempdb bazu podataka, SQL korupcija bi promijenio status baze podataka kao SUSPECT i to će prekinuti SQL Server usluga od početka.

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

Uvod za autora:

Neil Varley je stručnjak za oporavak podataka DataNumen, Inc., koji je svjetski lider u tehnologijama za oporavak podataka, uključujući oporaviti Outlook i Excel softverski proizvodi za oporavak. Za više informacija posjetite www.datanumen.com

Podijeli sada:

Komentari su zatvoreni.