Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Menggunakan Peristiwa yang Diperpanjang untuk Mencatat Fitur yang Tidak Digunakan Lagi dalam Instance SQL Server (Contoh T-SQL)

Acara yang diperpanjang adalah sistem pemantauan kinerja ringan yang memungkinkan pengguna mengumpulkan data yang diperlukan untuk memantau dan memecahkan masalah di SQL Server.

Artikel ini menunjukkan bagaimana peristiwa diperpanjang dapat digunakan untuk membuat file log yang berisi semua fitur usang yang masih digunakan dalam contoh SQL Server. Log mencatat semua kejadian sejak sesi acara dimulai.

Jika Anda hanya ingin menghitung dengan cepat berapa kali fitur usang telah digunakan sejak SQL Server dimulai, lihat Cara Tercepat untuk Menemukan Fitur Usang yang Masih Digunakan di Instance SQL Server.

Tetapi jika Anda membutuhkan log yang lebih rinci yang mencakup hal-hal seperti; pernyataan SQL yang digunakan yang berisi fitur usang, database yang digunakan untuk menjalankannya, pengguna yang menjalankannya, waktu dijalankan, dll, baca terus.

Buat Sesi Acara yang Diperpanjang

Langkah pertama adalah membuat sesi acara yang diperluas. Di sini, kami menentukan sumber acara, target sesi acara, dan opsi sesi acara.

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

Dalam hal ini saya menetapkan target /var/opt/mssql/tmp/DeprecationEvents.xel . Ini berarti bahwa data acara akan disimpan dalam file itu. Anda dapat menentukan nama dan jalur file apa saja.

Contoh ini menggunakan jalur file Linux, yang menggunakan garis miring. Jika Anda menggunakan Windows, Anda harus menggunakan garis miring terbalik. Misalnya:C:\Temp\DeprecationEvents.xel .

Mulai Sesi Acara yang Diperpanjang

Membuat sesi acara tidak memulainya. Gunakan ALTER EVENT SESSION untuk berhenti dan memulainya. Dalam hal ini kami ingin memulainya:

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

Lakukan Sesuatu yang Usang

Sekarang setelah kita memulai sesi acara yang diperpanjang, mari jalankan beberapa kode yang tidak digunakan lagi:

SELECT * FROM sys.sql_dependencies;

Karena sys.sql_dependencies tidak digunakan lagi, kode tersebut akan menambahkan data ke file XEL yang telah kita tentukan sebelumnya.

Melihat File XEL

Sekarang setelah kita (mungkin) menambahkan data ke file XEL, mari kita lihat:

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

Hasil:

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

Dalam hal ini, saya hanya mengembalikan event_data , karena di situlah semua data acara berada.

Sayangnya, itu bukan yang paling mudah bagi kita manusia untuk membaca.

Bagaimana jika saya memformatnya?

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

Ini sedikit lebih mudah dibaca ketika diformat, tetapi kami dapat melakukan lebih baik dari itu.

Parsing File XEL

Dalam contoh ini, saya mengurai file XEL sehingga saya dapat melihat data dalam kotak, sama seperti kueri basis data lainnya.

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

Hasil (menggunakan keluaran vertikal):

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.

Saya menggunakan output vertikal di sini agar lebih mudah dibaca tanpa harus menggulir secara horizontal. Artinya, judul kolom berada di sebelah kiri, dan data berada di sebelah kanan. Jika Anda menjalankan ini menggunakan GUI seperti SSMS atau Azure Data Studio, Anda mungkin akan melihatnya dalam format kisi tabel biasa (kecuali jika Anda menentukan sebaliknya).

Beberapa Baris untuk Satu Fitur yang Tidak Digunakan Lagi?

File XEL Anda terkadang mendapatkan beberapa entri untuk satu acara. Misalnya, Anda menjalankan satu prosedur tersimpan yang tidak digunakan lagi satu kali, hanya untuk menemukan bahwa 10 atau 11 baris dikembalikan dari file XEL Anda untuk satu pernyataan itu.

Ini contohnya:

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

sp_depends prosedur tersimpan sistem sudah usang, jadi saya pasti berharap untuk melihat baris untuk itu. Jika saya menjalankannya sekarang, saya mungkin berharap untuk mendapatkan total 2 baris:1 untuk contoh sebelumnya, dan 1 untuk contoh ini.

Tapi ternyata, 11 baris lagi ditambahkan ke file XEL saya:

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;

Hasil (menggunakan keluaran vertikal):

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

Apa yang terjadi di sini?

Ini terjadi karena sp_depends prosedur tersimpan sistem itu sendiri menggunakan fitur yang tidak digunakan lagi.

Saya tidak hanya mendapatkan 1 baris untuk mengeksekusi sp_depends . Saya juga mendapatkan 1 baris untuk setiap fitur usang yang digunakan oleh prosedur tersimpan itu (apakah itu dalam prosedur tersimpan, atau di objek lain yang dirujuknya). Dalam hal ini saya mendapatkan 10 baris tambahan.

Saya melihat sekilas sp_depends 's definisi, dan saya melihat bahwa referensi (yang usang) sysdepends di beberapa tempat, dan itu melihat referensi (tidak digunakan lagi) sql_dependencies . Saya juga melihat bahwa ia menggunakan literal string sebagai alias kolom, sebuah praktik yang juga ditandai untuk dihentikan. Semua itu mendukung apa yang saya lihat di file XEL.

Detail Lebih Lanjut tentang Setiap Fitur yang Tidak Digunakan Lagi

Lihat artikel Microsoft Deprecated Database Engine Features di SQL Server 2017 untuk rekomendasi tentang cara menangani setiap item yang tidak digunakan lagi. Daftar itu persis sama dengan yang ada untuk SQL Server 2016.

Referensi Dokumentasi Microsoft

  • Quickstart:Acara yang diperluas di SQL Server
  • BUAT SESI ACARA
  • UBAH SESI ACARA
  • sys.fn_xe_file_target_read_file
  • Membaca data peristiwa 101:Ada apa dengan 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. Kelompokkan DateTime menjadi interval 5,15,30 dan 60 menit

  2. Apa tipe data yang paling tepat untuk menyimpan alamat IP di SQL server?

  3. T-SQL:Memilih Kolom Berdasarkan MAX (Kolom Lainnya)

  4. Skema basis data, peningkatan otomatis

  5. Menyebarkan Grup Ketersediaan SQL Server AlwaysOn di Linux