Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर इंस्टेंस (T-SQL उदाहरण) में उपयोग की जा रही बहिष्कृत सुविधाओं को लॉग करने के लिए विस्तारित ईवेंट का उपयोग करना

विस्तारित ईवेंट एक हल्का प्रदर्शन निगरानी प्रणाली है जो उपयोगकर्ताओं को SQL सर्वर में समस्याओं की निगरानी और समस्या निवारण के लिए आवश्यक डेटा एकत्र करने में सक्षम बनाती है।

यह आलेख दर्शाता है कि कैसे विस्तारित ईवेंट का उपयोग एक लॉग फ़ाइल बनाने के लिए किया जा सकता है जिसमें सभी बहिष्कृत सुविधाएँ शामिल हैं जो अभी भी SQL सर्वर की आवृत्ति में उपयोग की जा रही हैं। लॉग इवेंट सत्र शुरू होने के बाद से सभी घटनाओं को रिकॉर्ड करता है।

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

लेकिन अगर आपको अधिक विस्तृत लॉग की आवश्यकता है जिसमें सामान शामिल है; SQL कथन का उपयोग किया गया है जिसमें बहिष्कृत सुविधा है, जिस डेटाबेस के खिलाफ इसे चलाया गया था, वह उपयोगकर्ता जिसने इसे चलाया था, इसे चलाने का समय, आदि, पर पढ़ें।

विस्तारित ईवेंट सत्र बनाएं

विस्तारित ईवेंट सत्र बनाने के लिए पहला कदम है। यहां, हम ईवेंट के स्रोत, ईवेंट सत्र लक्ष्य और ईवेंट सत्र विकल्प निर्दिष्ट करते हैं।

CREATE EVENT SESSION [Deprecation Events] ON SERVER 
ADD EVENT sqlserver.deprecation_announcement(
    ACTION(
        sqlserver.database_name,
        sqlserver.sql_text,
        sqlserver.username
        )
),
ADD EVENT sqlserver.deprecation_final_support(
    ACTION(
        sqlserver.database_name,
        sqlserver.sql_text,
        sqlserver.username
    )
)
ADD TARGET package0.event_file(
    SET filename=N'/var/opt/mssql/tmp/DeprecationEvents.xel'
    )
WITH (
    TRACK_CAUSALITY = ON
    );

इस मामले में मैं /var/opt/mssql/tmp/DeprecationEvents.xel का लक्ष्य निर्दिष्ट करता हूं . इसका मतलब है कि उस फ़ाइल में ईवेंट डेटा संग्रहीत किया जाएगा। आप कोई भी फ़ाइल नाम और पथ निर्दिष्ट कर सकते हैं।

यह उदाहरण एक Linux फ़ाइल पथ का उपयोग करता है, जो फ़ॉरवर्ड स्लैश का उपयोग करता है। यदि आप विंडोज पर हैं, तो आपको बैकस्लैश का उपयोग करना होगा। उदाहरण के लिए:C:\Temp\DeprecationEvents.xel

विस्तारित ईवेंट सत्र प्रारंभ करें

ईवेंट सत्र बनाने से यह प्रारंभ नहीं होता है। ALTER EVENT SESSION का उपयोग करें इसे रोकने और शुरू करने के लिए। इस मामले में हम इसे शुरू करना चाहते हैं:

ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;

कुछ ऐसा करें जो अप्रचलित हो

अब जब हमने विस्तारित ईवेंट सत्र शुरू कर दिया है, तो चलिए कुछ बहिष्कृत कोड चलाते हैं:

SELECT * FROM sys.sql_dependencies;

क्योंकि sys.sql_dependencies बहिष्कृत है, तो वह कोड उस XEL फ़ाइल में डेटा जोड़ देगा जिसे हमने पहले निर्दिष्ट किया था।

XEL फ़ाइल देखें

अब जबकि हमने (संभवतः) अपनी XEL फ़ाइल में डेटा जोड़ लिया है, आइए उस पर एक नज़र डालते हैं:

SELECT event_data 
FROM sys.fn_xe_file_target_read_file (
    '/var/opt/mssql/tmp/DeprecationEvents*.xel', 
    null, 
    null, 
    null
    );  

परिणाम:

<event name="deprecation_announcement" package="sqlserver" timestamp="2019-10-31T04:03:06.528Z"><data name="feature_id"><value>198</value></data><data name="feature"><value><![CDATA[sql_dependencies]]></value></data><data name="message"><value><![CDATA[sql_dependencies will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.]]></value></data><action name="username" package="sqlserver"><value><![CDATA[sa]]></value></action><action name="sql_text" package="sqlserver"><value><![CDATA[SELECT * FROM sys.sql_dependencies;]]></value></action><action name="database_name" package="sqlserver"><value><![CDATA[Test]]></value></action><action name="attach_activity_id_xfer" package="package0"><value>5566866F-8266-467A-9950-895310CF21E3-0</value></action><action name="attach_activity_id" package="package0"><value>07971CB0-F9CC-46C6-B885-5BA8A904B880-1</value></action>

