Existe alguma maneira de reduzir / reduzir o tamanho do tempdb.mdf sem reiniciar o SQL Server

15

É necessário reiniciar o SQL Server depois DBCC SHRINKFILEem tempdb.mdfou há qualquer outro método para reduzir o tamanho dos tempdb.mdfsem reiniciar SQL Server?

Por favor, ajude como eu preciso disso para um servidor de produção e espero fazer o encolhimento sem nenhum tempo de inatividade.

Manii
fonte
2
DBCC SHRINKFILE não requer reinicialização do serviço.
Greg
Você não pode reduzir o tempdb como ele está em uso. E sim, existe alguma solução para isso, mas não é muito limpa e tem alguns efeitos colaterais.
Ionic

Respostas:

15

Você pode fazer isso desta maneira:

-- write everything from your buffers to the disc!
CHECKPOINT; 
GO
-- Clean all buffers and caches
DBCC DROPCLEANBUFFERS; 
DBCC FREEPROCCACHE;
DBCC FREESYSTEMCACHE('ALL');
DBCC FREESESSIONCACHE;
GO
-- Now shrink the file to your desired size
DBCC SHRINKFILE (TEMPDEV, 40960);
-- Make sure that there is no running transaction which uses the tempdb while shrinking!
-- This is most trickiest part of it all.
GO

O último passo é o mais complicado. Durante o processo de redução, nenhuma outra ação deve usar o tempdb, pois isso pode causar um cancelamento da sua SHRINKFILEoperação. Devido ao fato de o tempdb ser bastante fácil de encolher, não deve demorar muito para encolhê-lo.

Cuidado que isso é algo como uma "reinicialização suave". Tudo será removido dos buffers e gravado no disco. Isso significa um impacto no seu subsistema de E / S (gravação), pois ele tem que lidar com todas as operações de gravação. Depois disso, você pode reduzir o arquivo (que afeta o desempenho de leitura e gravação) e, no final, todos os processos que consultam qualquer tabela precisarão recuperar os dados do subsistema de E / S para os buffers. Isso pode prejudicar mais do que uma reinicialização.

Se você estiver executando um sistema de desenvolvimento, reinicie a máquina em vez disso. Mas em alguns sistemas de produção sem um parceiro de failover, isso pode ser útil.

Ionic
fonte
Obrigado Ionic pela boa explicação. tempdb.mdf é de 46 GB no meu caso. Se nenhuma transação estiver acontecendo, posso reduzi-lo para 100%. Por favor, sugira.
Manii
Sim, o 40960MB é apenas um exemplo. No meu sistema, o tempdb é executado normalmente em ~ 50 GB e, em casos raros, cresce para 200 GB. :-)
Ionic:
<pre> Eu executo a consulta como DBCC SHRINKFILE (tempdev, 1024); </b> </b> E liberou o espaço com êxito, mas novamente eu a executo como </b> </b> Executo a consulta como DBCC SHRINKFILE (tempdev, 30000); </b> </b> E me deu o resultado abaixo: </b> </b> DbId Tamanho atual do tamanho Tamanho mínimo Páginas usadas Páginas estimadas </b> 2 1 5699352 1024 696 696 </b> </b> Mas, como o tamanho verificado do tempdb não foi reduzido. </pre>
Manii
Esta mensagem pode ocorrer se uma transação usar o tempdb durante a redução. Também pode ser que seu tamanho de contração definido (~ 30 GB) esteja acima do limite livre do seu tempdb.
Ionic
1

Você pode apenas seguir o passo abaixo

USE tempdb;
GO;
dbcc freeproccache;
DBCC SHRINKFILE (tempdb_file_name, memory_in_MB);
GO;
JERRY
fonte
Qual é a sua resposta diferente da resposta acima?
Kin Shah
1
Olá Kin, O tamanho do arquivo Tempdb será reduzido com o DBCC FREEPROCCACHE; e reduza o arquivo tempdb. Não precisamos da instrução abaixo para diminuir o tempdb. DBCC DROPCLEANBUFFERS; DBCC FREESYSTEMCACHE ('ALL'); DBCC FREESESSIONCACHE;
21416 JERRY
1
Essa é a resposta mais simples, na maioria dos casos, apenas o DBCC FREEPROCCACHE é necessário para permitir reduzir o tempdb. Veja a pergunta relacionada
James Jenkins