SQL सर्वर DB रातोंरात अनुपयोगी हो जाता है


9

कल, मेरा SQL सर्वर डेटाबेस ठीक था। आज यह लगभग अनुपयोगी है - जब मैंने इसे मारा, तो यह पांच से बीस के बीच के कारक से धीमा हो जाता है।

रात भर लोड प्रक्रिया में कुछ डेटा सर्वर में जोड़ा गया था, लेकिन एक वॉल्यूम की तरह कुछ भी नहीं जो एक डेटाबेस को प्रभावित करे। लगभग 50,000 सादे पाठ रिकॉर्ड (कोई एक्सएमएल या अन्य स्टेपरी नहीं)।

आज सुबह हमने रिबूट करने से पहले सर्वर को पैच कर दिया था। हालाँकि, हमारे अन्य डेटाबेस सर्वरों में से जो भी पैच किए गए थे वे अलग तरह से व्यवहार कर रहे हैं।

संसाधन मॉनिटर को यह सुझाव देना प्रतीत होगा कि उसकी डिस्क IO कि गलती है। यह लगभग 100% क्षमता पर चल रहा है। Mdf फ़ाइल पूरे समय, तब भी जब डेटाबेस में वास्तव में बहुत कुछ नहीं हो रहा है। Templog.ldf तक पहुंच भी काफी अधिक चल रही है।

यहां कोई भी व्यक्ति एक विशेषज्ञ डीबीए (हम सभी एसक्यूएल कौशल की मात्रा के साथ डेवलपर्स हैं) और जो कुछ भी हुआ है उससे हम सभी चकित हैं। हमने sp_updatestats चलाने और कुछ बड़े इंडेक्सों को अलग-अलग डिस्क में स्थानांतरित करने का प्रयास किया है, कोई फायदा नहीं हुआ।

मुझे लगता है कि यह पैच के साथ कुछ करना होगा - यह बहुत अधिक सह-घटना लगता है। एक सहकर्मी आश्वस्त है कि यह डेटा लोड होने के कारण mdf का आकार एक बिंदु तक बढ़ गया है जहां यह निष्पादन योजनाओं को अक्षम बनाने का कारण है।

पृथ्वी पर इसका क्या कारण है? हम कैसे पता लगा सकते हैं और इसे ठीक करने के लिए हम क्या कर सकते हैं?

संपादित करें:

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

यह SQL Server 2008 R2 का मानक संस्करण है। SELECT @@VERSIONदेता है:

Microsoft SQL Server 2008 R2 (SP2) - 10.50.4033.0 (X64)
Jul 9 2014 16:04:25
कॉपीराइट (c) Microsoft NT मानक संस्करण (64-बिट) Windows NT 6.1 पर (बिल्ड 7601: सर्विस पैक 1) (हाइपरविजर) )

सर्वर में 72GB रैम और तीन क्वाड-कोर 2GHz प्रोसेसर हैं।

पैचिंग केवल विंडोज पर लागू की गई थी। पैच के अलावा कोई बदलाव नहीं हुआ।

चयनित सेटिंग्स:

_id     name                        value   minimum     maximum     value_in_use    description                                 is_dynamic  is_advanced
1540    min memory per query (KB)   1024    512         2147483647  1024            minimum memory per query (kBytes)           1           1
1541    query wait (s)              -1      -1          2147483647  -1              maximum time to wait for query memory (s)   1           1
1543    min server memory (MB)      0       0           2147483647  16              Minimum size of server memory (MB)          1           1
1544    max server memory (MB)      65536   16          2147483647  65536           Maximum size of server memory (MB)          1           1

अद्यतन: अनुक्रमित और तालिकाओं को अलग-अलग डिस्क विभाजनों में स्थानांतरित करने से चीजें बेहतर हो रही हैं। मैं अभी भी इस बात को लेकर असमंजस में हूँ कि इतने कठोर नतीजों के साथ हम अचानक कैसे एक बिंदु तक पहुँच सकते हैं।


क्या आप 5 मिनट के लिए sp_whoisactive चला सकते हैं और आउटपुट को टेबल पर कैप्चर कर सकते हैं । आप इसे यहां से डाउनलोड कर सकते हैं और यह दिखाएगा कि आप आउटपुट को टेबल पर कैसे कैप्चर कर सकते हैं
किन शाह

