SHRINKFILE Hatası - Dosya boyutunu büyütmek neden sorunu çözüyor?


10

SHRINKFILEBir grup dosyadaki küçük, gereksiz dosyaları temizlemek için bazı işlemler yapıyorum . Büzüşmelerden biri için aşağıdaki komut bir hataya neden olur:

DBCC SHRINKFILE (N'myfile' , EMPTYFILE)'

Veritabanı kimliği x'in dosya kimliği x başka bir işlem tarafından daraltıldığı veya boş olduğu için küçülemez

Boş değil, küçülmüyor. Şu anda kendim dışında kimse tarafından kullanılmayan bir veritabanında çalıştırılıyor. Otomatik küçültme etkinleştirilmedi ve hiçbir zaman etkinleştirilmedi. Ancak, orada vardı üzerinde ellerimi almak öncesinde bana düzenli olarak bu veritabanı üzerinde gerçekleştirilen manuel psikiyatr bu konularda eğer hiç.

On SQLServerCentral , on yıl önce dosyada birkaç MB eklemenizi öneriyor bir iş parçacığı çünkü "sıfırlar şimdi bir psikiyatriste ortasında değil bunu söyleyen bir iç sayaç veya anahtarı."

Bu çalıştı - harika. Ancak, herkes bunun nasıl / neden SQL Server dahili olarak çalıştığını daha ayrıntılı açıklayabilir mi?


1
Size cevabı söyleyemedim, ancak ileride bu duruma girip girmeyeceğimi bilmek için kullanışlı bir numara.
John Eisbrener

küçültme sırasında ayarlanan dosya üstbilgisi sayfasındaki bazı işaretleri çoğaltabilirseniz?
Martin Smith

Evet, bir test örneği üzerinde bir şans verebilirim, ama bu prod oldu, bu yüzden kesinlikle orada çoğaltmaya çalışmak lüksüne sahip değil.
LowlyDBA

Yanıtlar:


5

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_flagBitsdeğeri olan bir alan var 0x208.

Bu dosyayı boşaltırsam:

DBCC SHRINKFILE (N'ShrinkFile_Test_Secondary' , EMPTYFILE);

Bu m_flagbitsalan 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_flagbitsise 0x8!

Bu noktada, dosyayı tekrar boşaltmak başarılı olur, değeri 0x208beklediğ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_onlyiçinde sys.databasesmasa ve m_flagbitsgeri 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).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.