Hvordan finne årsaken til at TempDB er full i din SQL Server

Hvis den midlertidige DB-databasen til din SQL Server går tom for plass, kan det forårsake store forstyrrelser i produksjonsmiljøet ditt og kan avbryte brukerapplikasjoner fra vellykket fullføring. Hvis du bruker et skript for å spore temp DB-størrelsen, legger du til skriptet fra denne artikkelen for å identifisere årsaken til den midlertidige DB-fyllingen.

Tempdb full – et vanlig scenario

TempdbDårlig skrevet spørringer kan skape flere temporary-objekter som resulterer i en voksende tempdb-database. Dette vil ende i diskplassvarsler og kan forårsake serverproblemer. Når mange SQL Server databaseadministratorer finner det svært vanskelig å krympe tempdb, de velger umiddelbart serverrestart. Hvis hadde prøvd alle metoder for å krympe tempdb-databasen og hvis den fortsatt ikke krymper, er det siste alternativet å restart SQL Service gjennom konfigurasjonsbehandling. Dermed stopper diskplassvarslene dine og serverproblemer stopper også. Imidlertid har restarting tempdb er kanskje ikke tilgjengelig for deg hvis problemet hadde oppstått på en produksjonsserver.

DBCC

DBCCI slike tilfeller er det flere DBCC-kommandoer som når de kjøres vil tillate deg å krympe tempdb. Hvis du hadde satt opp skript for å proaktivt overvåke tempdb-størrelsen, kan du bruke dette skriptet til å finne utfyllere av tempdb. Fra nå av vil dette skriptet bli utført på alle koblede servere. Du kan enkelt kontrollere det ved å sette inn en where-klausul. Du kan få skriptet til å kjøres bare når det er et problem med tempdb. Tabellen @Tserver brukes til å lagre alle dine koblede servernavn. For en tempdb-database, SQL-korrupsjon vil endre statusen til databasen som SUSPECT og dette vil avbryte SQL Server tjeneste fra starting.

DECLARE @Tserver TABLE ( cserver VARCHAR(200) ) INSERT INTO @Tserver VALUES ('SERVERNAME') DECLARE @LogTable TABLE ( cservernavn VARCHAR(200), cssionid SMALLINT, callocmb BIGINT, cdeallocmb BIGINT, ctext 4000VARCHAR(stat) 4000) ) ERKLÆR c1-MARKØR FOR VELG * FRA @Tserver DECLARE @cmd NVARCHAR(4000), @server VARCHAR(200) OPEN c1 FETCH next FRA c1 INTO @server MENS @@FETCH_STATUS = 0 BEGIN SET @cmd = 'EXEC(' 'bruk tempdb Deklarer @Table1-tabell ( cdeallopages bigint, callopages bigint, cssionid smallint, creqstid int ) sett inn i @Table1 SELECT SUM(internal_objects_dealloc_page_count), SUM(internal_objects_alloc_page_count), session_id, request_dskm_session_d, request_dsk ) WHERE session_id <> @@SPID GROUP BY session_id, request_id erklærer @Table2-tabell ( cssionid smallint, callocmb bigint, cdeallocmb bigint, ctext varchar(4000), cstatement varchar(4000) ) sett inn i @Table2 SELECT TBL1.cssionid, TBL1.callopages * 1.0. , TBL128.cdeallopages * 1 / 1.0 , TBL128.text, ISNULL( NULLIF( SUBSTRING( TBL3.text, TBL3.statement_start_offset / 2, CASE NÅR TBL2.statement_end_offset < TBL2.statement_start_offset THEN 0 ELSE( TBL2.statement_end_offset - TBL2.statement_start_offset ) / 2 END ), '''''''' ), TBL3.text ) FRA @Table1 AS TBL1 INNER JOIN sys.dm_exec_requests TBL2 MED (NOLOCK) PÅ TBL1.cssionid = TBL2.session_id OG TBL1qstid .request_id YTRE APPLY sys.dm_exec_sql_text(TBL2.sql_handle) AS TBL2 YTRE APPLY sys.dm_exec_query_plan(TBL3.plan_handle) AS TBL2 HVOR TBL4.text IKKE ER NULL ELLER TBL3.BYLL 4 DEOR ER NULL_plan; Velg * fra @Tabell3'') ved [' + @server + ']' PRINT @cmd INSERT INTO @LogTable (cssionid, callocmb, cdeallocmb, ctext, cstatement) EXEC(@cmd) OPPDATERING @LogTable SET cservername = @server WHERE cservername ER NULL FETCH neste FRA c2 INTO @server END CLOSE c1 AVALOKERE c1 VELG * FRA @LogTable

Forfatterintroduksjon:

Neil Varley er en datagjenopprettingsekspert innen DataNumen, Inc., som er verdensledende innen datagjenopprettingsteknologier, inkludert gjenopprette Outlook og excel-programvareprodukter for gjenoppretting. For mer informasjon besøk www.datanumen. Med

Kommentarer er stengt.