यदि SQL सर्वर डेटाबेस अभी भी उपयोग किया जा रहा है तो मैं कैसे बता सकता हूं?


33

हम एक SQL सर्वर उदाहरण है, जो एक जोड़े डेटाबेस अभी भी उस पर शेष है decommission करने के लिए देख रहे हैं।

मैं कैसे बता सकता हूं कि वे अभी भी उपयोगकर्ताओं या एक वेब एप्लिकेशन द्वारा उपयोग किए जा रहे हैं?

मुझे एक मंच धागा मिला जिसमें एक टी-एसक्यूएल क्वेरी थी जिसे आप अंतिम क्वेरी तिथि को पुनः प्राप्त करने के लिए चला सकते हैं। यह काम करने लगता है लेकिन मैं जानना चाहता हूं कि क्या यह जानकारी डेटाबेस को छोड़ने के लिए पर्याप्त वैध है। क्या यह?

यदि आपके पास वैकल्पिक तरीके हैं जो मदद करेगा।


1
नीचे बहुत सारी चर्चाएं हैं लेकिन इस ब्लॉग पोस्ट को भी देखें ।
हारून बर्ट्रेंड

जवाबों:


29

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

डेटाबेस को हाथ से छोड़ने के बजाय उन्हें छोड़ने के लिए या RESTRICTED_USER मोड में पहुंच को रोकने के लिए या तो OFFLINE डाल दिया। ऐसा करने से आप उन्हें जाँचने और देखने के लिए एक या दो महीने के लिए उस स्थिति में छोड़ सकते हैं कि क्या कभी-कभार उपयोग होता है।

आप उस डेटाबेस पर एक सर्वर साइड प्रोफाइलर ट्रेसिंग फ़िल्टर का उपयोग करना भी देख सकते हैं।


24
DBA होने का # 1 नियम: कभी भी कोई भी ऐसा बदलाव न करें जिसे आप करना चाहते हैं तो आप जल्दी से वापस नहीं लौट सकते।
गयुस

14

ये वे विधियाँ हैं जिनका मैंने अतीत में उपयोग किया है:

  1. डेटाबेस ऑफलाइन / डिटैच करें
  2. उपयोगकर्ता / प्रवेश की अनुमति दें
  3. प्रोफाइलर का निशान

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

सबसे अच्छी सलाह यह है: आप जो कुछ भी करते हैं वह पहुंच को बंद करने के लिए सुनिश्चित करें कि आप इसे तुरंत चालू कर सकते हैं। मैंने पाया कि डिटैच ने इसके लिए सबसे अच्छा काम किया। मैं बस रीटच को स्क्रिप्ट करूंगा और अपनी टीम को निर्देश दूंगा "यदि कोई भी कभी पूछता है कि यह कहां है, तो इस स्क्रिप्ट को चलाएं"। इससे हमें चीजों को जल्द से जल्द वापस लाने का सबसे अच्छा मौका मिला।


मैंने इसके बारे में सोचा है कि क्या मैं डेटाबेस के उपयोग की निगरानी के लिए पर्याप्त समय था। क्या आप सिर्फ SQL सर्वर की प्रकृति लेते हैं और उस निर्णय को कॉल करते हैं?
जसुनी

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

13

मैं उनकी सलाह से निक से सहमत हूं। यदि आपको निश्चित होने की आवश्यकता है, तो आपको प्रोइलर (सर्विस साइड ट्रेस) के साथ जाना होगा क्योंकि कुछ एसक्यूएल प्रश्नों को कैश नहीं किया जाएगा या किसी भी कारण से प्रक्रिया कैश को शुद्ध किया जा सकता है।

मैं सामान्य रूप से वर्चुअल फ़ाइल आँकड़ों की जानकारी की जाँच यह देखने के लिए करूँगा कि क्या OS फ़ाइल स्तर पर कोई रीड या लेखन हो रहा है। यहां तक ​​कि अगर डेटाबेस सक्रिय नहीं है, तब भी आप एक छोटा-सा रीड / राइट देखेंगे, अगर आप लॉग बैकअप, फुल बैकअप आदि ले रहे हैं ... लेकिन इससे आपको उस डेटाबेस पर पढ़ने / लिखने की गतिविधि का भी पता चल जाएगा।

किसी भी डेटाबेस को छोड़ने से पहले, मैं यह सुनिश्चित करूँगा कि आपके पास अलग-अलग स्थानों में कम से कम 2 या 3 पठनीय बैकअप (परीक्षण करें) हैं। आपको कभी नहीं पता कि आपको कब उनकी जरूरत है।


8

निम्नलिखित क्वेरी DBs को दिखाती है, जो पिछले पुनरारंभ के बाद से कोई उपयोग नहीं है, बिना कैश में आयोजित की जा रही योजनाओं पर निर्भर है, क्योंकि यह उपयोगकर्ता IO को अनुक्रमित (और ढेर) के खिलाफ दिखाता है। यह वर्चुअल फाइल स्टैटिस्टिक्स का उपयोग करने वाली लाइनों की तरह है, लेकिन यहाँ इस्तेमाल किया गया DMV बैकअप से IO गतिविधि को बाहर करता है। प्रोफाइलर ट्रेस को चालू रखने की आवश्यकता नहीं है, कोई ट्रिगर या ऑडिटिंग की आवश्यकता नहीं है। बेशक, यदि आप अपने SQL सर्वर को बार-बार पुनरारंभ करते हैं (या आप अक्सर डेटाबेस को बंद / संलग्न करते हैं) तो यह रास्ता नहीं हो सकता है :-)

