Se o banco de dados temporário do seu SQL Server ficar sem espaço, pode causar grandes interrupções em seu ambiente de produção e interromper a conclusão bem-sucedida dos aplicativos do usuário. Se você estiver usando um script para rastrear o tamanho do banco de dados temporário, anexe o script deste artigo para identificar a causa raiz do preenchimento do banco de dados temporário.
Tempdb cheio – um cenário comum
Consultas mal escritas podem criar vários objetos temporários, resultando em um banco de dados tempdb crescente. Isso levará a alertas de espaço em disco e poderá causar problemas no servidor. Quando muitos SQL Server Administradores de banco de dados frequentemente encontram dificuldades para reduzir o tamanho do tempdb e, por isso, optam imediatamente pela reinicialização do servidor. Se você já tentou todos os métodos para reduzir o tamanho do banco de dados tempdb e ele ainda não diminuiu, a última opção é reiniciar o serviço do SQL Server através do Gerenciador de Configuração. Dessa forma, os alertas de espaço em disco cessarão e os problemas do servidor também serão resolvidos. No entanto, reiniciar o tempdb pode não ser uma opção viável se o problema ocorrer em um servidor de produção.
DBCC
Nesses casos, existem vários comandos DBCC que, quando executados, permitem reduzir o tempdb. Se você configurou scripts para monitorar proativamente o tamanho do tempdb, pode usar este script para descobrir preenchimentos de tempdb. A partir de agora, esse script seria executado em todos os servidores vinculados. Você pode controlá-lo facilmente colocando uma cláusula where. Você pode fazer com que o script seja executado somente quando houver algum problema com seu tempdb. A tabela @Tserver é usada para armazenar todos os seus nomes de servidores vinculados. Para um banco de dados tempdb, Corrupção de SQL mudaria o status do banco de dados como SUSPEITO e isso interromperia SQL Server serviço desde o início.
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
Introdução do autor:
Neil Varley é um especialista em recuperação de dados em DataNumen, Inc., líder mundial em tecnologias de recuperação de dados, incluindo recuperar Outlook e produtos de software de recuperação do Excel. Para mais informações visite www.datanumen.com