इस मामले में, मैंने केवल event_data returned लौटाया है , क्योंकि यहीं पर सभी ईवेंट डेटा रहता है।

दुर्भाग्य से, हम मनुष्यों के लिए इसे पढ़ना सबसे आसान नहीं है।

अगर मैं इसे प्रारूपित करूं तो क्या होगा?

<event name="deprecation_announcement" package="sqlserver" timestamp="2019-10-31T04:03:06.528Z">
   <data name="feature_id">
      <value>198</value>
   </data>
   <data name="feature">
      <value><![CDATA[sql_dependencies]]></value>
   </data>
   <data name="message">
      <value><![CDATA[sql_dependencies will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.]]></value>
   </data>
   <action name="username" package="sqlserver">
      <value><![CDATA[sa]]></value>
   </action>
   <action name="sql_text" package="sqlserver">
      <value><![CDATA[SELECT * FROM sys.sql_dependencies;]]></value>
   </action>
   <action name="database_name" package="sqlserver">
      <value><![CDATA[Test]]></value>
   </action>
   <action name="attach_activity_id_xfer" package="package0">
      <value>5566866F-8266-467A-9950-895310CF21E3-0</value>
   </action>
   <action name="attach_activity_id" package="package0">
      <value>07971CB0-F9CC-46C6-B885-5BA8A904B880-1</value>
   </action>
</event>

स्वरूपित होने पर इसे पढ़ना थोड़ा आसान होता है, लेकिन हम इससे बेहतर कर सकते हैं।

XEL फ़ाइल को पार्स करें

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

SELECT
    EventXml.value('(@timestamp)[1]', 'datetime2') AS [timestamp],
    EventXml.value('(action[@name="username"]/value)[1]', 'nvarchar(256)') AS username,
    EventXml.value('(action[@name="database_name"]/value)[1]', 'nvarchar(128)') AS database_name,
    EventXml.value('(action[@name="sql_text"]/value)[1]', 'varchar(4000)') AS sql_text,
    EventXml.value('(@name)[1]', 'varchar(50)') AS event_name,
    EventXml.value('(data[@name="feature"]/value)[1]', 'varchar(255)') AS feature,
    EventXml.value('(data[@name="message"]/value)[1]', 'varchar(max)') AS message
FROM (SELECT CAST(event_data AS XML) AS XmlEventData
    FROM sys.fn_xe_file_target_read_file (
        '/var/opt/mssql/tmp/DeprecationEvents*.xel', 
        null, 
        null, 
        null
    )) AS EventTable
CROSS APPLY EventTable.XmlEventData.nodes('event') AS q(EventXml);

परिणाम (ऊर्ध्वाधर आउटपुट का उपयोग करके):

timestamp     | 2019-10-31 04:03:06.5280000
username      | sa
database_name | Test
sql_text      | SELECT * FROM sys.sql_dependencies;
event_name    | deprecation_announcement
feature       | sql_dependencies
message       | sql_dependencies will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.

क्षैतिज रूप से स्क्रॉल किए बिना इसे पढ़ना आसान बनाने के लिए मैं यहां लंबवत आउटपुट का उपयोग कर रहा हूं। इसका अर्थ है कि स्तंभ शीर्षक बाईं ओर हैं, और डेटा दाईं ओर है। यदि आप इसे SSMS या Azure डेटा स्टूडियो जैसे GUI का उपयोग करके चलाते हैं, तो संभवतः आप इसे सामान्य तालिका ग्रिड प्रारूप में देखेंगे (जब तक कि आपने अन्यथा निर्दिष्ट न किया हो)।

एक बहिष्कृत सुविधा के लिए एक से अधिक पंक्तियाँ?

आपकी XEL फ़ाइल को कभी-कभी एक ईवेंट के लिए कई प्रविष्टियाँ मिल सकती हैं। उदाहरण के लिए, आप केवल एक बार बहिष्कृत संग्रहीत कार्यविधि को निष्पादित करते हैं, केवल यह पता लगाने के लिए कि उस एकल कथन के लिए आपकी XEL फ़ाइल से 10 या 11 पंक्तियाँ वापस आती हैं।

यहां एक उदाहरण दिया गया है:

USE Music;
EXEC sp_depends @objname = 'Artists';

sp_depends सिस्टम संग्रहीत प्रक्रिया बहिष्कृत है, इसलिए मैं निश्चित रूप से इसके लिए एक पंक्ति देखने की अपेक्षा करता हूं। अगर मैं इसे अभी निष्पादित करता हूं, तो मैं कुल मिलाकर 2 पंक्तियों के साथ समाप्त होने की उम्मीद कर सकता हूं:1 पिछले उदाहरण के लिए, और 1 इस उदाहरण के लिए।

लेकिन जैसा कि यह पता चला है, मेरी XEL फ़ाइल में 11 और पंक्तियाँ जोड़ी गई हैं:

