Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Sử dụng sự kiện mở rộng để ghi nhật ký Các tính năng không được dùng nữa đang được sử dụng trong phiên bản máy chủ SQL (Ví dụ T-SQL)

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

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?

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Stuff và 'For Xml Path' hoạt động như thế nào trong SQL Server?

  2. Làm cách nào để chỉnh sửa nhanh các giá trị trong bảng trong SQL Server Management Studio?

  3. Cách sp_describe_first_result_set hoạt động trong SQL Server

  4. Thực thi sp_msforeachdb trong ứng dụng Java

  5. Tại sao lại sử dụng mệnh đề INCLUDE khi tạo chỉ mục?