Cách theo dõi các truy vấn SQL đang gặp sự cố SQL Server


9

Chúng tôi có một máy chủ cơ sở dữ liệu SQL Server 2008 (nó đang chạy trong MS Failover Clustering, nhưng tôi không nghĩ rằng điều đó có liên quan ở đây).

Ứng dụng của chúng tôi chạy Hibernate để truy cập DB và vì chúng tôi đã nâng cấp gần đây từ phiên bản 3.1 lên 3.6, chúng tôi đã gặp sự cố máy chủ SQL thường xuyên (cứ sau 24-48 giờ, nhưng đôi khi thường xuyên hơn).

Vấn đề cụ thể trong câu hỏi dường như có liên quan đến bộ nhớ. Ngay trước khi máy chủ gặp sự cố (và sau đó được tự động khởi động lại bởi trình quản lý cụm chuyển đổi dự phòng), chúng tôi nhận được vô số lỗi sau:

Error: 701, Severity: 17, State: 130.
There is insufficient system memory in resource pool 'internal' to run this query.

cũng thỉnh thoảng (nhưng thường xuyên) tin nhắn của

Error: 17300, Severity: 16, State: 1. (Params:). The error is printed in terse mode because there was error during formatting. Tracing, ETW, notifications etc are skipped.

Lỗi: 17312, Mức độ nghiêm trọng: 16, Bang: 1. (Params :). Lỗi được in ở chế độ terse vì có lỗi trong quá trình định dạng. Truy tìm, ETW, thông báo vv được bỏ qua.

Tôi cũng nhận được một số lỗi cấp độ ứng dụng như

java.sql.SQLException: A time out occurred while waiting to optimize the query. Rerun the query.

và sau đó là lỗi thú vị và có thể là hướng dẫn:

The query processor ran out of internal resources and could not produce a query plan. 
This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. 
Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.

Tải trên máy chủ đã không thay đổi, vì vậy không có lý do gì mà nó sẽ hết bộ nhớ khi trước đó không có vấn đề gì với các truy vấn được gửi đến nó.

Bây giờ đến câu hỏi - làm cách nào để theo dõi các truy vấn gây ra lỗi này (và do đó có lẽ là tất cả các vấn đề)? Có vẻ như kể từ khi nâng cấp Hibernate của chúng tôi, nó đã thực hiện một số truy vấn lớn tại SQL Server và điều đó đã phá vỡ nó. Khi điều đó xảy ra, tôi có một số ý tưởng về những gì chúng có thể là, nhưng thật tốt khi có thể theo dõi chúng.

Tất nhiên tôi có thể chạy trình biên dịch SQL Server, nhưng một khi điều này được thực hiện (và tạo ra một lượng dữ liệu khổng lồ - đó là cơ sở dữ liệu OLTP bận rộn), làm cách nào để lọc các truy vấn có vấn đề?

Cảm ơn!


1
Có phải mọi thứ đang chạy trên cùng một máy chủ? Có nghĩa là máy chủ ứng dụng, với java, cũng đang chạy trên máy chủ cơ sở dữ liệu?
swasheck

1
Liên kết với câu hỏi của @ swasheck: Bạn có bộ giá trị rõ ràng cho bộ nhớ tối đa SQL Server không? Bạn đã loại trừ áp lực bộ nhớ ngoài?
Mike Fal

Bạn đã thử nhìn vào dấu vết hộp đen? Họ có thể chỉ cho bạn đi đúng hướng.
datagod

Tôi chỉ nhấn vào điều này và dấu vết tôi còn chạy đang hiển thị một cơ sở dữ liệu nhàn rỗi từ góc độ ứng dụng.
Joshua

Bạn có sử dụng bất kỳ tìm kiếm fulltext? Ngoài ra, phiên bản xây dựng chính xác không có + của máy chủ sql bạn đang chạy là gì?
Kin Shah

Câu trả lời:


5

Làm theo các bước phác thảo trong Cách sử dụng DBCC MEMORYSTATUSlệnh để theo dõi việc sử dụng bộ nhớ trên SQL Server . Các hành động khắc phục sẽ phụ thuộc vào phát hiện của bạn. Bạn cũng có thể đọc Cách xác định các nút cổ chai bộ nhớ Microsoft SQL Server dễ truy cập hơn.

Một lời cảnh báo mặc dù: không chắc là bạn sẽ tìm thấy các truy vấn riêng lẻ để đổ lỗi. Theo dõi các vấn đề bộ nhớ xuống còn tinh tế hơn thế. Hãy nhớ rằng khi bạn hết tài nguyên và truy vấn sẽ xuất hiện lỗi hết bộ nhớ thì có thể truy vấn ném lỗi đó chỉ là nạn nhân , không phải là thủ phạm.


Cảm ơn - Tôi đã xem xét những thứ đó rồi, nhưng vấn đề là máy chủ có vẻ hoạt động tốt và sau đó đột nhiên hoạt động, nó không dần hết bộ nhớ. Tôi cũng không rõ ràng về bất cứ điều gì tôi có thể tìm thấy trực tuyến về lỗi "Không đủ bộ nhớ hệ thống trong nhóm tài nguyên 'nội bộ' để chạy truy vấn này." thực sự có nghĩa là gì - nguồn tài nguyên nội bộ liên quan đến kết quả của DBCC MEMORYSTATUS là gì?

Đây có phải là một máy chủ phát triển? Nếu vậy, bạn có thể hạ cấp xuống Hibernate 3.1 để xác minh sự cố không? Bạn có hai dòng điều tra ban đầu và bạn phải cố gắng loại bỏ một trong số chúng, hoặc SQL Server có giới hạn bộ nhớ được đặt và vượt quá chúng hoặc một phần khác của hệ thống đang chiếm bộ nhớ và SQL Server đang bị nén. Hồ sơ hệ thống xung quanh thời gian xảy ra sự cố để xác định điều gì đang xảy ra.
epo

0

Có vẻ bạn muốn đi Extended Eventscấu hình bằng cách sử dụng các sự kiện query_memory_grant_xxxxx.

Đây là tùy chọn tốt nhất để bạn đăng nhập thông tin và lưu trữ SQL Engine ngoài kích thước mà bạn có thể đọc bất cứ lúc nào (bạn cũng có thể xem dữ liệu trực tiếp), thông tin được lưu trữ sẽ không bị xóa khi khởi động lại máy chủ không giống như DMVs

Các bước thiết lập nhanh ..

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.