sql >> Databáze >  >> RDS >> Sqlserver

Použití rozšířených událostí k protokolování zastaralých funkcí používaných v instanci serveru SQL (příklad T-SQL)

Rozšířené události je odlehčený systém sledování výkonu, který uživatelům umožňuje shromažďovat data potřebná k monitorování a odstraňování problémů na serveru SQL Server.

Tento článek ukazuje, jak lze rozšířené události použít k vytvoření souboru protokolu, který obsahuje všechny zastaralé funkce, které jsou stále používány v instanci serveru SQL Server. Protokol zaznamenává všechny výskyty od zahájení relace události.

Pokud chcete jen rychle spočítat, kolikrát byla zastaralá funkce použita od spuštění SQL Serveru, přečtěte si článek Nejrychlejší způsob, jak najít zastaralé funkce, které se stále používají v instanci SQL Server.

Ale pokud potřebujete podrobnější protokol, který obsahuje věci jako; použitý příkaz SQL, který obsahuje zastaralou funkci, databázi, se kterou byl spuštěn, uživatel, který jej spustil, čas jeho spuštění atd., čtěte dále.

Vytvořte rozšířenou relaci události

Prvním krokem je vytvoření rozšířené relace události. Zde specifikujeme zdroj událostí, cíl relace události a možnosti relace události.

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
    );

V tomto případě zadávám cíl /var/opt/mssql/tmp/DeprecationEvents.xel . To znamená, že data události budou uložena v tomto souboru. Můžete zadat libovolný název souboru a cestu.

Tento příklad používá cestu k souboru Linux, která používá lomítka. Pokud používáte Windows, budete muset použít zpětná lomítka. Například:C:\Temp\DeprecationEvents.xel .

Spusťte relaci rozšířené události

Vytvořením relace události se nespustí. Použijte ALTER EVENT SESSION zastavit a spustit. V tomto případě jej chceme spustit:

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

Udělejte něco, co není podporováno

Nyní, když jsme zahájili rozšířenou relaci události, spustíme nějaký zastaralý kód:

SELECT * FROM sys.sql_dependencies;

Protože sys.sql_dependencies je zastaralý, tento kód přidá data do souboru XEL, který jsme určili dříve.

Zobrazit soubor XEL

Nyní, když jsme (pravděpodobně) přidali data do našeho souboru XEL, pojďme se na to podívat:

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

Výsledek:

<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>

V tomto případě jsem vrátil pouze event_data , protože tam jsou uložena všechna data událostí.

Bohužel to pro nás lidi není nejjednodušší číst.

Co když jej naformátuji?

<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>

Je o něco snazší číst, když je naformátován, ale můžeme to udělat lépe.

Analyzovat soubor XEL

V tomto příkladu analyzuji soubor XEL, abych mohl vidět data v mřížce, stejně jako jakýkoli jiný databázový dotaz.

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);

Výsledek (při použití vertikálního výstupu):

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.

Používám zde vertikální výstup, abych usnadnil čtení, aniž byste museli posouvat vodorovně. To znamená, že záhlaví sloupců jsou vlevo a data vpravo. Pokud to spustíte pomocí GUI, jako je SSMS nebo Azure Data Studio, pravděpodobně to uvidíte v obvyklém formátu mřížky tabulky (pokud neurčíte jinak).

Více řádků pro jednu nepodporovanou funkci?

Váš soubor XEL může někdy získat více záznamů pro jednu událost. Například jednou provedete jednu zastaralou uloženou proceduru, abyste zjistili, že z vašeho souboru XEL je pro tento jediný příkaz vráceno 10 nebo 11 řádků.

Zde je příklad:

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

sp_depends systémová uložená procedura je zastaralá, takže bych určitě očekával, že za to uvidím řádek. Pokud to provedu právě teď, mohl bych očekávat, že budu mít celkem 2 řádky:1 pro předchozí příklad a 1 pro tento příklad.

Ale jak se ukázalo, do mého souboru XEL bylo přidáno 11 dalších řádků:

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;

Výsledek (při použití vertikálního výstupu):

-[ 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)

Co se tady děje?

To se děje, protože sp_depends samotná systémová uložená procedura používá zastaralé funkce.

Nejenže dostanu 1 řádek za provedení sp_depends . Dostávám také 1 řádek pro každou zastaralou funkci, kterou tato uložená procedura používá (ať už je to v uložené proceduře nebo v jiném objektu, na který odkazuje). V tomto případě dostanu 10 řádků navíc.

Rychle jsem se podíval na sp_depends 's definice a viděl jsem, že odkazuje na (zastaralou) sysdepends na několika místech a tento pohled odkazuje (zastaralé) sql_dependencies . Také jsem viděl, že používá řetězcové literály jako aliasy sloupců, což je praxe, která je také označena jako zastaralá. To vše podporuje to, co vidím v souboru XEL.

Další podrobnosti o každé zastarané funkci

Doporučení, jak se vypořádat s každou zastaralou položkou, najdete v článku Microsoftu Zastaralé funkce databázového stroje v SQL Server 2017. Tento seznam je přesně stejný jako seznam pro SQL Server 2016.

Příručka k dokumentaci Microsoft

  • Rychlý start:Rozšířené události na serveru SQL Server
  • VYTVOŘIT RELACI UDÁLOSTI
  • ZMĚNIT RELACI UDÁLOSTI
  • sys.fn_xe_file_target_read_file
  • Čtení dat události 101:Co se děje s XML?

  1. Jak používat array_agg() pro varchar[]

  2. Migrace databází do Azure SQL Database

  3. Jak uložit datum a čas v MySQL s informacemi o časovém pásmu

  4. Jak uložit adresářovou/hierarchii/stromovou strukturu do databáze?