Yorumlarda Martin Smith tarafından önerildiği gibi dosya başlığı sayfasında dolaştım. Bunun cevabın bir parçası olduğunu düşünüyorum, ancak çoğunlukla büzülme ve diğer işlemler arasında dosya başlığı sayfası bayrak değerlerindeki değişiklikleri gözlemlemeye dayalı spekülasyon.
Önce ikincil bir dosya grubu da dahil olmak üzere test etmek için bir veritabanı oluşturdum:
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
Ben file_id 3 olan ikincil dosya için "sayfa 0" baktım:
DBCC TRACEON (3604);
GO
DBCC PAGE (N'Shrinkfile_Test', 3, 0, 3);
Bunun m_flagBits
değeri olan bir alan var 0x208
.
Bu dosyayı boşaltırsam:
DBCC SHRINKFILE (N'ShrinkFile_Test_Secondary' , EMPTYFILE);
Bu m_flagbits
alan aynı kalır ( 0x208
). İlginç değil, ama şimdi bildirdiğiniz durumda: Dosyayı tekrar boşaltmaya çalışırsam, bu hatayı alıyorum:
Veritabanı kimliği 19'un dosya kimliği 3, başka bir işlem tarafından küçültüldüğü veya boş olduğu için küçülemez.
Dosyayı (sizin için çalışan çözüm) büyütmeye çalışacağım:
ALTER DATABASE ShrinkFile_Test
MODIFY FILE
(
NAME = ShrinkFile_Test_Secondary,
SIZE = 1025KB
);
GO
Şimdi m_flagbits
ise 0x8
!
Bu noktada, dosyayı tekrar boşaltmak başarılı olur, değeri 0x208
beklediğiniz gibi döndürür .
İlginç bulduğum şey, eğer dosyayı geri çıkardıktan sonra yaparsam (AKA flagbits değeri 0x8
):
USE [master]
GO
ALTER DATABASE [Shrinkfile_Test] MODIFY FILEGROUP [SECONDARY] READONLY
GO
Dosya olarak işaretlenmiş is_read_only
içinde sys.databases
masa ve m_flagbits
geri ayarlanır 0x208
. Bu nedenle, bir dosyayı daraltırken ve salt okunur olarak ayarlarken benzer bir dosya düzeyi bayrağı ayarlanmış gibi görünür.
En iyi tahminim, bu değerin bir dosyanın küçültülmeye uygun olduğunu belirtmek için başka (iç) bayraklarla birlikte kullanılmasıdır. Dosyayı büyüttüğünüzde, bu işaretin ayarının kaldırıldığı görülüyor (en azından içinde görünen m_flagbits
).