Tengo demasiados archivos de datos secundarios (.ndf) creados para tempdb
. Para eliminar el exceso de archivos, necesito vaciar el archivo (el contenido se moverá a otros archivos):
DBCC SHRINKFILE('tempdbfile8', EMPTYFILE);
y luego elimine el archivo:
ALTER DATABASE tempdb REMOVE FILE tempdbfile8;
Pero el EMPTYFILE
comando devuelve el error:
DBCC SHRINKFILE: Page 8:41920 could not be moved because it is a work table page.
Msg 2555, Level 16, State 1, Line 2
Cannot move all contents of file "tempdbfile8" to other places to complete the emptyfile operation.
No se preocupe, solo necesito localizar el objeto que está usando esta página para hacer algo al respecto:
DBCC TRACEON (3604)
DBCC PAGE(2,8,41920) --dbid=2, fileid=8, pageid=41920
El comando devuelve mucha información, object_id entre ellos. Pero:
Metadata: ObjectId = 0
No tengo idea de qué hacer al respecto. ¿Qué gato impide que se mueva esta página? ¿Cómo localizar ese objeto, proceso, sesión o lo que sea? Cualquier ayuda será apreciada, pero tenga en cuenta que dejar todo como está o eliminar otro archivo no es una solución válida para este problema;).
EDITAR:
Estoy eliminando los archivos, porque solíamos seguir la "mejor práctica" de crear un archivo por núcleo de procesador (mismo tamaño inicial, misma tasa de crecimiento). Pero hasta donde yo sé, hasta que encuentre problemas de contención, no tiene sentido crear archivos tempdb adicionales en el mismo dispositivo. En nuestro caso tiene sentido, porque tenemos MPIO activado y el dispositivo de almacenamiento puede manejar 4 rutas. Pero hubo un error, y terminamos con un total de 5 archivos con CPU de 6 núcleos. Es más que rutas MPIO, menos que núcleos de CPU, y no es un número par. Puede que no cause ningún problema, pero simplemente no parece correcto :).
Finalmente pude vaciar y eliminar el archivo sin reiniciar el servidor estableciendo una de las bases de datos (que sospechaba que causaba el problema) en modo de usuario único (reversión inmediata). Funcionó, pero tuve suerte. Lo que realmente quiero es poder rastrear siempre la página :).
dbcc page ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])
sobre su solución: funcionaría, pero realmente me gustaría hacer esto sin derribar la instancia.