Se il database temp DB del tuo SQL Server esaurisce lo spazio, può causare gravi interruzioni nell'ambiente di produzione e può interrompere il corretto completamento delle applicazioni utente. Se utilizzi uno script per tenere traccia delle dimensioni del database temporaneo, aggiungi lo script di questo articolo per identificare la causa principale del riempimento del database temporaneo.
Tempdb full: uno scenario comune
Query scritte male potrebbero creare diversi oggetti temporanei con conseguente aumento delle dimensioni del database tempdb. Ciò comporterà avvisi di spazio su disco insufficiente e potrebbe causare problemi al server. Quando molti SQL Server Gli amministratori di database trovano molto difficile ridurre le dimensioni del database tempdb e optano immediatamente per il riavvio del server. Se, dopo aver provato tutti i metodi possibili, le dimensioni del database tempdb non si riducono, l'ultima opzione è riavviare il servizio SQL tramite Gestione configurazione. In questo modo, gli avvisi relativi allo spazio su disco insufficiente e i problemi del server dovrebbero cessare. Tuttavia, il riavvio di tempdb potrebbe non essere possibile se il problema si verifica su un server di produzione.
DBCC
In tali casi, esistono diversi comandi DBCC che, una volta eseguiti, consentono di ridurre tempdb. Se hai impostato script per monitorare in modo proattivo le dimensioni di tempdb, puoi utilizzare questo script per scoprire i riempimenti di tempdb. A partire da ora, questo script verrebbe eseguito su tutti i server collegati. Puoi controllarlo facilmente inserendo una clausola where. Puoi fare in modo che lo script venga eseguito solo quando c'è un problema con il tuo tempdb. La tabella @Tserver viene utilizzata per memorizzare tutti i nomi dei server collegati. Per un database tempdb, Corruzione SQL cambierebbe lo stato del database come SOSPETTO e questo si interromperebbe SQL Server servizio fin dall'inizio.
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
Introduzione dell'autore:
Neil Varley è un esperto di recupero dati in DataNumen, Inc., che è il leader mondiale nelle tecnologie di recupero dati, tra cui recuperare Outlook ed eccellere prodotti software di recupero. Per maggiori informazioni visita www.datanumen.com