SQL Server 2012 और SQL Server 2014 में एक प्रतिगमन बग है, जहां, यदि आप समानांतर में किसी अनुक्रमणिका का ऑनलाइन पुनर्निर्माण करते हैं, और आप लॉक टाइमआउट जैसी घातक त्रुटि का भी अनुभव करते हैं, तो आप डेटा हानि या भ्रष्टाचार . यह एक अपेक्षाकृत दुर्लभ परिदृश्य होना चाहिए (फिल ब्रैमर के पास कनेक्ट # 795134 में एक साधारण रेप्रो है), लेकिन डेटा हानि डेटा हानि है, और मैं जुआ खेलने के लिए तैयार नहीं हूं। KB #2969896 में फिक्स का वर्णन किया गया है:FIX:क्लस्टर इंडेक्स में डेटा हानि तब होती है जब आप SQL Server 2012 में ऑनलाइन बिल्ड इंडेक्स चलाते हैं।
इस मुद्दे पर सभी को चिंतित होने की जरूरत नहीं है। यदि आप एंटरप्राइज़ (या समकक्ष) संस्करण नहीं चला रहे हैं, तो आप पहले स्थान पर समानांतर या ऑनलाइन पुनर्निर्माण नहीं कर सकते हैं (और शायद एंटरप्राइज़ पर कुछ लोग पुनर्निर्माण नहीं कर रहे हैं या ऑनलाइन पुनर्निर्माण नहीं कर रहे हैं)। यदि आपके पास इंस्टेंस-वाइड MAXDOP
है 1 पर सेट करें, वे समानांतर नहीं जा सकते जब तक कि आप इसे कथन स्तर पर ओवरराइड नहीं करते। लेकिन, यदि आप 2012 या 2014 में पर्याप्त संस्करण चला रहे हैं, और आपके ऑनलाइन पुनर्निर्माण समानांतर हो सकते हैं, तो आप इस समस्या के प्रति संवेदनशील हैं।
जैसा कि मैंने ऊपर उल्लेख किया है, यह समस्या SQL Server 2012 RTM, सर्विस पैक 1 और यहां तक कि सर्विस पैक 2 में भी प्रकट हो सकती है, जो 10 जून को जारी किया गया था। SP2 कोड जमने के बाद तक बग को ठीक नहीं किया गया था, इसलिए SP2 करता है इस फिक्स या SP1 CU #10 या #11 से किसी भी फ़िक्सेस को शामिल न करें। मैंने इसके बारे में यहां ब्लॉग किया है। आरटीएम शाखा आधिकारिक तौर पर समर्थन से बाहर है, इसलिए आपको वहां कोई सुधार नहीं दिखाई देगा। समस्या SQL सर्वर 2014 में भी हो सकती है।
SQL Server 2012 सर्विस पैक 1 और 2 के साथ-साथ SQL Server 2014 के लिए अब संचयी अद्यतन उपलब्ध हैं। मेरे द्वारा सुझाए गए विकल्पों का एक त्वरित सारांश:
यदि आपकी शाखा / @@ संस्करण है...
| ...आपको चाहिए... | ||||
---|---|---|---|---|---|
कुछ न करें; आपके पास पहले से ही समाधान है। | |||||
कुछ न करें; आपके पास पहले से ही समाधान है। | |||||
SQL Server 2014 RTM | |||||
कुछ न करें; आपके पास पहले से ही समाधान है। | |||||
* यदि आप SP1 हॉटफिक्स या संचयी अद्यतन #11 स्थापित करते हैं और फिर SP2 स्थापित करते हैं, तो आप उन परिवर्तनों को पूर्ववत कर देंगे, जिनमें शामिल हैं यह सुधार। |
हॉटफिक्स/सीयू के विपरीत समाधान
चूंकि सभी प्रभावित शाखाओं (अच्छी तरह से, 2012 आरटीएम को छोड़कर) में एक ऑन-डिमांड हॉटफिक्स और/या एक संचयी अद्यतन है जो समस्या को संबोधित करता है, इसका आसान उत्तर केवल प्रासंगिक अद्यतन स्थापित करना है। हालाँकि, आप ऐसे परिदृश्य में हो सकते हैं जहाँ आपकी कंपनी की नीति या परीक्षण चक्र आपको इन अद्यतनों को जल्दी या शायद कभी भी लागू करने से रोकते हैं। तो आपके पास और क्या विकल्प हैं?
- आप अपनी शाखा के लिए नया सर्विस पैक उपलब्ध होने तक पुनर्निर्माण करना बंद कर सकते हैं (हो सकता है कि आप केवल
REORGANIZE
से चिपके रहें अभी के लिए)। दुर्भाग्य से, यदि आप "केवल सर्विस पैक" कंपनी में हैं, तो आपके विकल्प बहुत सीमित हैं:आप उस नीति को बदलने के लिए कठिन संघर्ष कर सकते हैं, या आप SQL Server 2012 सर्विस पैक 3 की प्रतीक्षा कर सकते हैं (जो एक लंबा समय हो सकता है, या हो सकता है बस कभी न आएं - अक्सर पूछे जाने वाले प्रश्न #21 यहां देखें) या SQL सर्वर 2014 सर्विस पैक 1 (जिसे हम शायद 2015 के रोल से पहले नहीं देखेंगे)। - आप इंस्टेंस-वाइड
max degree of parallelism
सेट कर सकते हैं 1 तक, हालांकि यह आपके शेष कार्यभार पर नकारात्मक प्रभाव डाल सकता है - बहु-थ्रेडेड डीबीसीसी जैसी चीजों के बारे में सोचें, विभाजित तालिकाओं के विरुद्ध या उनके बीच समानांतर प्रश्न, और अन्य संचालन जहां आप समानता को कम करना चाहते हैं लेकिन इसे पूरी तरह समाप्त नहीं करना चाहते हैं। साथ ही, यह सेटिंग एक स्पष्टMAXDOP = 8
के साथ ऑनलाइन पुनर्निर्माण को प्रभावित नहीं करेगी। कमांड में हार्ड-कोडेड, क्योंकि यहsp_configure
. को ओवरराइड कर देगा सेटिंग।
- आप
WITH (MAXDOP = 1)
जोड़ सकते हैं आपके सभी पुनर्निर्माण आदेशों के लिए मैन्युअल रूप से विकल्प। (नोट:आपको एक्सएमएल इंडेक्स के लिए ऐसा करने की ज़रूरत नहीं है, क्योंकि वे स्वाभाविक रूप से सिंगल-थ्रेडेड चलाते हैं, लेकिन मैं इसे निरंतरता के लिए और किसी भी अनावश्यक सशर्त तर्क से बचने के लिए सभी पुनर्निर्माणों पर लागू करूंगा।)
- आप एक विशिष्ट लॉगिन के रूप में चलाने के लिए अपनी अनुक्रमणिका रखरखाव कार्य सेट कर सकते हैं, और फिर एक कार्यभार समूह बनाने के लिए संसाधन गवर्नर का उपयोग कर सकते हैं जो उस लॉगिन के
MAX_DOP
को सीमित करता है। 1 तक, चाहे वे कुछ भी कर रहे हों। मेरे पास 2008 के श्वेत पत्र में इसका एक उदाहरण है जिसे मैंने बोरिस बेरिशनिकोव, यूजिंग द रिसोर्स गवर्नर के साथ, "इंटेंसिव बैकग्राउंड जॉब्स के लिए सीमित समानांतरवाद" नामक खंड में लिखा था।
- यदि आप Ola Hallengren के इंडेक्स रखरखाव समाधान का उपयोग कर रहे हैं, तो आप
@MaxDop
जोड़ सकते हैंdbo.IndexOptimize
. पर आपके कॉल के लिए पैरामीटर :
EXEC dbo.IndexOptimize /* other parameters */ @MaxDop = 1;
- यदि आप SQL संतरी फ़्रेग्मेंटेशन प्रबंधक का उपयोग कर रहे हैं, तो आप
MAXDOP
के स्तर को निर्धारित कर सकते हैं सेटिंग्स के तहत उपयोग करने के लिए - और आप यह उद्यम-व्यापी, प्रति उदाहरण, प्रति डेटाबेस, या यहां तक कि प्रति व्यक्तिगत अनुक्रमणिका भी कर सकते हैं (इस मामले में, आप शायद इसे प्रति उदाहरण सेट करना चाहते हैं, बिना किसी फिक्स के सभी उदाहरणों के लिए):
उदाहरण (बाएं) और एक व्यक्तिगत अनुक्रमणिका के लिए फ्रैगमेंटेशन प्रबंधक सेटिंग्स (दाएं)। - यदि आप अपने सूचकांक के पुनर्निर्माण के लिए रखरखाव योजनाओं का उपयोग कर रहे हैं, तो आपको निष्पादन टी-एसक्यूएल स्टेटमेंट टास्क का उपयोग करने के लिए उन्हें बदलना होगा, और अपना
ALTER INDEX ... WITH (ONLINE = ON, MAXDOP = 1);
मैन्युअल रूप से आदेश देता है (इसलिए स्वचालित समाधान पर स्विच भी हो सकता है)। देखें, इंडेक्स रीबिल्ड टास्क मेंMAXDOP
. के लिए एक एक्सपोज़्ड प्रॉपर्टी नहीं है , भले ही इसका कई बार अनुरोध किया गया हो (सबसे हाल ही में 2012 में, अल्बर्टो मोरिलो द्वारा, और 2006 तक, लिंची शी द्वारा)। और इन सभी अन्य उपयोगी गुणों को देखें, जैसेAdvSortInTempdb
,ObjectTypeSelection
, औरTaskAllowesDatbaseSelection
[एसआईसी!]:
वे सभी विकल्प, लेकिन फिर भी MAXDOP का कोई इलाज नहीं है।उन्हें>