SHRINKFILE 실패-파일 크기를 늘리면 왜 문제가 해결됩니까?


10

SHRINKFILE파일 그룹에서 작고 불필요한 파일을 정리하기 위해 몇 가지 작업을 실행하고 있습니다. 축소 중 하나의 경우 아래 명령으로 오류가 발생합니다.

DBCC SHRINKFILE (N'myfile' , EMPTYFILE)'

데이터베이스 ID x의 파일 ID x은 (는) 다른 프로세스에 의해 축소되었거나 비어 있으므로 축소 할 수 없습니다

비어 있거나 줄어들지 않습니다. 본인 이외의 다른 사람이 현재 사용하지 않는 데이터베이스에서 실행 중입니다. 자동 축소가 활성화되지 않았으며 활성화되지 않았습니다. 그러나이 있었다 그것은 내 손에 얻기 전에 나에게 정기적으로이 데이터베이스에서 수행 매뉴얼 정신과 그 문제의 경우 전혀.

SQLServerCentral , 십년 전에 파일에 몇 MB를 추가 제안에서 스레드 때문에 그 "재설정 지금 정신과의 중간에없는 그것을 알려주는 내부 카운터 또는 스위치."

이것은 훌륭했습니다. 그러나 누구나 SQL Server 내부와 관련하여 어떻게 / 왜 작동하는지 자세히 설명 할 수 있습니까?


1
답을 말할 수는 없지만 앞으로이 상황에 처한 적이 있는지 알기위한 유용한 방법입니다.
John Eisbrener

축소하는 동안 파일 헤더 페이지에서 일부 플래그를 재현 할 수 있습니까?
Martin Smith

예, 테스트 인스턴스에서 샷을 줄 수는 있지만 실제로 재현하려고 시도할만한 사치가 없었습니다.
LowlyDBA

답변:


5

주석에서 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_onlysys.databases테이블, 그리고 m_flagbits다시 설정됩니다 0x208. 따라서 파일을 축소하거나 읽기 전용으로 설정할 때 유사한 파일 수준 플래그가 설정되어있는 것으로 보입니다.

가장 좋은 추측은이 값이 다른 (내부) 플래그와 함께 사용되어 파일을 축소 할 수 있음을 나타냅니다. 파일을 늘리면 해당 플래그 (적어도에 표시되는 플래그)가 설정 해제 된 것으로 나타납니다 m_flagbits.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.