Hacer un shrink a la tempDB y que no libere espacio es uno de los problemas más frustrantes que puedes sufrir como DBA de SQL server.
Todo suele comenzar con una alerta por un disco que se está llenando rápidamente y, al comprobar su contenido, resulta que contiene los archivos de datos de la TempDB.
Normalmente esto ocurre porque algún proceso está haciendo trabajar en exceso a esta base de datos, provocando su crecimiento. Nuestro primer paso será informar al cliente sobre el problema para que haga saber a sus desarrolladores que deben detener el proceso antes de que la TempDB se llene por completo, ya que si esto ocurre, la instancia dejará de funcionar.
Sobre cómo proceder a partir de aquí, hay muchas opiniones. Algunos prefieren no hacer shrink a la TempDB por temor a causar corrupción, pero esto ya no ocurre, por lo que estamos a salvo. Intentaremos hacer un shrink de forma normal y, aunque vemos que el archivo está 99% libre, el shrink no reduce el espacio consumido.
Si nos encontramos en este punto y el equipo de Windows/almacenamiento nos ha dicho que no se puede pedir espacio extra en el disco, nuestra única solución sería reiniciar la instancia… ¿o no?
Liberar espacio en la TempDB sin reiniciar la instancia
Ya hemos intentado hacer el shrink pero no ha funcionado. Antes de reiniciar la instancia, podemos llevar a cabo un proceso un poco más «fuerte» que puede evitar el reinicio (y lo que esto conlleva).
Lo que haremos será limpiar las memorias cachés, hacer un par de checkpoints y luego volver a hacer un shrink. Limpiar las cachés puede hacer que ciertos procesos tomen más tiempo en sus siguientes ejecuciones, pero reiniciar la instancia también borraría la caché, por lo que realmente no estamos evitando nada que no fuese a ocurrir igualmente.
Script para limpiar la caché y hacer un shrink a la tempDB.
A continuación, dejo el script que uso cuando tengo este problema. Podéis ejecutarlo por partes o todo del tirón.
CHECKPOINT; GO DBCC DROPCLEANBUFFERS; GO DBCC FREEPROCCACHE; GO DBCC FREESYSTEMCACHE ('ALL'); GO DBCC FREESESSIONCACHE; GO CHECKPOINT; GO
Una vez ejecutado, volved a realizar el shrink. Esta vez, con suerte, el resultado será distinto.
Espero que os haya servido y recordad, no dejéis que los desarrolladores metan las manos donde no deben.
¿Todavía tienes dudas?
Si este post no ha solucionado tu problema o todavía tienes dudas sobre este o cualquier otro asunto relacionado con SQL Server, puedes enviarme un mensaje o solicitar una consultoría gratuita haciendo clic aquí.
Hola, Me sirvio Muchas Gracias Exitos!!
Me alegro! Me has alegrado el dia con tu comentario 😀
me ha ayudado bastante, muchas gracias
Me alegro mucho!