SELECT
    EventXml.value('(@timestamp)[1]', 'datetime2') AS [timestamp],
    EventXml.value('(action[@name="username"]/value)[1]', 'nvarchar(256)') AS username,
    EventXml.value('(action[@name="database_name"]/value)[1]', 'nvarchar(128)') AS database_name,
    EventXml.value('(action[@name="sql_text"]/value)[1]', 'varchar(4000)') AS sql_text,
    EventXml.value('(@name)[1]', 'varchar(50)') AS event_name,
    EventXml.value('(data[@name="feature"]/value)[1]', 'varchar(255)') AS feature,
    EventXml.value('(data[@name="message"]/value)[1]', 'varchar(max)') AS message
FROM (SELECT CAST(event_data AS XML) AS XmlEventData
    FROM sys.fn_xe_file_target_read_file (
        '/var/opt/mssql/tmp/DeprecationEvents*.xel', 
        null, 
        null, 
        null
    )) AS EventTable
CROSS APPLY EventTable.XmlEventData.nodes('event') AS q(EventXml)
ORDER BY [Timestamp] ASC;

परिणाम (ऊर्ध्वाधर आउटपुट का उपयोग करके):

-[ RECORD 1 ]-------------------------
timestamp     | 2019-10-31 04:03:06.5280000
username      | sa
database_name | Test
sql_text      | SELECT * FROM sys.sql_dependencies;
event_name    | deprecation_announcement
feature       | sql_dependencies
message       | sql_dependencies will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
-[ RECORD 2 ]-------------------------
timestamp     | 2019-10-31 04:15:13.9920000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_announcement
feature       | sp_depends
message       | sp_depends will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
-[ RECORD 3 ]-------------------------
timestamp     | 2019-10-31 04:15:13.9940000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | String literals as column aliases
message       | The ability to use string literals as column aliases will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that 
-[ RECORD 4 ]-------------------------
timestamp     | 2019-10-31 04:15:13.9950000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | String literals as column aliases
message       | The ability to use string literals as column aliases will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that 
-[ RECORD 5 ]-------------------------
timestamp     | 2019-10-31 04:15:13.9950000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | String literals as column aliases
message       | The ability to use string literals as column aliases will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that 
-[ RECORD 6 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0020000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_announcement
feature       | sql_dependencies
message       | sql_dependencies will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
-[ RECORD 7 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0100000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_announcement
feature       | sql_dependencies
message       | sql_dependencies will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
-[ RECORD 8 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0100000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_announcement
feature       | sql_dependencies
message       | sql_dependencies will be removed in a future version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
-[ RECORD 9 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0120000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | sysdepends
message       | sysdepends will be removed in the next version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
-[ RECORD 10 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0260000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | sysdepends
message       | sysdepends will be removed in the next version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
-[ RECORD 11 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0760000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | sysdepends
message       | sysdepends will be removed in the next version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
-[ RECORD 12 ]-------------------------
timestamp     | 2019-10-31 04:15:14.0800000
username      | sa
database_name | Music
sql_text      | USE Music;
EXEC sp_depends @objname = 'Artists';
event_name    | deprecation_final_support
feature       | sysdepends
message       | sysdepends will be removed in the next version of SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use it.
(12 rows affected)

यहाँ क्या हो रहा है?

ऐसा इसलिए हो रहा है क्योंकि sp_depends सिस्टम संग्रहीत कार्यविधि स्वयं बहिष्कृत सुविधाओं का उपयोग करती है।

न केवल मुझे sp_depends executing निष्पादित करने के लिए 1 पंक्ति मिलती है . मुझे उस संग्रहीत प्रक्रिया द्वारा उपयोग की जाने वाली प्रत्येक बहिष्कृत सुविधा के लिए 1 पंक्ति भी मिलती है (चाहे वह संग्रहीत प्रक्रिया में हो, या किसी अन्य ऑब्जेक्ट में जिसका संदर्भ हो)। इस मामले में मुझे 10 अतिरिक्त पंक्तियाँ मिलती हैं।

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

प्रत्येक बहिष्कृत विशेषता के बारे में अधिक विवरण

प्रत्येक पदावनत आइटम से निपटने के तरीके के बारे में अनुशंसाओं के लिए Microsoft का आलेख SQL Server 2017 में बहिष्कृत डेटाबेस इंजन सुविधाएँ देखें। वह सूची बिल्कुल SQL सर्वर 2016 के समान है।

Microsoft दस्तावेज़ीकरण संदर्भ

  • त्वरित प्रारंभ:SQL सर्वर में विस्तारित ईवेंट
  • ईवेंट सत्र बनाएं
  • ईवेंट सत्र बदलें
  • sys.fn_xe_file_target_read_file
  • इवेंट डेटा 101 पढ़ना:XML के साथ क्या हो रहा है?

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर (T-SQL) में कॉलम का डेटा प्रकार कैसे बदलें

  2. विभाजन स्विचिंग का उपयोग करके कम रुकावट के साथ SQL सर्वर तालिकाओं को ताज़ा करना

  3. एकल कॉलम मानों को एकाधिक कॉलम मानों में कैसे विभाजित करें?

  4. SQL सर्वर में COUNT () बनाम COUNT_BIG ():क्या अंतर है?

  5. SQL सर्वर 2008 में फ़ंक्शन mysql में GREATEST के समान है?