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!