sql >> データベース >  >> RDS >> Sqlserver

拡張イベントを使用して、SQL Serverインスタンスで使用されている廃止された機能をログに記録する(T-SQLの例)

    拡張イベント は、SQLServerの問題の監視とトラブルシューティングに必要なデータをユーザーが収集できるようにする軽量のパフォーマンス監視システムです。

    この記事では、拡張イベントを使用して、SQLServerのインスタンスでまだ使用されているすべての廃止された機能を含むログファイルを作成する方法について説明します。ログには、イベントセッションが開始されてからのすべての発生が記録されます。

    SQL Serverが起動してから非推奨の機能が使用された回数をすばやくカウントしたい場合は、SQLServerインスタンスでまだ使用されている非推奨の機能を見つける最も簡単な方法を参照してください。

    ただし、次のようなものを含むより詳細なログが必要な場合。非推奨の機能、実行されたデータベース、実行されたユーザー、実行された時刻などを含む、使用された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ファイルパスを使用しています。 Windowsを使用している場合は、円記号を使用する必要があります。例: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のみを返しました 、それはすべてのイベントデータが存在する場所だからです。

    残念ながら、私たち人間が読むのは最も簡単ではありません。

    フォーマットするとどうなりますか?

    <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ファイルを解析する

    この例では、他のデータベースクエリと同じように、グリッド内のデータを表示できるように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やAzureDataStudioなどのGUIを使用してこれを実行すると、通常のテーブルグリッド形式で表示される可能性があります(特に指定がない限り)。

    単一の非推奨機能の複数の行?

    XELファイルは、1つのイベントに対して複数のエントリを取得する場合があります。たとえば、廃止された単一のストアドプロシージャを一度実行すると、その単一のステートメントに対してXELファイルから10行または11行が返されることがわかります。

    次に例を示します:

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

    sp_depends システムストアドプロシージャは非推奨になっているので、その行が表示されることは間違いありません。今すぐ実行すると、前の例では1行、この例では1行の合計2行になると予想される場合があります。

    しかし、結局のところ、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を実行するために1行を取得するだけではありません 。また、そのストアドプロシージャで使用される廃止された機能ごとに1行を取得します(ストアドプロシージャにあるか、それが参照する別のオブジェクトにあるかは関係ありません)。この場合、10行余分に取得します。

    sp_dependsをざっと見てみました の定義であり、(非推奨の)sysdependsを参照していることがわかりました。 いくつかの場所で、そのビュー参照(非推奨)sql_dependencies 。また、文字列リテラルを列エイリアスとして使用していることもわかりました。これは、非推奨としてマークされている方法です。これらはすべて、XELファイルに表示されている内容をサポートしています。

    廃止された各機能の詳細

    非推奨の各アイテムの処理方法に関する推奨事項については、Microsoftの記事「SQLServer2017の非推奨のデータベースエンジン機能」を参照してください。このリストは、SQLServer2016のリストとまったく同じです。

    Microsoftドキュメントリファレンス

    • クイックスタート:SQLServerの拡張イベント
    • イベントセッションを作成する
    • 後のイベントセッション
    • sys.fn_xe_file_target_read_file
    • イベントデータの読み取り101:XMLはどうなっていますか?

    1. PostgreSQL-IN句のパラメータの最大数?

    2. MySQLでデータベースを作成する方法

    3. SQLServer2017でのCLRの厳格なセキュリティ

    4. DjangoとCeleryを使用した非同期タスク