SHRINKFILE विफलता - फ़ाइल आकार बढ़ने से इसका समाधान क्यों होता है?


10

मैं SHRINKFILEएक फ़ाइलग्रुप में छोटे, अनावश्यक फ़ाइलों के एक समूह को साफ करने के लिए कुछ ऑपरेशन चला रहा हूं । एक सिकुड़न के लिए, एक त्रुटि में परिणाम के नीचे कमांड:

DBCC SHRINKFILE (N'myfile' , EMPTYFILE)'

डेटाबेस आईडी x की फ़ाइल आईडी सिकुड़ नहीं सकती क्योंकि यह या तो किसी अन्य प्रक्रिया से सिकुड़ रही है या खाली है

यह खाली नहीं है और न ही सिकुड़ा हुआ है। यह एक डेटाबेस पर चलाया जा रहा है, वर्तमान में खुद को छोड़कर किसी के द्वारा उपयोग में नहीं लिया जा रहा है। ऑटो हटना सक्षम नहीं है और कभी नहीं था। हालाँकि, इस डेटाबेस पर एक नियमित आधार पर मैनुअल श्रिंक किए जाते थे , इससे पहले कि मैं उस पर अपना हाथ रख पाऊं, अगर यह सब मायने रखता है।

पर SQLServerCentral , एक दशक पहले फाइल करने के लिए कुछ एमबी जोड़ने का सुझाव से एक धागा क्योंकि है कि "फिर सेट करता है एक आंतरिक काउंटर या स्विच है कि यह बताता है कि यह एक छोटा के बीच में अब नहीं है।"

यह काम किया - भयानक। लेकिन क्या कोई अधिक विस्तार से बता सकता है कि SQL सर्वर इंटर्न के संबंध में यह कैसे / क्यों काम करता है?


1
आपको जवाब नहीं बता सकता है, लेकिन अगर मैं भविष्य में कभी इस स्थिति में चला जाऊं तो यह जानने के लिए एक आसान ट्रिक है।
जॉन आइस्ब्रेनर

यदि आप फ़ाइल हेडर पेज पर कुछ ध्वज को हटा सकते हैं जो एक सिकुड़न के दौरान सेट हो जाता है?
मार्टिन स्मिथ

हाँ, मैं एक परीक्षण उदाहरण पर एक शॉट दे सकता हूं, लेकिन यह निश्चित रूप से था, इसलिए निश्चित रूप से इसे पुन: पेश करने की कोशिश करने की लक्जरी नहीं है।
लोवल्डबा

जवाबों:


5

मार्टिन हेडर द्वारा टिप्पणियों में सुझाए गए अनुसार, मैंने फ़ाइल हेडर पेज में चारों ओर पोज़ दिया। मुझे लगता है कि यह उत्तर का हिस्सा है, लेकिन यह ज्यादातर चिंराट और अन्य ऑपरेशनों के बीच फ़ाइल हेडर पेज फ्लैग वैल्यू में परिवर्तन देखने पर आधारित अटकलें हैं।


पहले मैंने एक माध्यमिक फ़ाइल समूह सहित परीक्षण करने के लिए एक डेटाबेस बनाया:

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)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.