मैं डेटाबेस निर्भरता को कैसे ट्रैक कर सकता हूं?


37

जैसा कि आंतरिक अनुप्रयोग कई वर्षों में विकसित होते हैं, आप कभी-कभी पाते हैं कि ऐसी कई तालिकाएँ हैं, जिनके बारे में लोगों का मानना ​​है कि वे अब प्रासंगिक नहीं हैं और सुस्त होना चाहते हैं। डेटाबेस निर्भरता की पहचान के लिए व्यावहारिक तरीके क्या हैं, दोनों SQL वातावरण के भीतर, और शायद SSIS जैसी चीजों में आगे हैं?

मैंने उन जगहों पर काम किया है जहाँ काफी क्रूर विकल्प लिए गए हैं जैसे:

  • पहले ड्रॉप करें, बाद में सवाल पूछें (डेटा वेयरहाउस बिल्ड को मार सकता है यदि वह एक तालिका निकालने की कोशिश करता है जो अब मौजूद नहीं है)
  • अनुमतियाँ पहले निकालें, और रिपोर्ट की जाने वाली त्रुटियों के लिए प्रतीक्षा करें (यदि मूक बग को सही ढंग से नियंत्रित नहीं किया गया है, तो मौन कीड़े पैदा कर सकते हैं)

मैं सराहना करता हूं कि SQL सर्वर उस उदाहरण के भीतर निर्भरता पर नज़र रखने के लिए उपकरण के साथ आता है, लेकिन अगर आपके पास विभिन्न उदाहरणों पर डेटाबेस है तो ये संघर्ष करने लगते हैं। क्या ऐसे विकल्प हैं जो निर्भरता को क्वेरी करना आसान बनाते हैं, शायद "इस कॉलम का उपयोग कहां किया जाता है" जैसे सवालों का जवाब दे रहा है। "इस संग्रहीत कार्यविधि में अन्य सर्वर पर" या "इस SSIS पैकेज में ओवर" जैसे उत्तरों के साथ?

जवाबों:


14

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


7
  1. Sys.sql_modules.definition के साथ उपयोग के लिए खोज कोड: क्या यह संदर्भित है? फिर...
  2. अनुमतियाँ जांचें: ग्राहक कोड क्या कह सकता है? फिर...
  3. प्रोफाइलर

इस प्रकार:

  • बिना किसी संदर्भ और बिना अनुमति वाली तालिका के लिए, इसका उपयोग नहीं किया जा रहा है।
  • कोई संदर्भ और कुछ अनुमतियों के साथ, उपयोग देखने के लिए प्रोफाइलर चलाएं
  • बिना अनुमति और संदर्भ के, उपयोग की लॉगिंग जोड़ें

मैंने पहले जो किया है वह तालिका को मेज को देखने वाला बनाना है, फिर दृश्य को बुरी तरह से प्रदर्शन करना है: (क्रॉस खुद को मिलाएं, अलग)। आप वास्तव में इसे नहीं हटाते हैं लेकिन आप क्लाइंट टाइमआउट या शिकायतें उत्पन्न करते हैं ...


6

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

यह बहुत मुश्किल है कि निर्भरता को ट्रैक करें जब डेटाबेस को हिट करने वाले सभी कोड डेटाबेस में नहीं होते हैं यानी डेटाबेस को रैंडम करने वाले क्लाइंट।

संपादित करें: इस बिंदु को संबोधित करने के लिए कि एक तालिका का चयन ट्रिगर नहीं हो सकता है, यहां एक और विकल्प है जो यह मानकर काम करना चाहिए कि आपके टेबल में अनुक्रमित हैं (केवल 2008 में परीक्षण किया गया)।

SELECT          
    last_user_seek,
    last_user_scan,
    last_user_lookup,
    last_user_update
FROM
    sys.dm_db_index_usage_stats AS usage_stats
INNER JOIN
sys.tables AS tables ON tables.object_id = usage_stats.object_id
WHERE
    database_id = DB_ID() AND
    tables.name = 'mytable' 

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


