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:
CREATE DATABASE [Shrinkfile_Test]
ON PRIMARY
(
NAME = N'Shrinkfile_Test',
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.SQL2016\MSSQL\DATA\Shrinkfile_Test.mdf',
SIZE = 8192KB,
FILEGROWTH = 65536KB
),
FILEGROUP [SECONDARY]
(
NAME = N'ShrinkFile_Test_Secondary',
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.SQL2016\MSSQL\DATA\ShrinkFile_Test_Secondary.ndf',
SIZE = 1024KB,
FILEGROWTH = 65536KB
)
LOG ON
(
NAME = N'Shrinkfile_Test_log',
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.SQL2016\MSSQL\DATA\Shrinkfile_Test_log.ldf',
SIZE = 73728KB,
FILEGROWTH = 65536KB
)
GO
USE Shrinkfile_Test;
GO
Miré la "página 0" para el archivo secundario, que es file_id 3:
DBCC TRACEON (3604);
GO
DBCC PAGE (N'Shrinkfile_Test', 3, 0, 3);
Hay un campo llamado m_flagBits
que tiene un valor de 0x208
.
Si vacio este archivo:
DBCC SHRINKFILE (N'ShrinkFile_Test_Secondary' , EMPTYFILE);
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:
El ID de archivo 3 del ID de base de datos 19 no se puede reducir, ya que otro proceso lo está reduciendo o está vacío.
Intentaré hacer crecer el archivo (la solución que funcionó para usted):
ALTER DATABASE ShrinkFile_Test
MODIFY FILE
(
NAME = ShrinkFile_Test_Secondary,
SIZE = 1025KB
);
GO
Ahora m_flagbits
es 0x8
!
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
):
USE [master]
GO
ALTER DATABASE [Shrinkfile_Test] MODIFY FILEGROUP [SECONDARY] READONLY
GO
El archivo se marca como is_read_only
en la sys.databases
tabla y m_flagbits
se vuelve a establecer en 0x208
. 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
).