Tôi chọc vào trang tiêu đề tệp, như đề xuất của Martin Smith trong các bình luận. Tôi nghĩ rằng đây là một phần của câu trả lời, nhưng chủ yếu là suy đoán dựa trên việc quan sát các thay đổi đối với các giá trị cờ trang tiêu đề tệp giữa thực hiện thu hẹp và các hoạt động khác.
Đầu tiên tôi tạo một cơ sở dữ liệu để kiểm tra, bao gồm một nhóm thứ cấp:
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
Tôi đã xem "trang 0" cho tệp thứ cấp, đó là file_id 3:
DBCC TRACEON (3604);
GO
DBCC PAGE (N'Shrinkfile_Test', 3, 0, 3);
Có một trường được gọi là m_flagBits
có giá trị 0x208
.
Nếu tôi làm trống tập tin này:
DBCC SHRINKFILE (N'ShrinkFile_Test_Secondary' , EMPTYFILE);
Trường đó m_flagbits
vẫn giữ nguyên ( 0x208
). Không thú vị lắm, nhưng bây giờ tôi đang ở trong tình huống bạn đã báo cáo: nếu tôi cố gắng làm trống tệp lại, tôi gặp lỗi này:
ID tệp 3 của cơ sở dữ liệu ID 19 không thể được thu nhỏ vì nó bị thu hẹp bởi một quy trình khác hoặc trống.
Tôi sẽ thử phát triển tệp (giải pháp phù hợp với bạn):
ALTER DATABASE ShrinkFile_Test
MODIFY FILE
(
NAME = ShrinkFile_Test_Secondary,
SIZE = 1025KB
);
GO
Bây giờ m_flagbits
là 0x8
!
Tại thời điểm này, làm trống tệp một lần nữa là thành công trả về giá trị 0x208
như bạn mong đợi.
Điều mà tôi thấy thú vị là nếu tôi làm điều này sau khi phát triển lại tệp (giá trị cờ hiệu AKA là 0x8
):
USE [master]
GO
ALTER DATABASE [Shrinkfile_Test] MODIFY FILEGROUP [SECONDARY] READONLY
GO
Tệp được đánh dấu như is_read_only
trong sys.databases
bảng và m_flagbits
được đặt lại 0x208
. Vì vậy, nó xuất hiện một số cờ cấp độ tệp tương tự được đặt khi thu nhỏ tệp và khi cài đặt thành chỉ đọc.
Dự đoán tốt nhất của tôi là giá trị này được sử dụng cùng với một số cờ (nội bộ) khác để chỉ ra rằng một tệp đủ điều kiện để được thu nhỏ. Phát triển tệp dường như bỏ đặt cờ đó (ít nhất là hiển thị trong m_flagbits
).