Ako vaša privremena baza podataka DB SQL Server ponestane prostora, može uzrokovati velike smetnje u vašem proizvodnom okruženju i može prekinuti uspješan završetak korisničkih aplikacija. Ako koristite skriptu za praćenje veličine privremene baze podataka, dodajte skriptu iz ovog članka da biste identificirali glavni uzrok za punjenje privremene baze podataka.
Tempdb pun – uobičajeni scenarij
Loše napisani upiti mogu stvoriti 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 tempdb-a, pa se odmah odlučuju za ponovno pokretanje poslužitelja. Ako ste isprobali sve metode za smanjivanje tempdb-a i ako se i dalje ne smanjuje, posljednja je opcija ponovno pokretanje SQL Servicea putem upravitelja konfiguracije. Tako bi se zaustavila upozorenja o prostoru na disku, a prestali bi i problemi s poslužiteljem. Međutim, ponovno pokretanje tempdb-a možda vam neće biti dostupno ako se problem dogodio na produkcijskom poslužitelju.
DBCC
U takvim slučajevima, postoji nekoliko DBCC naredbi koje bi vam nakon pokretanja omogućile smanjivanje tempdb. Ako ste postavili skripte za proaktivno praćenje veličine tempdb-a, možete upotrijebiti ovu skriptu da biste saznali punila tempdb-a. Od sada bi se ova skripta izvršavala na svim povezanim poslužiteljima. Možete ga lako kontrolirati postavljanjem odredbe where. Možete napraviti da se skripta izvršava samo kada postoji problem s vašom tempdb. Tablica @Tserver koristi se za pohranu svih vaših povezanih imena poslužitelja. Za tempdb bazu podataka, Oštećenje SQL-a promijenio bi status baze podataka kao SUMNJIV 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 u 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