4

एक तरीका जो मैंने अतीत में उपयोग किया है वह था उम्मीदवारों की सूची को हटाने के लिए तालिकाओं की सूची स्थापित करना और फिर उनका नाम बदलकर विफलताओं की तलाश करना।

मैंने सूची कैसे स्थापित की:

  1. देखें कि कौन सी तालिकाएँ वर्तमान संग्रहीत कार्यविधियों, ट्रिगर और कार्यों में उपयोग में नहीं हैं

  2. खाली टेबल (शून्य रिकॉर्ड);

  3. गैर संदर्भित टेबल (ऐसी तालिकाएँ जिनका कोई संबंध नहीं है);

  4. देखें कि डीबी सर्वर शुरू होने के बाद (डीएमवी) कौन से टेबल उपयोग में नहीं थे।

पाठ फ़ाइल में सूची बनाने के बाद मैंने एक बैच स्क्रिप्ट बनाई जो हमारी .cs फ़ाइलों (हम केवल .net प्रोजेक्ट्स) को स्थानीय मैप किए गए संस्करण नियंत्रण फ़ोल्डर से पार्स करेंगे और देखें कि क्या उन फ़ाइलों को .cs फ़ाइलों में उपयोग किया जाता है। नहीं होना चाहिए, लेकिन हे .. मुझे आश्चर्य हुआ है)। यदि नहीं, तो यह स्पष्ट है, यदि हाँ, तो हम एक सूची बनाते हैं और डेवलपर्स को यह जांचने के लिए देते हैं कि क्या वह मॉड्यूल अभी भी उपयोग में है।

तो, संक्षेप में, पिछले लोग सही हैं, कोई चांदी की गोली नहीं है।


3

मैं अपनी कंपनी में जो नीति लागू कर रहा हूं, वह सब कुछ है जो एक केंद्रीय स्थान पर, स्रोत नियंत्रण के तहत SQL सर्वर को छूती है।

  • asp.net परियोजनाओं
  • SSRS प्रोजेक्ट्स
  • SSIS प्रोजेक्ट्स
  • मैं भी सभी डेटाबेस ऑब्जेक्ट्स को एक प्रकार के भंडार में स्क्रिप्ट करता हूं।

मेरे पास अभी तक इसे स्थापित नहीं किया गया है, लेकिन आखिरकार मैं किसी प्रकार के सूचकांक / केंद्रीय खोज तंत्र को लागू करना चाहता हूं जिसका उपयोग मैं विशिष्ट तालिकाओं, स्प्रोक्स, आदि की खोज के लिए कर सकता हूं। हम वास्तव में एक नई SQL सर्वर शॉप हैं - फॉक्सप्रो से परिवर्तित करना । इतनी पुरानी SQL ऑब्जेक्ट अभी तक एक समस्या नहीं हैं, लेकिन मैं भविष्य के लिए योजना बना रहा हूं।

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


3

ट्रैकिंग निर्भरता में उपयोग करने के लिए विभिन्न प्रकार के उपकरण और तकनीकें शामिल हैं:

उपकरण जिन्हें मैं जानता हूं:

  • SQL सर्वर निर्भरता दर्शक (लेकिन समस्या हो सकती है अगर तालिका का उपयोग करने से पहले तालिका बनाई गई थी)
  • Redgate SQL निर्भरता ट्रैकर (@Eric Humphrey के उत्तर के माध्यम से)
  • रिचार्पर (.net टूल जिसका उपयोग कॉलिंग पथ को देखने के लिए किया जा सकता है, मुझे लगता है कि इसका उपयोग उस ट्रैक को करने के लिए किया जा सकता है जहां कुंजी एसक्यूएल का उपयोग किया जाता है)

