주석에서 Martin Smith가 제안한대로 파일 헤더 페이지를 찔렀습니다. 나는 이것이 대답의 일부라고 생각하지만, 주로 축소와 다른 작업 사이의 파일 헤더 페이지 플래그 값에 대한 변경 사항을 관찰 한 추측입니다.
먼저 보조 파일 그룹을 포함하여 테스트 할 데이터베이스를 만들었습니다.
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
나는 보조 파일에 대한 "페이지 0"을 보았습니다.이 파일은 file_id 3입니다.
DBCC TRACEON (3604);
GO
DBCC PAGE (N'Shrinkfile_Test', 3, 0, 3);
m_flagBits
값이 인 필드가 있습니다 0x208
.
이 파일을 비우면 :
DBCC SHRINKFILE (N'ShrinkFile_Test_Secondary' , EMPTYFILE);
해당 m_flagbits
필드는 동일하게 유지됩니다 ( 0x208
). 흥미롭지는 않지만 지금은 당신이보고 한 상황에 처해 있습니다. 파일을 다시 비우려고하면이 오류가 발생합니다.
데이터베이스 ID 19의 파일 ID 3은 다른 프로세스에 의해 축소되었거나 비어 있으므로 축소 할 수 없습니다.
나는 파일 (당신을 위해 일한 해결책)을 키우려고 노력할 것이다.
ALTER DATABASE ShrinkFile_Test
MODIFY FILE
(
NAME = ShrinkFile_Test_Secondary,
SIZE = 1025KB
);
GO
지금 m_flagbits
이다 0x8
!
이 시점에서 파일을 다시 비우면 0x208
예상대로 값이 반환 됩니다.
내가 흥미롭게 생각하는 것은 파일을 다시 자른 후에 이것을하면 (AKA flagbits value is 0x8
)입니다.
USE [master]
GO
ALTER DATABASE [Shrinkfile_Test] MODIFY FILEGROUP [SECONDARY] READONLY
GO
이 파일은로 표시되어 is_read_only
의 sys.databases
테이블, 그리고 m_flagbits
다시 설정됩니다 0x208
. 따라서 파일을 축소하거나 읽기 전용으로 설정할 때 유사한 파일 수준 플래그가 설정되어있는 것으로 보입니다.
가장 좋은 추측은이 값이 다른 (내부) 플래그와 함께 사용되어 파일을 축소 할 수 있음을 나타냅니다. 파일을 늘리면 해당 플래그 (적어도에 표시되는 플래그)가 설정 해제 된 것으로 나타납니다 m_flagbits
.