[ भाग 1 | भाग 2 | भाग 3 ]
इस श्रृंखला के भाग 1 में, मैंने समझाया कि मैं इस निष्कर्ष पर कैसे पहुंचा कि हमें डिफ़ॉल्ट ट्रेस को अक्षम करना चाहिए। भाग 2 में, मैंने विस्तारित ईवेंट सत्र दिखाया जिसे मैंने सभी फ़ाइल आकार परिवर्तन ईवेंट को कैप्चर करने के लिए तैनात किया था। इस पोस्ट में, मैं लोगों के लिए ईवेंट डेटा की खपत को आसान बनाने के लिए और कुछ चेतावनियों की व्याख्या करने के लिए बनाए गए विचारों को दिखाना चाहता हूं।
पाचन योग्य दृश्य
सबसे पहले, मैंने एक ऐसा दृश्य बनाया जो विस्तारित ईवेंट सत्र डेटा से महत्वपूर्ण बिट्स को उजागर करेगा, और इसे हर उदाहरण पर मौजूद उपयोगिता डेटाबेस में डाल देगा:
फ़ाइलइन्फो(XEPath) AS के साथ dbo.vwFileSizeChangesAS दृश्य बनाएं (चुनें बाएँ(BasePath,COALESCE(NULLIF(CHARINDEX(SessName,BasePath)-1,-1),0)) + SessName + N'*.xel' से ( xmlsrc.data.value(N'(@name)[1]', N'nvarchar(max)'), SessName FROM (सेसनाम सेलेक्ट करें (xml,target_data), s.[name] FROM sys.dm_xe_session_targets AS t चुनें इनर जॉइन sys.dm_xe_sessions के रूप में पर एस। ) xmlsrc (डेटा) के रूप में) इनरडाटा (बेसपाथ, सेसनाम) के रूप में), सत्र डेटा ([इवेंटडेटा]) एएस (फाइलइन्फो क्रॉस से लागू sys.fn_xe_file_target_read_file(FileInfo.XEPath, NULL, NULL, NULL) से चुनें कन्वर्ट (xml, TargetData.event_data) ) AS TargetData ), src AS ( Select EndTimeUTC =x.d.value(N'(@timestamp)[1]', N'datetime2'), DatabaseID =x.d.value(N'(data [@name="database_id"]/value)[1]', N'int'), [FileName] =x.d.value(N'(data [@name="file_name"]/ value)[1]', N'sysname'), Duration =x.d.value(N'(data [@name="duration"]/value)[1]', N'int'), FileType =x.d.value(N) '(डेटा [@name="file_type"]/text)[1]', N'varchar(4)'), Culprit =x.d.value(N'(action[@name="sql_text"]/value)[1 ]', N'nvarchar(max)'), IsAutomatic =x.d.value(N'(data [@name="is_automatic"]/value)[1]', N'varchar(5)'), ChangeKB =x.d.value (एन'(डेटा [@name="size_change_kb"]/value)[1]', N'bigint'), प्रिंसिपल =x.d.value(N'(action[@name="server_principal_name"]/value)[1] ', N'sysname'), उपयोगकर्ता नाम =x.d.value(N'(action[@name="username"]/value)[1]', N'sysname'), AppName =x.d.value(N'(action[@ name="client_app_name"]/value)[1]', N'sysname'), HostName =x.d.value(N'(action[@name="clien t_hostname"]/value)[1]', N'sysname') --, [EventData] -- सेशनडेटा क्रॉस से विशिष्ट ईवेंट के समस्या निवारण के लिए अपरिष्कृत XML EventData.nodes('/event') AS x(d) ) चुनें डेटाबेसनाम =डीबी_नाम (डेटाबेसआईडी), [फाइलनाम], अवधि सेकेंड =कन्वर्ट (दशमलव(18,3), अवधि/1000000.0), स्टार्टटाइमयूटीसी =कन्वर्ट (डेटाटाइम 2 (3), DATEADD (माइक्रोसेकंड, -ड्यूरेशन, एंडटाइमयूटीसी)), एंडटाइमयूटीसी =कन्वर्ट (डेटाटाइम 2(3), एंडटाइमयूटीसी), फाइल टाइप, कल्पित =मामला जब अपराधी शून्य है और ऐपनाम एन’प्रतिकृति% की तरह है, फिर ऐपनाम ईएलएसई अपराधी अंत, स्वचालित, चेंजएमबी =कन्वर्ट (दशमलव(18,3), चेंजकेबी / 1024.0), प्रिंसिपल =COALESCE([प्रिंसिपल], COALESCE(NULLIF(username,N''),N'?')), होस्टनाम, ऐप =केस जब AppName N'%Management Studio%Query%' की तरह हो तो N'SSMS - क्वेरी विंडो ' जब AppName N'%Management Studio%' को पसंद करता है तो N'SSMS - GUI!' ELSE AppName END--, [EventData] -- स्रोत से विशिष्ट ईवेंट के समस्या निवारण के लिए अपरिष्कृत XML;
अब, जब कोई किसी सर्वर पर हाल के फ़ाइल आकार परिवर्तन ईवेंट की समीक्षा करना चाहता है, तो वे चलते हैं:
चुनेंUtilityDatabase.dbo.vwFileSizeChanges से StartTimeUTC DESC द्वारा ऑर्डर करें;
जब आप डिफ़ॉल्ट ट्रेस को अक्षम करते हैं, तो ट्रेस फ़ाइलें हटाई नहीं जाती हैं, इसलिए उस परिवर्तन से पहले की कोई भी घटना अभी भी समीक्षा योग्य है। मैं इस तथ्य से उधार ले सकता हूं कि डिफ़ॉल्ट ट्रेस को उसी पथ पर हार्ड-कोड किया गया है जैसे SERVERPROPERTY(N'ErrorLogFileName')
, और एक दूसरा दृश्य बनाएं जो उपरोक्त डेटा को डिफ़ॉल्ट ट्रेस से अधिक डेटा के साथ जोड़ता है:
डीएसटी एएस के साथ dbo.vwFileSizeChanges_IncludingTraceAS बनाएं (देखें s,e,d FROM (VALUES ('20190310','20191103',240),('20191103','20200308',300), ('20200308', '20201101’, 240), ('2020111', '20210314',300), ('20210314', '20211107', 240)) डीएसटी (एस, ई, डी) के रूप में - डीएसटी रूपांतरणों का समर्थन करने के लिए मनमानी तिथि सीमा एक साल + हर तरह से - बाद में 2022, 2023, आदि जोड़ देगा (यदि डीएसटी अभी भी एक चीज है)), vars (ट्रेसपाथ) एएस (चुनें रिवर्स (सबस्ट्रिंग (पी, चारिंडेक्स (एन'\', पी), 260 )) + N'log.trc' से (सेलेक्ट रिवर्स ((कन्वर्ट (nvarchar (अधिकतम), सर्वरप्रॉपर्टी (N'ErrorLogFileName'))))) AS s (p)), trc AS ( SELECT t.DatabaseName, t. [फाइलनाम], अवधि सेकेंड्स =कन्वर्ट (दशमलव(18,3), टी. अवधि/1000000.0), स्टार्टटाइमयूटीसी =कन्वर्ट (डेटाटाइम2(3), DATEADD(मिनट, COALESCE(st1.d,0), t.StartTime)), EndTimeUTC =CONVERT(datetime2(3), DATEADD(MINUTE, COALESCE(st2.d,0), t.EndTime)), FileType =CASE जब t.EventCla ss IN (92, 94) तब 'डेटा' जब t.EventClass IN (93, 95) तब 'लॉग' समाप्त होता है, Culprit =केस जब t.TextData NULL और t होता है। एप्लिकेशननाम L'N'Repl%' तब t.ApplicationName ELSE t.TextData END, IsAutomatic ='true', ChangeMB =CONVERT(bigint, t.IntegerData)*8/1024, प्रिंसिपल =t.LoginName, t.HostName, App =मामला जब t.ApplicationName जैसे N'%Management Studio%Query%' तब N'SSMS - क्वेरी विंडो' जब t.ApplicationName L'N'%Management Studio%' तब N'SSMS - GUI!' ELSE t.ApplicationName END --, [EventData] =CONVERT(xml, NULL) vars CROSS APPLY sys.fn_trace_gettable(vars.TracePath, DEFAULT) AS t बाएँ बाहरी t.StartTime पर st1 के रूप में शामिल हों। 2,st1.s) और t.StartTime=DATEADD(HOUR,2,st2.s) और t.EndTime यह दृश्य ट्रेस डेटा (हमारे सभी सर्वरों पर पूर्वी समय में कैप्चर किया गया) को यूटीसी में समायोजित करता है, और जहां उपयुक्त हो वहां डीएसटी को भी संभालता है। यदि डेटा
UtilityDatabase.dbo.vwFileSizeChanges_IncludingTrace सेdst
. नामक CTE की सीमा से बाहर आता है , इसके बजाय इसे पूर्वी समय में व्यक्त किया जाएगा (और आप अधिक DST श्रेणियां जोड़कर इसे आसानी से ठीक कर सकते हैं)।src
. नामक एक अतिरिक्त कॉलम है ताकि आप पुराने ट्रेस डेटा का उपयोग करके क्वेरी कर सकें:चुनेंजहां src =StartTimeUTC DESC द्वारा 'ट्रेस' ऑर्डर करें; चेतावनी
मुफ्त लंच जैसी कोई चीज नहीं होती है! हालांकि मुझे विश्वास है कि डिफ़ॉल्ट ट्रेस को हटाने से हमारे कार्यभार पर शून्य या अधिक संभावना है, सकारात्मक प्रभाव पड़ेगा, अगर आप मेरे पथ का अनुसरण करना चुनते हैं तो आपके पर्यावरण के लिए कुछ चीजें ध्यान में रखनी चाहिए:
- डेटाबेस स्थायी नहीं हैं
मेरे विस्तारित ईवेंट सत्र परिभाषा में, मैंने
collect_database_name
. को लागू नहीं करना चुना , और ऊपर के दृश्य में आप देख सकते हैं कि मैं इसेDB_NAME(database_id)
का उपयोग करके रनटाइम पर हल करता हूं . यहां एक जोखिम है, इसमें कोई डेटाबेस बना सकता है, गतिविधि का एक समूह कर सकता है जो फ़ाइल मंथन और डिस्क थ्रैशिंग बनाता है, फिर डेटाबेस छोड़ देता है।database_id
इस मामले में एक्सएमएल में एक्सपोज़्ड अब सार्थक नहीं है, औरDB_NAME()
वापस आ जाएगाNULL
।मैंने इस परिणाम को पूरी तरह से डेटाबेस के नाम पर भरोसा करने के लिए चुना, क्योंकि घटनाओं की उपरोक्त श्रृंखला डेटाबेस नाम बदलने की तुलना में बहुत कम है (जहां एक
database_id
वही रहेगा)। उस स्थिति में, हो सकता है कि आप किसी डेटाबेस में हुई घटनाओं की तलाश कर रहे हों, लेकिन घटनाओं के होने के आधार पर गलत (वर्तमान) नाम का उपयोग करके खोज रहे हों।यदि आप एक या दूसरे का उपयोग करने में सक्षम होना चाहते हैं, तो आप इसके बजाय निम्नलिखित सत्र परिभाषा का उपयोग कर सकते हैं:
...ईवेंट जोड़ेंयह या तो मुफ़्त नहीं हो सकता है, या यह डिफ़ॉल्ट रूप से होगा, लेकिन मैं स्वीकार करूंगा कि मैंने इसे संग्रह में जोड़ने के प्रभाव का कभी परीक्षण नहीं किया है।
- SSMS रिपोर्ट थोड़ी कम विश्वसनीय होंगी
डिफ़ॉल्ट ट्रेस को अक्षम करने का एक साइड इफेक्ट प्रबंधन स्टूडियो की "मानक रिपोर्ट" में से कुछ को बाधित कर रहा है। ऐसा करने से पहले मैंने अपनी टीमों को मतदान किया था, और आप यह सुनिश्चित करने के लिए भी ऐसा ही करना चाहेंगे कि आपके उपयोगकर्ता इनमें से किसी पर भरोसा न करें। आप उन्हें यह भी याद दिलाना चाहेंगे कि वर्तमान में रिपोर्ट पर वैसे भी भरोसा नहीं किया जा सकता है, उसी कारण से मैं सीधे डिफ़ॉल्ट ट्रेस पर भरोसा नहीं कर सकता - वे केवल उस डेटा को खींच सकते हैं जो अभी भी ट्रेस में है। एक खाली रिपोर्ट का मतलब यह नहीं है कि कोई घटना नहीं हुई; इसका सीधा अर्थ यह हो सकता है कि जानकारी अब उपलब्ध नहीं है। यदि यह वास्तव में वह जगह है जहां एक टीम इस जानकारी का उपभोग करना चाहती है, तो मैं यह सुनिश्चित कर सकता हूं कि यह एक अधिक भरोसेमंद स्रोत का उपयोग करने वाली कस्टम रिपोर्ट भेजकर विश्वसनीय है।
निम्नलिखित रिपोर्ट वे हैं जिन्हें मैं डिफ़ॉल्ट ट्रेस से कम से कम उनकी कुछ जानकारी प्राप्त कर सकता हूं, और हमें रिपोर्ट की आवश्यकता क्यों नहीं है, भले ही उन पर भरोसा किया जा सके:
स्कीमा इतिहास बदलता है हमारे पास पहले से ही स्रोत नियंत्रण, एक कठोर समीक्षा / परिनियोजन प्रक्रिया, और डीडीएल ट्रिगर मौजूद हैं जो स्कीमा परिवर्तनों के बारे में जानकारी प्राप्त करते हैं। कॉन्फ़िगरेशन इतिहास बदलता है
और
स्मृति की खपतहमारा निगरानी उपकरण हमें इंस्टेंस-स्तरीय कॉन्फ़िगरेशन परिवर्तनों के बारे में बताता है, इसलिए SSMS में यह रिपोर्ट बेमानी है। लॉगिन विफलताएं ये त्रुटि लॉग (और इवेंट व्यूअर) में हैं क्योंकि, एक मानक के रूप में, हम सभी SQL सर्वर इंस्टेंस के लिए "केवल विफल लॉगिन" ऑडिटिंग को सक्षम करते हैं। अनुपालन कारणों से कुछ सर्वरों में अतिरिक्त औपचारिक ऑडिटिंग भी होती है। डिस्क उपयोग अन्य जानकारी के अलावा, यह डिफ़ॉल्ट ट्रेस से ऑटोग्रोथ और ऑटोश्रिंक ईवेंट को सूचीबद्ध करता है, जिसे अब हम विस्तारित ईवेंट का उपयोग करके कैप्चर करते हैं। बैकअप और रीस्टोर इवेंट यह जानकारी msdb.dbo.backupset में आसानी से उपलब्ध है यदि हमें कभी इसकी आवश्यकता होती है, लेकिन इसे बैकअप और पुनर्स्थापना के आसपास हमारे स्वचालन में भी शामिल किया जाता है (हम इस जानकारी के लिए डिफ़ॉल्ट ट्रेस को कभी नहीं देख रहे हैं)।
डेटाबेस संगतता इतिहास बैकअप की तरह, हमारे पास DBCC CHECKDB के आसपास ऑटोमेशन बनाया गया है; अगर कोई इससे बाहर जाता है और मैन्युअल रूप से कुछ चलाता है, तो यह अभी भी त्रुटि लॉग में दिखाई देगा। और हम कितने समय तक त्रुटि लॉग रखते हैं, और हम उन्हें कितनी बार रीसायकल करते हैं, इस पर हमारा अधिक नियंत्रण होता है। हम रात में रीसायकल करते हैं ताकि किसी ऐसी घटना का पता लगाना आसान हो, जिस पर हमें संदेह हो कि वह किसी निश्चित दिन पहले हुई हो। निष्कर्ष
यह एक मजेदार लेकिन जटिल परियोजना थी, और मैं अब तक के परिणाम से संतुष्ट हूं। साथ चलने के लिए धन्यवाद!
[ भाग 1 | भाग 2 | भाग 3 ]