ठीक है, अगर आपने सर्वर को फिर से शुरू किया है, तो इसका मतलब है कि आपके सभी कैश किए गए डेटा को बफर पूल से डंप किया गया था, और आपकी सभी कैश्ड निष्पादन योजनाएं भी डंप हो गई थीं। इसका मतलब है कि SQL सर्वर को दोनों को रैंप करना होगा - प्रत्येक निष्पादन योजना को फिर से संकलित करना होगा, और यदि आंकड़े बासी हैं तो आपको सबसे कुशल योजनाएं नहीं मिल सकती हैं। इसका अर्थ यह भी है कि डेटा को डिस्क से मेमोरी में पढ़ना होगा, जबकि रीस्टार्ट से पहले यह संभवतः मेमोरी में डेटा के साथ-साथ गुनगुना रहा था। यह अल्पकालिक होना चाहिए।
हारून बर्ट्रेंड

@AaronBertrand यह आठ घंटे के लिए ऐसा है। हम नियमित रूप से पैचिंग के लिए सर्वर को रिबूट करते हैं और पहले कभी इस तरह का कुछ भी ध्यान नहीं दिया है।
बॉब टवे

1
कॉन्फ़िगरेशन सेटिंग्स की जांच के लिए UI का उपयोग न करें। SELECT * FROM sys.configurations;- आप value, value_in_useजैसी चीजों के लिए चाहते हैं max server memory (MB)। साथ ही बिल्ड नंबर SELECT @@VERSION;उपयोगी होगा, साथ ही यह कि क्या यह एक हाइपरवाइजर में है और यदि कल से होस्ट पर कुछ भी बदला (या पिछली बार SQL सर्वर पुनरारंभ होने के बाद)।
हारून बर्ट्रेंड

2
आप किस प्रकार के IO सबसिस्टम का उपयोग कर रहे हैं? सैन, स्थानीय डिस्क, आदि? क्या कोई संयोग है कि आप संयोग से खराब चल रहे हैं? आपके किसी भी डीबी को किसी भी ओएस फ़ाइलों के समान स्थान पर संग्रहीत किया जाता है? और आखिरी सवाल। OS अपग्रेड करने से पहले हमारी प्रक्रिया का एक हिस्सा पहले से एक वीएम स्नैपशॉट लेना था। दुर्भाग्य से जिम्मेदार व्यक्ति इसे करना भूल गया। बहुत जल्दी पूरी प्रणाली धीमी और धीमी हो गई। आपके साथ ऐसा कोई भी मौका?
केनेथ फिशर

जवाबों:


3

ऐसा हो सकता है कि एसक्यूएल सर्वर में एक अन्य योजना या ऐसा कुछ करने के लिए डेटा की थोड़ी सी मात्रा एक निश्चित सीमा तक पहुंचती है। यह संभावना नहीं है। लेकिन यह तथ्य कि आपका डिस्क ड्यूटी के तहत भारी लगता है, मुझे दूसरे निष्कर्ष पर ले जाता है।

आपके धीमा होने के 2 संभावित आधार कारण हैं।

  1. आपने अपने सिस्टम को अपग्रेड किया और इसे रिबूट किया
  2. आप इसमें डेटा का एक गुच्छा लोड करते हैं

आइए एक नजर डालते हैं भाग संख्या 1 पर

यह हो सकता है कि आपका SQL सर्वर कॉन्फ़िगरेशन टूट जाए। यह आपके सर्वर की गति और डिस्क उपयोग के बारे में गंभीर समस्याएं पैदा कर सकता है।

कृपया पहले उदाहरण में अपनी मूल सर्वर सेटिंग्स की जाँच करें। उन मूलभूत सेटिंग कर रहे हैं max server memory, affinity I/O mask, affinity maskऔर max degree of parallelism। आपको उन्नत विकल्पों का उपयोग करके सक्षम करने की आवश्यकता हो सकती है show advanced options

यहाँ एक पूरी स्क्रिप्ट है:

-- enable advanced options
EXEC sp_configure 'show advanced options',1
-- apply configuration
RECONFIGURE
-- how much memory can the sql server allocate?
EXEC sp_configure 'max server memory'
-- which cpu is used to run I/O operations
EXEC sp_configure 'affinity I/O mask'
-- which cpus can run processes?
EXEC sp_configure 'affinity mask'
-- how many threads can work on one query part?
EXEC sp_configure 'max degree of parallelism'

अपने संस्थापन चरणों में अपने प्रलेखित मूल्यों के साथ परिणाम की तुलना करें। क्या वे अब भी वही हैं?

इसके कई कारण हो सकते हैं कि आपका सर्वर इतना अजीब व्यवहार क्यों करता है। मैं आम तौर पर शर्त लगाऊंगा, कि तुम्हारा max server memoryगलत है। यह आपके SQL सर्वर को स्थायी रूप से डेटा पृष्ठों को स्वैप करने का कारण होगा। वह अपनी स्मृति में सब कुछ नहीं पकड़ सकता। इसका मतलब है कि उसे डिस्क से पृष्ठों को पढ़ना होगा, इसे अपडेट करना होगा, इसे तुरंत वापस लिखना होगा। यदि कोई अन्य अपडेट साथ आता है और अपडेट के लिए उसी पृष्ठ का उपयोग करता है, तो इसे मेमोरी से नहीं पढ़ा जा सकता है। इसके बजाय सर्वर को डिस्क से इसे फिर से पढ़ने की जरूरत है। बस अदला-बदली ...

