¿Hay alguna manera de reducir / reducir el tamaño de tempdb.mdf sin reiniciar SQL Server


15

¿Es necesario reiniciar SQL Server después de DBCC SHRINKFILEactivado tempdb.mdfo hay algún otro método para reducir el tamaño tempdb.mdfsin reiniciar SQL Server?

Ayuda amablemente ya que necesito esto para un servidor de producción y espero hacer la reducción sin ningún tiempo de inactividad.


2
DBCC SHRINKFILE no requiere reinicio del servicio.
Greg

No puede reducir el tempdb ya que está en uso. Y sí, hay alguna solución para esto, pero no es muy limpia y tiene algunos efectos secundarios.
Ionic

Respuestas:


15

Puedes hacerlo de esta manera:

-- 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

El último paso es el más complicado. Durante el proceso de reducción, ninguna otra acción debería usar tempdb, ya que esto podría causar un aborto de su SHRINKFILEoperación. Debido al hecho de que tempdb es bastante fácil de reducir, no debería llevar mucho tiempo reducirlo.

Tenga en cuenta que esto es algo así como un "reinicio suave". Todo se eliminará de las memorias intermedias y se escribirá en el disco. Esto significa un impacto en su subsistema de E / S (escritura) ya que tiene que manejar todas las operaciones de escritura. Después de eso, puede reducir el tamaño del archivo (lo que tiene un impacto en el rendimiento de lectura y escritura) y, al final, todos los procesos que consultan cualquier tabla necesitarán recuperar los datos del subsistema de E / S en los buffers. Esto puede doler más que un reinicio.

Si está ejecutando un sistema de desarrollo, debe reiniciar la máquina en lugar de hacerlo. Pero en algunos sistemas de producción sin un socio de conmutación por error, esto puede ser útil.


Gracias Ionic por una buena explicación. tempdb.mdf es de 46 GB en mi caso. Si no hay transacciones en curso, ¿puedo reducirlo al 100%? Amablemente sugiera.
Manii

Sí, el 40960MB es solo un ejemplo. En mi sistema, el tempdb funciona normalmente a ~ 50 GB y, en casos excepcionales, crece a 200 GB. :-)
Ionic

<pre> Ejecuté la consulta como DBCC SHRINKFILE (tempdev, 1024); </b> </b> y liberó con éxito el espacio, pero nuevamente lo ejecuté como </b> </b> ejecuté la consulta como DBCC SHRINKFILE (tempdev, 30000); </b> </b> Y me dio el siguiente resultado: </b> </b> DbId Campo Tamaño actual Tamaño mínimo Páginas utilizadas Páginas estimadas </b> 2 1 5699352 1024 696 696 </b> </b> Pero, como se verificó, el tamaño de tempdb no se redujo. </pre>
Manii

Este mensaje puede aparecer si una transacción usa tempdb mientras se reduce. También puede ser que su tamaño de contracción definido (~ 30 GB) esté por encima del límite libre de su tempdb.
Ionic

1

Puedes ir solo con el siguiente paso

USE tempdb;
GO;
dbcc freeproccache;
DBCC SHRINKFILE (tempdb_file_name, memory_in_MB);
GO;

¿Cómo es su respuesta diferente a la anterior?
Kin Shah

1
Hola Kin, Tempdb El tamaño del archivo se reducirá con DBCC FREEPROCCACHE; y luego reduzca el archivo tempdb. No necesitamos la siguiente declaración para encoger tempdb. DBCC DROPCLEANBUFFERS; DBCC FREESYSTEMCACHE ('TODOS'); DBCC FREESESSIONCACHE;
JERRY

1
Esta es la respuesta más simple, en la mayoría de los casos solo se necesita DBCC FREEPROCCACHE para permitirle reducir el tempdb. Ver pregunta relacionada
James Jenkins, el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.