SQL सर्वर डेटाबेस की स्थिति की निगरानी के लिए उपयोग करने के लिए सबसे अच्छी क्वेरी क्या है?


20

मैं डेटाबेस की स्थिति के बारे में महत्वपूर्ण जानकारी प्राप्त करने के लिए एक क्वेरी चलाने में सक्षम होना चाहता हूं। यानी, मैं चाहता हूं कि डेटाबेस यह बता सके कि डेटाबेस एक अच्छी स्थिति में है या नहीं।

यह वह क्वेरी है जो मुझे इस चेक के लिए मिली है:

SELECT name AS [SuspectDB],
  DATABASEPROPERTY(name, N'IsSuspect') AS [Suspect],
  DATABASEPROPERTY(name, N'IsOffline') AS [Offline],
  DATABASEPROPERTY(name, N'IsEmergencyMode') AS [Emergency],
  has_dbaccess(name) AS [HasDBAccess]
FROM sysdatabases
WHERE (DATABASEPROPERTY(name, N'IsSuspect') = 1)
   OR (DATABASEPROPERTY(name, N'IsOffline') = 1)
   OR (DATABASEPROPERTY(name, N'IsEmergencyMode') = 1)
   OR (has_dbaccess(name) = 0)

यदि वह क्वेरी किसी भी परिणाम को लौटाती है, तो यह धारणा बनाई जा रही है कि डेटाबेस संदिग्ध या संभावित खराब स्थिति में है।

क्या ऐसा करने के लिए इससे अच्छा तरीका है?


यदि आप अधिक गहराई से स्वास्थ्य जांच में रुचि रखते हैं, तो आप कुछ महत्वपूर्ण WMI प्रदर्शन काउंटर जैसे डेडलॉक, डिस्क IO प्रतीक्षा समय, प्रति सेकंड लेन-देन, इत्यादि की निगरानी करना चाहते हैं

@RQDC - यदि आप SQL Server 2008 में सड़क से नीचे जा रहे हैं, तो शायद प्रबंधन डेटावेयर को स्थापित करना आसान है।

@ नेट रोवर्स - 'बेस्ट / गुड' को व्यक्तिपरक प्रश्न माना जाता है। कृपया फिर से मुहावरा
कोडरवाक

कृपया पुन: प्रयास करने के बारे में एक सुझाव दें और मैं ख़ुशी से इस पर विचार करूँगा। मैं "सर्वश्रेष्ठ" के रूप में "सर्वश्रेष्ठ" की तलाश कर रहा हूं। यह मेरे लिए मुहावरा उचित तरीका लगता है।
ब्रेट रोटर करता है

@ अच्छी तरह से! खुशी है कि आपको 'सर्वश्रेष्ठ' :)
कोडरॉव

जवाबों:


12

यदि आप SQL 2005+ का उपयोग कर रहे हैं और केवल DB नाम वापस करना चाहते हैं जहाँ DB "ONLINE" स्थिति में नहीं है तो मैं इसका उपयोग करूँगा:

SELECT
    name
FROM sys.databases
WHERE state != 0;

याद रखें कि मिररिंग या लॉग शिपिंग में भाग लेने वाले डेटाबेस ऑनलाइन नहीं होंगे या नियमित रूप से स्थिति बदल सकते हैं। Sys.dat डेटाबेस के बारे में अधिक जानकारी के लिए DMV यहां प्रलेखन देखें: http://msdn.microsoft.com/en-us/library/ms178534.aspx


9

मैं नए प्रयोग करेंगे sys.databases नहीं sydatabases लेकिन अन्यथा यह ठीक है

कम से कम, आपको DATABASEPROPERTY कॉल की आवश्यकता नहीं है

SELECT
   name, state_desc
FROM
   sys.databases
WHERE
   state IN (4, 5, 6)

2

जिस तरह से मुझे db स्टेटस देखने को मिला वह इस तरह से DATABASEPROPERTYEX (डेटाबेस, प्रॉपर्टी) फंक्शन का उपयोग करना है:

DATABASEPROPERTYEX ('AdventureWorks', 'Status') का चयन करें।

स्थितियां बहुत ही आत्म व्याख्यात्मक हैं:

ONLINE = डेटाबेस क्वेरी के लिए उपलब्ध है।

ऑफ़लाइन = डेटाबेस स्पष्ट रूप से ऑफ़लाइन लिया गया था।

RESTORING = डेटाबेस को पुनर्स्थापित किया जा रहा है।

RECOVERING = डेटाबेस पुनर्प्राप्त हो रहा है और अभी तक प्रश्नों के लिए तैयार नहीं है।

SUSPECT = डेटाबेस ठीक नहीं हुआ।

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

में ओला Hallengren के ब्लॉग (एक SQL एमवीपी), डेटाबेस अखंडता को सत्यापित करने के लिए अपने उपकरण में, मैंने पाया कि वह एक डाटाबेस स्थिति क्वेरी करने के लिए दृश्य sys.database_recovery_status उपयोग कर रहा है। अगर इस दृश्य में db की एक पंक्ति है, तो यह लाइव और किकिंग है, यदि नहीं, तो यह ऑफ़लाइन है।

पुनश्च: डेटाबसप्रोपरेटी फ़ंक्शन जो आप उपयोग करते हैं, भविष्य के संस्करणों में निकालने जा रहे हैं, इसलिए डेटाबसप्रोपरेटीएक्स इसे प्रतिस्थापित कर रहा है।


मुझे नहीं लगता कि पूछने वाला विशिष्ट पुनर्प्राप्ति जानकारी की तलाश में था, बल्कि एक सामान्य स्वास्थ्य जांच के लिए एक प्रश्न था। ऑफ़लाइन डेटाबेस देखने के लिए पर्याप्त विशेषाधिकार के साथ आप चल रहे हैं, यह मानकर db स्थिति खोजने के लिए sys.dat डेटाबेस बेहतर स्थान है। यदि यह sys.dat डेटाबेस में नहीं है तो इसे गिरा दिया गया है या अलग कर दिया गया है।
एंड्रयूज

1
हां, मुझे पता है कि आपका क्या मतलब है, लेकिन मैंने कहा कि वह सिर्फ जाँच कर रहा था कि डीबी उस दृश्य में मौजूद है या नहीं, यदि हाँ, तो उसने डेटाबेस को सुलभ माना है, यदि नहीं, तो उसने डीबी को दुर्गम माना है। तो यह दूसरी जांच हो सकती है :)। मेरे लिए, उस db से किसी भी एक छोटी सी तालिका को क्वेरी करने के लिए एक अच्छी शुरुआत स्वास्थ्य जांच होगी और यदि वह क्वेरी किसी भी डेटा को लौटाती है, तो मैं पहली नजर में डीबी को सुलभ मानूंगा।
मरिअन

2

विशिष्ट परिस्थितियों के लिए क्वेरी करने के बजाय, मैं sys.dat डेटाबेस में कुछ भी देख सकता हूं, जहां State_desc <> 'ONLINE' है। इसके अलावा, आप क्या करने के लिए देख रहे हैं, इस पर निर्भर करता है कि has_dbaccess कुछ गलत सकारात्मक फेंक सकता है।


0

मैं यह पसंद है:

SELECT name, state_desc 
FROM   sys.databases

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