ऐसा कहने के बाद भी, इस बात से सहमत हैं कि भले ही यह क्वेरी पुष्टि करती है कि DB को गिराया जा सकता है, निश्चित रूप से कुछ समय के लिए OFFLINE / detach या उपयोगकर्ता की पहुँच से वंचित रखें, साथ ही वास्तव में छोड़ने से पहले पूछने के किसी भी कारण परिश्रम!

select [name] from sys.databases 
where database_id > 4
AND [name] NOT IN 
(select DB_NAME(database_id) 
from sys.dm_db_index_usage_stats
where coalesce(last_user_seek, last_user_scan, last_user_lookup,'1/1/1970') > 
(select login_time from sys.sysprocesses where spid = 1))

यह बहुत अच्छा है अगर यह अच्छी तरह से काम करता है। क्या मैं पूछ सकता हूं कि आप क्यों ले रहे हैं और login_time से तुलना कर रहे हैं? और आपने last_user_update को शामिल क्यों नहीं किया है? क्या यह देखने का एक चतुर प्रयास है कि क्या डेटाबेस को INSERTS मिल रहा है, लेकिन कोई भी इसे क्वेरी नहीं कर रहा है? या क्या इस DMV के लिए सभी NULL टाइमस्टैम्प को शामिल करना संभव है?
जेसन

2

मैंने एक ऐसी जगह पर काम किया है जिसमें बड़ी संख्या में अनाथ और अर्ध-अनाथ डेटाबेस थे। यह बताना कठिन था कि क्या वे वास्तव में अनाथ थे क्योंकि कई कार्य मौसमी या वार्षिक थे - इसलिए वह वेबसाइट केवल प्रति वर्ष 3-4 महीने चलती है (उदाहरण के लिए, W2 रूपों को इलेक्ट्रॉनिक रूप से 1/31 दर्ज किया जाना चाहिए, इसलिए वेबसाइट प्रसंस्करण ये केवल जनवरी के मध्य से अप्रैल के अंत तक चले)।

क्या किया गया था:
* प्रत्येक डेवलपर से पूछें कि क्या वे कुछ डेटाबेस या अन्य का उपयोग कर रहे थे (ये ईमेल मासिक या जब भी बैकअप बहुत लंबा लग रहा था)।
* डेटाबेस को ऑफ़लाइन लें और देखें कि कौन शिकायत करता है।
* जो शिकायत करता है उसे देखने के लिए सर्वर का नाम बदलें।

चूंकि नुकीले बालों वाला बॉस केवल "पूर्ण और पूर्ण" दस्तावेज की अनुमति देने के लिए तैयार था, इसलिए विकी को स्पष्ट रूप से मना किया गया था, और कर्मचारियों की कटौती से दस्तावेज़ में नाटकीय गिरावट आई जो मानक को पूरा करती है।

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

हमारे पास एक बड़ा वित्तीय क्लाइंट था जो अभी भी 2009 तक SQL Server 2000 का उपयोग कर रहा था, इसलिए हमें एक SQL Server 2000 इंस्टेंस को तब तक चालू रखना था जब तक कि क्लाइंट अंततः SQL Server 2005 में नहीं चला गया।


2

एक और दो विकल्प हैं:

  1. DB पर ट्रिगर बनाएँ जो आपको सूचित करेगा (या किसी भी गतिविधि के लिए स्टोर करें)।
  2. DBs पर ऑडिटिंग सक्षम करें।

    • आपके DB संस्करण पर निर्भर करता है।

2

अगला समाधान आपके उदाहरण के तहत विशेष डेटाबेस के लिए MB में अस्थायी कुल, स्वच्छ और गंदे पृष्ठों को दिखाता है (इंटरनेट पर पाया गया और थोड़ा संशोधित):

SELECT
    (CASE WHEN ([database_id] = 32767) THEN 'Resource Database' ELSE DB_NAME (database_id) END) AS 'Database Name',
    COUNT(*) *8/1024 AS [TotalPages in MB],
    SUM(CASE WHEN ([is_modified] = 1) THEN 0 ELSE 1 END) *8/1024 AS [CleanPages in MB],
    SUM(CASE WHEN ([is_modified] = 1) THEN 1 ELSE 0 END) *8/1024 AS [DirtyPages in MB]
FROM sys.dm_os_buffer_descriptors
GROUP BY database_id
ORDER BY DB_NAME(database_id)

या

select value [DBid],attribute, last_execution_time ,text
from
sys.dm_exec_query_stats
cross apply
sys.dm_exec_plan_attributes(plan_handle)
cross apply
sys.dm_exec_sql_text(plan_handle)
where  attribute = 'dbid' 
order by last_execution_time desc

या

select value [DBid],attribute, last_execution_time ,text
from
sys.dm_exec_query_stats
cross apply
sys.dm_exec_plan_attributes(plan_handle)
cross apply
sys.dm_exec_sql_text(plan_handle)
--where dbid=8
where 
      text like '%idAdministrator%' and
      attribute = 'dbid' 
      and value>= 5 -- dbid >=5 for user databases but include resource database which
                     --you can exclude by its numer I don't remember at the moment
order by last_execution_time desc

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