Lỗi SHRINKFILE - Tại sao việc tăng kích thước tệp giải quyết nó?


10

Tôi đang chạy một số SHRINKFILEthao tác để dọn sạch một loạt các tệp nhỏ, không cần thiết trong một tập đoàn. Đối với một trong các thu nhỏ, lệnh bên dưới dẫn đến lỗi:

DBCC SHRINKFILE (N'myfile' , EMPTYFILE)'

ID tệp x của cơ sở dữ liệu ID x 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

Nó không trống rỗng cũng không bị thu hẹp. Nó đang được chạy trên cơ sở dữ liệu hiện không được sử dụng bởi bất kỳ ai trừ bản thân tôi. Tự động thu nhỏ không được kích hoạt và không bao giờ được. Tuy nhiên, đã có các thu nhỏ thủ công được thực hiện trên cơ sở dữ liệu này một cách thường xuyên trước khi tôi bắt tay vào nó, nếu điều đó có vấn đề gì cả.

Trên SQLServerCentral , một luồng từ một thập kỷ trước đề nghị thêm một vài MB vào tệp vì "đặt lại bộ đếm hoặc bộ chuyển đổi nội bộ cho biết nó không ở giữa thu nhỏ bây giờ."

Điều này đã làm việc - tuyệt vời. Nhưng bất cứ ai cũng có thể giải thích chi tiết hơn về cách thức / lý do tại sao điều này hoạt động liên quan đến bên trong SQL Server?


1
Không thể cho bạn biết câu trả lời, nhưng hãy ủng hộ vì đó là một mẹo hữu ích để biết liệu tôi có từng gặp phải tình huống này trong tương lai không!
John Eisbrener

nếu bạn có thể repro có thể một số cờ trên trang tiêu đề tệp được đặt trong quá trình thu nhỏ?
Martin Smith

Vâng tôi có thể đưa ra một phát bắn vào một ví dụ thử nghiệm, nhưng đây là sản phẩm nên chắc chắn không có sự cố gắng để tái tạo nó ở đó.
LowlyDBA

Câu trả lời:


5

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_flagBitscó 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_flagbitsvẫ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_flagbits0x8!

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ị 0x208như 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_onlytrong sys.databasesbả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).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.