तरीके

  • एसक्यूएल ऑब्जेक्ट्स के उपयोग के लिए कोड खोज (हालांकि ऊपर कुछ टूल की प्रतिकृति है)
  • उपयोग के आँकड़ों को देखें (यानी: जब एक SQL ऑब्जेक्ट को अंतिम रूप से बुलाया गया था), मैं नीचे दिए गए SQL का उपयोग करता हूं:

    SELECT 
        last_execution_time,   
        (SELECT TOP 1 
            SUBSTRING(s2.text,statement_start_offset / 2+1 , 
                ((CASE WHEN statement_end_offset = -1 THEN 
                    (LEN(CONVERT(nvarchar(max),s2.text)) * 2) 
                ELSE statement_end_offset END) - statement_start_offset) / 2+1)
        )  AS sql_statement,
        execution_count
    FROM sys.dm_exec_query_stats AS s1 
    CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2  
    WHERE 
        s2.text like '%[OBJECT NAME]%' 
        and last_execution_time > [DATE YOU CARE ABOUT]
    ORDER BY last_execution_time desc
    

नोट : सर्वर के पुनरारंभ होने, अलग होने आदि के बाद उपयोग की आँकड़े तालिका साफ़ हो जाती है, इसलिए आपको डेटा एकत्र करने के लिए नौकरी सेट करने की आवश्यकता होगी। एक हैक मुझे पता है। (@ मायल्स डी से)

तकनीक

  • अंतिम उपयोग के लिए खोजें (ऊपर उपयोग के आँकड़े देखें)
  • इसका उपयोग करने के लिए खोजें (उपकरण देखें)
  • डेवलपर्स के साथ कोड उपयोग की समीक्षा करें (@MrDenny के माध्यम से)
  • नाम बदलें (यानी: पोस्ट / उपसर्ग _toBeDropped के साथ) और त्रुटियों के लिए देखें
  • अनुमतियाँ बदलें, और त्रुटियों के लिए देखें
  • वस्तु गिराओ और प्रार्थना करो

2

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

यह स्तंभ कहां उपयोग किया गया है

यह प्रश्न तब और अधिक जटिल हो जाता है जब आपको पता चलता है select *कि स्तंभ में स्थित उस तालिका से कई प्रश्न, विचार और संग्रहीत कार्यविधियाँ उपयोग की जाती हैं । फिर आपको उन कार्यक्रमों को देखने की आवश्यकता है जो उन परिणामों का उपयोग करते हैं - इसलिए आपको कुछ स्कैनर / इंडेक्स / पार्सर की आवश्यकता होती है सी #, डेल्फी, जावा, वीबी, एएसपी (क्लासिक) और इतने पर हो सकता है कि स्रोत को पढ़ने के लिए सक्षम हो, ताकि उस कॉलम के हर संदर्भ का शिकार करने का प्रयास किया जा सके। फिर आपको उन कार्यक्रमों को आज़माने और पहचानने की ज़रूरत है कि क्या उस कोड को और भी कहा जा रहा है।



2

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

बेशक SSIS आम तौर पर सीधे तालिकाओं से जुड़ जाएगा, इसलिए यह शायद अभी आपकी जरूरत के लिए ज्यादा मदद नहीं है। लेकिन जब डेवलपर्स आपके डेटाबेस से जुड़ते हैं और आपको जिन विचारों और स्प्रोक्स की आवश्यकता होती है उन्हें बनाने के लिए (या जिसे आप डीबीए के रूप में सेवा कर रहे हैं) के बारे में शिकायत करते हैं, तो आप उन्हें बता सकते हैं: "किसी भी तालिका या स्तंभ को हटाया या नाम बदला जा सकता है।" मैंने केवल आपको विचारों और परिवर्तनों के बारे में सूचित रखने के लिए बाध्य किया। " और उन्हें केवल इन विशिष्ट परिवर्तनों के लिए प्रतिगमन परीक्षण करना है।


0

TSQL निम्नलिखित sysinos_sql_referencing_entities या sys.sql_expression_dependencies उपयोग किया जा सकता है

वैकल्पिक रूप से एसक्यूएल नेगोशिएटर प्रो, रेडगेट आदि जैसे उपकरण जीयूआई का उपयोग करके आपके लिए इसे नेत्रहीन रूप से उत्पन्न कर सकते हैं

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