Ja temp DB datu bāze jūsu SQL Server pietrūkst vietas, tas var radīt nopietnus traucējumus jūsu ražošanas vidē un var pārtraukt lietotāju lietojumprogrammu veiksmīgu pabeigšanu. Ja izmantojat skriptu, lai izsekotu temp DB lielumu, pievienojiet skriptu no šī raksta, lai identificētu temp DB aizpildīšanas cēloni.
Tempdb full - izplatīts scenārijs
Slikti uzrakstīti vaicājumi var radīt vairākus pagaidu objektus, kā rezultātā tempdb datubāze aug. Tas radīs brīdinājumus par diska vietas trūkumu un var radīt servera problēmas. Ja ir daudz SQL Server Ja datubāzes administratoriem ir ļoti grūti samazināt tempdb apjomu, viņi nekavējoties izvēlas servera restartēšanu. Ja ir izmēģinātas visas metodes, lai samazinātu tempdb datubāzi, un tā joprojām nesamazinās, pēdējā iespēja ir restartēt SQL pakalpojumu, izmantojot konfigurācijas pārvaldnieku. Tādējādi jūsu diska vietas brīdinājumi tiks apturēti, un arī servera problēmas tiks novērstas. Tomēr tempdb restartēšana, iespējams, nebūs pieejama, ja problēma radusies ražošanas serverī.
DBCC
Šādos gadījumos ir vairākas DBCC komandas, kuras palaišanas laikā ļautu samazināt tempdb. Ja esat iestatījis skriptus, lai proaktīvi uzraudzītu tempdb lielumu, varat izmantot šo skriptu, lai uzzinātu tempdb aizpildītājus. Sākotnēji šis skripts tiks izpildīts visiem saistītajiem serveriem. To var viegli kontrolēt, ievietojot klauzulu kur. Skriptu var izpildīt tikai tad, ja rodas problēmas ar tempdb. Tabula @Tserver tiek izmantota, lai saglabātu visus jūsu saistīto serveru nosaukumus. Tempdb datu bāzei SQL korupcija mainītu datu bāzes statusu kā SUSPECT, un tas tiks pārtraukts SQL Server pakalpojums no paša sākuma.
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
Autora ievads:
Nils Varlijs ir datu atkopšanas eksperts DataNumen, Inc., kas ir pasaules līderis datu atkopšanas tehnoloģiju, tostarp atgūt Outlook un Excel atkopšanas programmatūras produkti. Lai iegūtu vairāk informācijas, apmeklējiet vietni www.datanumen. Ar