मार्टिन हेडर द्वारा टिप्पणियों में सुझाए गए अनुसार, मैंने फ़ाइल हेडर पेज में चारों ओर पोज़ दिया। मुझे लगता है कि यह उत्तर का हिस्सा है, लेकिन यह ज्यादातर चिंराट और अन्य ऑपरेशनों के बीच फ़ाइल हेडर पेज फ्लैग वैल्यू में परिवर्तन देखने पर आधारित अटकलें हैं।
पहले मैंने एक माध्यमिक फ़ाइल समूह सहित परीक्षण करने के लिए एक डेटाबेस बनाया:
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" देखा, जो फ़ाइल_ 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
)। यह दिलचस्प नहीं है, लेकिन अब मैं आपके द्वारा रिपोर्ट की गई स्थिति में हूं: यदि मैं दोबारा फाइल खाली करने की कोशिश करता हूं, तो मुझे यह त्रुटि मिलती है:
डेटाबेस आईडी 19 की फाइल आईडी 3 सिकुड़ नहीं सकती क्योंकि यह या तो किसी अन्य प्रक्रिया से सिकुड़ रही है या खाली है।
मैं फ़ाइल को बढ़ाने की कोशिश करूँगा (आपके लिए काम करने वाला समाधान):
ALTER DATABASE ShrinkFile_Test
MODIFY FILE
(
NAME = ShrinkFile_Test_Secondary,
SIZE = 1025KB
);
GO
अब m_flagbits
है 0x8
!
इस बिंदु पर, फ़ाइल को फिर से खाली करना सफल है, 0x208
जैसा आप उम्मीद कर सकते हैं वैसा ही रिटर्न मिलता है।
जो चीज़ मुझे दिलचस्प लगती है, वह यह है कि अगर मैं फ़ाइल वापस बाहर करने के बाद ऐसा करता हूँ (AKA फ्लैगबेट्स मान है 0x8
):
USE [master]
GO
ALTER DATABASE [Shrinkfile_Test] MODIFY FILEGROUP [SECONDARY] READONLY
GO
फ़ाइल को तालिका is_read_only
में चिह्नित किया गया है sys.databases
, और m_flagbits
वापस पर सेट किया गया है 0x208
। तो ऐसा प्रतीत होता है कि फ़ाइल को सिकोड़ते समय और इसे केवल पढ़ने के लिए सेट करते समय कुछ समान फ़ाइल-स्तरीय ध्वज सेट होता है।
मेरा सबसे अच्छा अनुमान है कि यह मान कुछ अन्य (आंतरिक) ध्वज के साथ प्रयोग किया जाता है ताकि यह इंगित किया जा सके कि एक फ़ाइल सिकुड़ने योग्य है। फ़ाइल का बढ़ना उस ध्वज को अन-सेट करने के लिए प्रकट होता है (कम से कम एक दृश्य में m_flagbits
)।