एक अन्य समस्या डिस्क या प्रक्रियाओं पर एक उच्च संबंध के लिए हो सकती है। यदि आपने SQL सर्वर के लिए एक समर्पित डिस्क के साथ एक साझा सर्वर (SQL Server + अन्य सेवाएँ) का उपयोग किया है (जो एक दुर्लभ मामला हो सकता है, लेकिन यह हो सकता है), तो यह आपकी समस्या हो सकती है। आपका सर्वर आमतौर पर प्रक्रियाओं के लिए 3 cpus और I / O के लिए उदाहरण के लिए उपयोग करता है। अन्य 12 cpus अन्य सेवाओं के लिए उपयोग किया जाता है। इस मामले में आपका आत्मीयता का मुखौटा गलत है और उदाहरण के लिए एक स्वचालित कॉन्फ़िगरेशन का उपयोग करता है। इसका अर्थ है कि आपका सर्वर सभी 16 कोर का उपयोग प्रक्रियाओं के लिए करता है और I / O गतिशील रूप से करता है। यदि आपके पास बहुत बड़ी प्रक्रियाएं चल रही हैं, तो वे डिस्क पर एक बड़ा भार डाल सकते हैं, जिसे वह संभाल नहीं सकता है। लेकिन वास्तव में, मुझे विश्वास नहीं है कि यह आपका मामला है। यह तेज़ होगा (भले ही बस थोड़ा सा) अगर यह लागू होगा, लेकिन आपका मामला धीमा है।

एक और समस्या समानता का एक उच्च स्तर हो सकता है। जिसका अर्थ है कि आपके पास क्वेरी के एक भाग पर बहुत सारे थ्रेड्स इडलिंग हैं। यह भी एक बड़ी धीमी गति का कारण बन सकता है अगर समानता अपेक्षा के अनुरूप काम न करे। लेकिन यह आपके कुल I / O का वर्णन नहीं करेगा।

अब चलो भाग संख्या 2 पर भी एक नजर डालते हैं

आप अपने सिस्टम में पंक्तियों का एक गुच्छा लोड करते हैं। यहां तक ​​कि अगर यह एक नियमित काम है, तो यह एक सीमा बढ़ा सकता है जिसमें आपकी क्वेरी योजना आगे बढ़ती है। यह भी मामला हो सकता है कि SQL सर्वर के साथ संयोजन में आपका सम्मिलित यह व्यवहार उत्पन्न करता है।

आपने उल्लेख किया है कि आपने पहले ही अपने सूचकांकों को किसी अन्य डिस्क पर स्थानांतरित करने का प्रयास किया है, जो मदद करने के लिए लगता है। यह सिर्फ इस तथ्य से हो सकता है कि आप दो अलग-अलग डिस्क पर लोड को विभाजित करते हैं।

यह हो सकता है कि आपके सूचक खंडित किए गए थे, कि आपकी योजनाएं खंडित थीं या आपके आंकड़े केवल पुराने हैं।

1. आपको पिछले अपडेट के आंकड़ों की जांच करने देता है। आप प्रत्येक एकल आंकड़े के लिए इंटरफ़ेस पर मैन्युअल रूप से ऐसा कर सकते हैं। जो एक पीड़ा होगी। या आप इस कोड को आज़मा सकते हैं:

SELECT name AS indexname,
STATS_DATE(OBJECT_ID, index_id) AS StatsUpdated
FROM sys.indexes

यह आपको प्रत्येक सूचकांक (और ढेर) और उनके पीछे के आंकड़ों की पूरी जानकारी देगा। यहां तक ​​कि अगर आप sp_updatestatsइसे चलाते हैं तो इसका मतलब यह नहीं है कि आँकड़े अपडेट किए गए थे। जब कोई अपडेट काफी मुश्किल होता है, तब भी जब आप चलाते हैं sp_updatestatsया auto update statisticsसक्षम होते हैं, तो भी आँकड़े समय पर अपडेट नहीं होंगे। जब अद्यतन की आवश्यकता / उत्पन्न होती है, तो यहां कुछ किनारे बिंदु हैं:

  • एक खाली तालिका में एक या अधिक पंक्तियाँ मिलती हैं
  • 500 से अधिक पंक्तियों वाली तालिका 20% + 500 अतिरिक्त पंक्तियों को अपडेट करती है और बाद में एक प्रविष्टि होती है
  • जब 500 पंक्तियों को 500 से कम पंक्तियों वाली तालिका में बदला गया

