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?