Ghi nhật ký truy vấn và T-SQL khác


14

Tôi muốn biết nếu SQL Server 2008 R2 có sơ đồ ghi nhật ký mặc định cho các SELECTcâu lệnh (hoặc bất kỳ T-SQL nào khác cho vấn đề đó).

Nếu có, tôi có thể thấy nó ở đâu? Nếu không, làm thế nào tôi có thể thiết lập nó?

Câu trả lời:


18

Theo mặc định, hoạt động của SQL Server không được ghi lại theo cách bạn mong đợi. Một số hoạt động ghi được ghi lại trong Nhật ký giao dịch , nhưng điều này cũng phụ thuộc vào cách cơ sở dữ liệu của bạn được thiết lập.

Có bốn tùy chọn chính để theo dõi hoạt động CHỌN trên máy chủ:

  1. Bạn có thể sử dụng SQL Server Profiler để kết nối với máy chủ của mình và theo dõi hoạt động cụ thể khi nó xảy ra.

  2. Bạn có thể tạo theo dõi phía máy chủ để ghi nhật ký hoạt động vào tệp theo dõi trên máy chủ, sau đó có thể được đọc bởi SQL Server Profiler hoặc bằng cách sử dụng fn_trace_gitable để tải nó vào bảng để phân tích thêm.

  3. Bạn có thể sử dụng Sự kiện mở rộng , cung cấp nhiều chức năng hơn dấu vết phía máy chủ và Microsoft khuyên dùng thay vì dấu vết phía máy chủ bắt đầu với SQL Server 2012.

  4. Bạn có thể sử dụng chế độ kiểm toán C2 .

Bạn có thể sử dụng SQL Server Profiler để thiết lập theo dõi của mình (chọn các sự kiện, bộ lọc cụ thể, v.v. mà bạn muốn), sau đó viết kịch bản ra bằng menu Tệp và thực hiện trên máy chủ để tạo theo dõi phía máy chủ, như được mô tả ở đây .


5

Có một số giải pháp và kỹ thuật SQL Server để theo dõi các câu lệnh CHỌN

  1. Các thủ tục và hàm được lưu trữ được phát triển đặc biệt - Lưu ý: phương pháp này đòi hỏi kiến ​​thức nâng cao về lập trình T-SQL và duy trì bổ sung các thủ tục và hàm được lưu trữ (ví dụ trong trường hợp thay đổi lược đồ cơ sở dữ liệu). Bạn có thể xem thêm trong bài viết này: http://alstechtips.blogspot.com/2011/02/auditing-select-statements-in-sql.html

  2. Công nghệ theo dõi SQL Server - bạn có thể đọc hướng dẫn từng bước trong bài viết này: http://solutioncenter.apexsql.com/auditing-select-statements-on-sql-server/

  3. Sử dụng tính năng Kiểm toán máy chủ SQL - Tính năng Kiểm toán (được giới thiệu trong SQL Server 2008) có thể theo dõi cả sự kiện máy chủ và cơ sở dữ liệu và đang sử dụng công nghệ Sự kiện mở rộng. Nhưng, kiểm toán mức cơ sở dữ liệu chỉ được hỗ trợ bởi các phiên bản SQL Server Developer và Enterprise.

  4. Sử dụng các công cụ của bên thứ 3 như ApexSQL Audit hoặc Idera SQL tuân thủ


3

Theo mặc định, nó không ghi lại các câu lệnh CHỌN. Bạn có thể tham khảo câu trả lời của tôi ở đây để biết thêm chi tiết để kiểm toán các câu lệnh CHỌN.

Ngoài ra, theo mặc định, nó thậm chí không ghi nhật ký các câu lệnh T-SQL, thay vào đó, nó ghi nhật ký SỰ KIỆN như Thay đổi bộ nhớ máy chủ, Đăng nhập kiểm toán không thành công, Sự kiện Addlogin kiểm toán, v.v. và bạn có thể tìm thêm thông tin ở đây cùng với Tập lệnh T-SQL để trích xuất thông tin từ Theo dõi mặc định.


3

Miễn là bạn không quan tâm ai đã chạy các truy vấn, có một số cách để xem số liệu về các truy vấn đang được chạy trong hệ thống của bạn. Điều này bị giới hạn đối với dữ liệu kể từ lần khởi động lại cuối cùng và có khả năng do áp lực của bộ nhớ cache (hoặc bộ nhớ khác) tùy thuộc vào mức độ bạn mở rộng truy vấn.

;WITH x AS
(
  SELECT 
    [text] = SUBSTRING(t.[text], 
      (s.statement_start_offset/2)+1, 
      COALESCE(NULLIF(s.statement_end_offset,-1),DATALENGTH(t.[text])*2)
       -(s.statement_start_offset/2)), 
    s.execution_count, s.last_execution_time,
    s.max_logical_reads, s.max_elapsed_time
  FROM sys.dm_exec_query_stats AS s
  CROSS APPLY sys.dm_exec_sql_text(s.sql_handle) AS t
)
SELECT * FROM x
WHERE LTRIM([text]) LIKE 'SELECT%';

Bạn có thể muốn mở rộng mẫu - ví dụ: điều này sẽ bỏ qua các truy vấn bắt đầu bằng ;WITH, trớ trêu thay, và có thể nắm bắt SELECT INTOvà thậm chí các phép gán biến không tham chiếu các bảng thực tế.

Tuy nhiên, nếu bạn cần nhiều thông tin chi tiết hơn thế, câu trả lời của Nathan là một khởi đầu tốt (trừ khi bạn sẽ sử dụng dấu vết, KHÔNG sử dụng Profiler). Chỉ cần nhớ rằng đăng nhập mọi truy vấn duy nhất đối với hệ thống của bạn sẽ không được miễn phí.


Tôi đồng ý với tuyên bố trên Tôi sẽ cực kỳ thận trọng khi theo dõi tất cả các tuyên bố chọn trong cơ sở dữ liệu của bạn.
Zane

Tôi đã thử giải pháp của bạn - có thể điều này chỉ cung cấp các Quy trình, Hàm và Kích hoạt và không có câu lệnh sql nào được thực hiện bởi adhoc?
Magier

@Magier Không, sys.dm_exec_query_stats chỉ nên báo cáo về các câu lệnh truy vấn (ad hoc hoặc từ một mô-đun).
Aaron Bertrand
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.