इसका मतलब है, यदि आप अपडेट चलाते हैं तो भी आपके आँकड़े पुराने हो सकते हैं।

आप उपरोक्त क्वेरी पर एक नज़र डाल सकते हैं। यदि आपको कुछ तालिकाओं में बहुत पुराने आँकड़े मिलते हैं, तो आप इस तालिका के लिए एक मैनुअल स्टेटिस्टिक अपडेट चलाना चाहते हैं:

UPDATE STATISTICS dbo.YourBadTable WITH FULLSCAN

उसके बाद, आप अपने सर्वर को सभी पुरानी योजनाओं को फेंकने के लिए गधे में एक किक दे सकते हैं।

DBCC FREEPROCCACHE 

यदि आप सभी कैश साफ़ करना चाहते हैं, तो आप इसके बजाय इसे चलाना चाहते हैं:

DBCC FREESYSTEMCACHE ('ALL')

यह सभी कैश को साफ करेगा, न कि केवल योजना कैश को। मैं सामान्य तौर पर चेतावनी दूंगा कि इसे प्रोडक्शन सर्वर के प्रोडक्शन फेज में इस्तेमाल करें। लेकिन जैसा कि आपका सर्वर वर्तमान में काम नहीं करता है, आप उन्हें बहुत अधिक नुकसान नहीं पहुंचा सकते। यह शायद 1-2 मिनट के लिए कुछ सेकंड के लिए धीमा हो सकता है क्योंकि उसे सभी कैश को फिर से बनाने की आवश्यकता है, लेकिन उसके बाद उसे सही योजनाओं के साथ चलना चाहिए।

एक और कारण पूरी तरह से खंडित सूचकांक हो सकता है। इस कथन का उपयोग करके इसे पूरे सर्वर पर देखा जा सकता है:

SELECT * 
FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, NULL)

यदि विखंडन बहुत अधिक है, तो आपको पुनर्गठन (विखंडन <20%) या पूरी तरह से पुनर्निर्माण (> 20%) की आवश्यकता हो सकती है। इससे आपकी डिस्क पर अधिक दबाव पड़ सकता है और परेशानी हो सकती है। दूसरी ओर, यदि सूचकांक खराब हैं, तो संभवत: यह नुकसान पहुंचाने से अधिक अंत में मदद करेगा।

उन दो कारणों के अलावा, अभी भी एक तीसरी समस्या हो सकती है

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

आप इस आदेश का उपयोग करके इसे देख सकते हैं:

SELECT * FROM sys.dm_exec_query_memory_grants

यह आपको सभी सत्रों की एक सूची प्रदान करेगा जो मेमोरी का उपभोग करते हैं। कुछ क्वेरी हो सकती है जो अभी भी मेमोरी पाने के लिए इंतजार कर रही है। उन प्रश्नों को आसानी से फ़िल्टर किया जा सकता है। सभी सत्र जहां granted_memory_kb IS NULL। ये ऐसे सत्र हैं जो मेमोरी का अनुरोध करते हैं लेकिन यह नहीं मिलता है। एक और चीज एक दी गई स्मृति हो सकती है जो कम हो सकती है। आप स्तंभ की तुलना कर सकते requested_memory_kbके साथ granted_memory_kb। अनुरोधित दिखाता है कि स्मृति को प्रक्रिया को चलाने के लिए कितनी मेमोरी की आवश्यकता होती है जबकि प्रक्रिया के लिए सक्षम होने वाली मेमोरी को दिखाता है। यदि किसी प्रक्रिया को चलाने के लिए 2GB की आवश्यकता है, लेकिन केवल 2MB मिलती है ... तो आप इसे स्वयं प्राप्त कर सकते हैं। ;-)

एक और तरीका है RESSOURCE_SEMAPHORE:

SELECT * FROM sys.dm_exec_query_resource_semaphore

आप waiter_countऔर पर एक नज़र डाल सकते हैं grantee_count। यदि वेटर 0 से ऊपर है, तो आपके पास आपकी मेमोरी पर दबाव पड़ता है, जिससे स्वैपिंग हो सकती है और आपके द्वारा परफ्यूम में देखे गए दबाव का कारण हो सकता है।


0

संभावित ड्राइव विफलताओं के अलावा, अपने RAID सबसिस्टम की स्थिति की जांच करें। हमने कुछ ऐसा ही देखा और यह RAID नियंत्रक पर बैटरी को विफल कर दिया ताकि कोई कैश उपलब्ध न हो - सभी लिखों को सीधे डिस्क पर जाना पड़ा। एक तरफ ध्यान दें - हम RDC'ing में सिस्टम ठहराव महसूस कर सकते हैं।

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