Ak je dočasná DB databáza vášho SQL Server vyčerpá miesto, môže to spôsobiť veľké narušenie produkčného prostredia a prerušiť úspešné dokončenie používateľských aplikácií. Ak používate skript na sledovanie veľkosti dočasnej databázy, pripojte skript z tohto článku, aby ste určili hlavnú príčinu plnenia dočasnej databázy.
Tempdb full - bežný scenár
Zle napísané dotazy môžu vytvoriť niekoľko dočasných objektov, čoho výsledkom bude rastúca databáza tempdb. To bude mať za následok upozornenia na nedostatok miesta na disku a môže spôsobiť problémy so serverom. Keď je veľa SQL Server Správcovia databáz majú veľký problém so zmenšením dočasnej databázy, preto okamžite zvolia reštart servera. Ak ste vyskúšali všetky metódy na zmenšenie dočasnej databázy a stále sa nezmenšuje, poslednou možnosťou je reštartovať službu SQL Service prostredníctvom správcu konfigurácie. Týmto spôsobom by sa zastavili vaše upozornenia na priestor na disku a problémy so serverom by sa tiež zastavili. Reštartovanie dočasnej databázy však nemusí byť k dispozícii, ak sa problém vyskytol na produkčnom serveri.
DBCC
V takýchto prípadoch existuje niekoľko príkazov DBCC, ktoré vám pri spustení umožnia zmenšiť tempdb. Ak ste nastavili skripty na proaktívne sledovanie veľkosti tempdb, môžete pomocou tohto skriptu zistiť výplne tempdb. Od tejto chvíle by sa tento skript začal vykonávať na všetkých serveroch odkazov. Môžete to ľahko ovládať vložením klauzuly where. Skript môžete nechať spustiť, iba ak nastane problém s vašou databázou tempdb. Tabuľka @Tserver sa používa na uloženie všetkých vašich názvov prepojených serverov. Pre databázu tempdb Poškodenie SQL by zmenil stav databázy ako SUSPECT a to by sa prerušilo SQL Server služba od začiatku.
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
Úvod autora:
Neil Varley je odborníkom na obnovu dát v odbore DataNumen, Inc., ktorá je svetovým lídrom v oblasti technológií obnovy dát, vrátane obnoviť Outlook a vynikajúce softvérové produkty na obnovenie. Pre viac informácií navštívte www.datanumen. S