Estoy ejecutando algunas SHRINKFILE
operaciones para limpiar un montón de archivos pequeños e innecesarios en un grupo de archivos. Para uno de los encogimientos, el siguiente comando genera un error:
DBCC SHRINKFILE (N'myfile' , EMPTYFILE)'
La ID de archivo x de la ID de base de datos x no se puede reducir ya que está siendo reducida por otro proceso o está vacía
No está vacío ni se encoge. Se está ejecutando en una base de datos que actualmente no está en uso por nadie excepto yo. La reducción automática no está habilitada y nunca lo estuvo. Sin embargo, no se encoge manuales realizadas en esta base de datos de forma regular antes de mí conseguir mis manos en él, si lo que importa en absoluto.
En SQLServerCentral , un subproceso de hace una década sugiere agregar algunos MB al archivo porque eso "restablece un contador interno o conmutador que le dice que ahora no está en medio de una reducción".
Esto funcionó, increíble. Pero, ¿alguien puede explicar con mayor detalle cómo / por qué esto funciona con respecto a los componentes internos de SQL Server?
fuente
Respuestas:
Busqué en la página del encabezado del archivo, como lo sugirió Martin Smith en los comentarios. Creo que esto es parte de la respuesta, pero es principalmente una especulación basada en la observación de cambios en los valores de marca de la página del encabezado del archivo entre la reducción de tamaño y otras operaciones.
Primero creé una base de datos para probar, incluido un grupo de archivos secundario:
Miré la "página 0" para el archivo secundario, que es file_id 3:
Hay un campo llamado
m_flagBits
que tiene un valor de0x208
.Si vacio este archivo:
Ese
m_flagbits
campo permanece igual (0x208
). No es tan interesante, pero ahora estoy en la situación que informó: si trato de vaciar el archivo nuevamente, aparece este error:Intentaré hacer crecer el archivo (la solución que funcionó para usted):
Ahora
m_flagbits
es0x8
!En este punto, vaciar el archivo nuevamente es exitoso y devuelve el valor a
0x208
lo esperado.Lo que me parece interesante es que si hago esto después de que el archivo vuelva a crecer (el valor de AKA flagbits es
0x8
):El archivo se marca como
is_read_only
en lasys.databases
tabla ym_flagbits
se vuelve a establecer en0x208
. Por lo tanto, parece que hay un indicador de nivel de archivo similar al reducir un archivo y al configurarlo como de solo lectura.Mi mejor suposición es que este valor se usa junto con alguna otra bandera (interna) para indicar que un archivo es elegible para ser reducido. Al hacer crecer el archivo, parece desestabilizar esa bandera (al menos la que está visible en
m_flagbits
).fuente