Sự kiện mở rộng là một hệ thống giám sát hiệu suất nhẹ cho phép người dùng thu thập dữ liệu cần thiết để theo dõi và khắc phục sự cố trong SQL Server.
Bài viết này trình bày cách các sự kiện mở rộng có thể được sử dụng để tạo tệp nhật ký chứa tất cả các tính năng không dùng nữa vẫn đang được sử dụng trong phiên bản của SQL Server. Nhật ký ghi lại tất cả các lần xuất hiện kể từ khi phiên sự kiện được bắt đầu.
Nếu bạn chỉ muốn đếm nhanh số lần tính năng không dùng nữa đã được sử dụng kể từ khi khởi động SQL Server, hãy xem Cách nhanh nhất để tìm các tính năng không dùng nữa vẫn được sử dụng trong phiên bản SQL Server.
Nhưng nếu bạn cần một nhật ký chi tiết hơn bao gồm những thứ như; câu lệnh SQL được sử dụng có chứa tính năng không dùng nữa, cơ sở dữ liệu mà nó được chạy chống lại, người dùng đã chạy nó, thời gian nó được chạy, v.v., hãy đọc tiếp.
Tạo phiên sự kiện mở rộng
Bước đầu tiên là tạo phiên sự kiện mở rộng. Tại đây, chúng tôi chỉ định nguồn của các sự kiện, mục tiêu phiên sự kiện và các tùy chọn phiên sự kiện.
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 );
Trong trường hợp này, tôi chỉ định mục tiêu là /var/opt/mssql/tmp/DeprecationEvents.xel
. Điều này có nghĩa là dữ liệu sự kiện sẽ được lưu trữ trong tệp đó. Bạn có thể chỉ định bất kỳ tên và đường dẫn tệp nào.
Ví dụ này sử dụng đường dẫn tệp Linux, sử dụng dấu gạch chéo lên phía trước. Nếu đang sử dụng Windows, bạn cần sử dụng dấu gạch chéo ngược. Ví dụ:C:\Temp\DeprecationEvents.xel
.
Bắt đầu Phiên sự kiện mở rộng
Việc tạo phiên sự kiện không bắt đầu nó. Sử dụng ALTER EVENT SESSION
để dừng lại và bắt đầu nó. Trong trường hợp này, chúng tôi muốn bắt đầu nó:
ALTER EVENT SESSION [Deprecation Events] ON SERVER STATE = START;
Làm điều gì đó không được chấp nhận
Bây giờ chúng ta đã bắt đầu phiên sự kiện mở rộng, hãy chạy một số mã không dùng nữa:
SELECT * FROM sys.sql_dependencies;
Bởi vì sys.sql_dependencies
không được dùng nữa, mã đó sẽ thêm dữ liệu vào tệp XEL mà chúng tôi đã chỉ định trước đó.
Xem tệp XEL
Bây giờ chúng tôi (có lẽ) đã thêm dữ liệu vào tệp XEL của mình, hãy cùng xem xét nó:
SELECT event_data FROM sys.fn_xe_file_target_read_file ( '/var/opt/mssql/tmp/DeprecationEvents*.xel', null, null, null );
Kết quả:
<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>
Trong trường hợp này, tôi chỉ trả lại event_data
, vì đó là nơi chứa tất cả dữ liệu sự kiện.
Thật không may, nó không phải là thứ dễ đọc nhất đối với con người chúng ta.
Nếu tôi định dạng nó thì sao?
<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>
Nó hơi dễ đọc hơn khi nó được định dạng, nhưng chúng tôi có thể làm tốt hơn thế.
Phân tích cú pháp tệp XEL
Trong ví dụ này, tôi phân tích cú pháp tệp XEL để tôi có thể xem dữ liệu trong lưới, giống như bất kỳ truy vấn cơ sở dữ liệu nào khác.
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);
Kết quả (sử dụng đầu ra dọc):
dấu thời giantimestamp | 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.
Tôi đang sử dụng đầu ra theo chiều dọc ở đây để giúp bạn đọc dễ dàng hơn mà không cần phải cuộn theo chiều ngang. Điều này có nghĩa là tiêu đề cột ở bên trái và dữ liệu ở bên phải. Nếu bạn chạy điều này bằng GUI như SSMS hoặc Azure Data Studio, bạn có thể sẽ thấy nó ở định dạng lưới bảng thông thường (trừ khi bạn đã chỉ định khác).
Nhiều hàng cho một tính năng không được dùng nữa?
Tệp XEL của bạn đôi khi có thể nhận được nhiều mục nhập cho một sự kiện. Ví dụ:bạn thực thi một thủ tục được lưu trữ không dùng nữa một lần, chỉ để thấy rằng 10 hoặc 11 hàng được trả về từ tệp XEL của bạn cho một câu lệnh duy nhất đó.
Đây là một ví dụ:
USE Music; EXEC sp_depends @objname = 'Artists';
sp_depends
thủ tục lưu trữ hệ thống không được dùng nữa, vì vậy tôi chắc chắn sẽ mong đợi thấy một hàng cho điều đó. Nếu tôi thực hiện điều đó ngay bây giờ, tôi có thể kết thúc với tổng cộng 2 hàng:1 cho ví dụ trước và 1 cho ví dụ này.
Nhưng hóa ra, 11 hàng khác được thêm vào tệp XEL của tôi:
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;
Kết quả (sử dụng đầu ra dọc):
-[ 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)
Chuyện gì đang xảy ra ở đây?
Điều này đang xảy ra do sp_depends
bản thân thủ tục được lưu trữ hệ thống sử dụng các tính năng không dùng nữa.
Tôi không chỉ nhận được 1 hàng để thực thi sp_depends
. Tôi cũng nhận được 1 hàng cho mọi tính năng không dùng nữa được sử dụng bởi thủ tục được lưu trữ đó (cho dù đó là trong thủ tục được lưu trữ hay trong một đối tượng khác mà nó tham chiếu). Trong trường hợp này, tôi nhận được thêm 10 hàng.
Tôi đã xem nhanh sp_depends
Định nghĩa của ‘và tôi thấy rằng nó tham chiếu đến sysdepends
(không được dùng nữa) ở một số nơi và chế độ xem đó tham chiếu (không dùng nữa) sql_dependencies
. Tôi cũng thấy rằng nó sử dụng các ký tự chuỗi làm bí danh cột, một phương pháp cũng được đánh dấu là không dùng nữa. Tất cả những điều đó hỗ trợ những gì tôi thấy trong tệp XEL.
Xem thêm chi tiết về từng tính năng không dùng nữa
Xem bài viết của Microsoft Các tính năng của công cụ cơ sở dữ liệu không được chấp nhận trong SQL Server 2017 để biết các đề xuất về cách xử lý từng mục không dùng nữa. Danh sách đó hoàn toàn giống với danh sách dành cho SQL Server 2016.
Tham chiếu Tài liệu Microsoft
- Khởi động nhanh:Các sự kiện mở rộng trong SQL Server
- TẠO PHIÊN BẢN SỰ KIỆN
- PHIÊN BẢN SỰ KIỆN THAY THẾ
- sys.fn_xe_file_target_read_file
- Đọc dữ liệu sự kiện 101:Có vấn đề gì với XML?