Dacă baza de date temp DB a dvs SQL Server rămâne fără spațiu, poate cauza întreruperi majore în mediul dumneavoastră de producție și poate întrerupe aplicațiile utilizatorului de la finalizarea cu succes. Dacă utilizați un script pentru a urmări dimensiunea DB temporară, adăugați scriptul din acest articol pentru a identifica cauza principală a umplerii DB temporară.
Tempdb full – un scenariu comun
Interogările scrise prost pot crea mai multe obiecte temporare, rezultând o bază de date tempdb în creștere. Acest lucru va duce la alerte privind spațiul pe disc și ar putea cauza probleme la server. Când multe SQL Server Administratorii de baze de date consideră că este foarte dificil să micșoreze baza de date tempdb, aceștia optează imediat pentru repornirea serverului. Dacă s-ar fi încercat toate metodele de a micșora baza de date tempdb și aceasta tot nu se micșorează, ultima opțiune este repornirea serviciului SQL prin intermediul managerului de configurare. Astfel, alertele privind spațiul pe disc s-ar opri, precum și problemele legate de server. Cu toate acestea, este posibil ca repornirea bazei de date tempdb să nu fie disponibilă dacă problema a apărut pe un server de producție.
DBCC
În astfel de cazuri, există mai multe comenzi DBCC care, atunci când sunt executate, vă vor permite să micșorați tempdb. Dacă ați configurat scripturi pentru a monitoriza în mod proactiv dimensiunea tempdb, puteți utiliza acest script pentru a afla elementele de umplere ale tempdb. De acum, acest script va fi executat pe toate serverele legate. Îl poți controla cu ușurință punând o clauză where. Puteți face ca scriptul să fie executat numai atunci când există o problemă cu tempdb. Tabelul @Tserver este folosit pentru a stoca toate numele serverelor conectate. Pentru o bază de date tempdb, Coruperea SQL ar schimba starea bazei de date ca SUSPECT și aceasta va întrerupe SQL Server serviciu de la pornire.
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
Introducerea autorului:
Neil Varley este un expert în recuperarea datelor DataNumen, Inc., care este lider mondial în tehnologiile de recuperare a datelor, inclusiv recuperați Outlook și produse software de recuperare Excel. Pentru mai multe informații vizitați www.datanumen.com