Якщо тимчасова база даних БД вашого SQL Server не вистачає місця, це може спричинити серйозні збої у виробничому середовищі та перервати користувацькі програми від успішного завершення. Якщо ви використовуєте сценарій для відстеження розміру тимчасової БД, додайте скрипт із цієї статті, щоб визначити першопричину заповнення тимчасової БД.
Tempdb full - типовий сценарій
Погано написані запити можуть створювати кілька тимчасових об'єктів, що призведе до зростання бази даних tempdb. Це призведе до сповіщень про нестачу місця на диску та може спричинити проблеми з сервером. Коли багато SQL Server Адміністраторам баз даних дуже важко стиснути тимчасову базу даних, вони негайно обирають перезапуск сервера. Якщо ви перепробували всі методи стиснення тимчасової бази даних, і вона все ще не зменшується, останнім варіантом є перезапуск служби SQL через диспетчер конфігурації. Таким чином, ваші сповіщення про дисковий простір припиняться, як і проблеми із сервером. Однак перезапуск тимчасової бази даних може бути недоступним, якщо проблема виникла на робочому сервері.
DBCC
У таких випадках існує кілька команд DBCC, які під час запуску дозволять вам зменшити tempdb. Якщо ви налаштували сценарії для попереднього моніторингу розміру tempdb, ви можете скористатися цим сценарієм для пошуку наповнювачів tempdb. На даний момент цей скрипт буде виконуватися на всіх пов'язаних серверах. Ви можете легко ним керувати, поставивши речення where. Ви можете зробити сценарій для виконання лише тоді, коли у вас є проблема з вашим tempdb. Таблиця @Tserver використовується для зберігання всіх імен зв'язаних серверів. Для бази даних tempdb: Пошкодження SQL змінить стан бази даних як SUSPECT, і це перерве роботу SQL Server обслуговування з початку.
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
Вступ автора:
Ніл Варлі - фахівець з відновлення даних у DataNumen, Inc., яка є світовим лідером у галузі технологій відновлення даних, в тому числі відновити Outlook - - та програмні продукти Excel для відновлення. Для отримання додаткової інформації відвідайте WWW.datanumen.com