Kami memiliki server database SQL Server 2008 (kebetulan berjalan di bawah MS Failover Clustering, tapi saya tidak berpikir itu relevan di sini).
Aplikasi kami menjalankan Hibernate untuk akses DB, dan karena kami meningkatkan baru-baru ini dari v3.1 ke 3.6, kami telah mengalami SQL Server crashing secara teratur (setiap 24-48 jam, tetapi kadang-kadang lebih sering).
Masalah spesifik yang dimaksud tampaknya terkait dengan memori. Tepat sebelum server crash (dan kemudian restart secara otomatis oleh failover cluster manager), kami mendapatkan banyak kesalahan ini:
Error: 701, Severity: 17, State: 130.
There is insufficient system memory in resource pool 'internal' to run this query.
juga pesan sesekali (tetapi reguler) dari
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.
Kesalahan: 17312, Tingkat Permasalahan: 16, Negara: 1. (Params :). Kesalahan dicetak dalam mode singkat karena ada kesalahan selama pemformatan. Tracing, ETW, notifikasi dll dilewati.
Saya juga mendapatkan beberapa kesalahan tingkat aplikasi seperti
java.sql.SQLException: A time out occurred while waiting to optimize the query. Rerun the query.
dan kemudian kesalahan yang menarik dan mungkin bersifat instruktif:
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.
Beban di server tidak berubah sehingga tidak ada alasan sekarang seharusnya kehabisan memori ketika sebelumnya tidak menunjukkan masalah dengan permintaan yang dikirim ke sana.
Sekarang untuk pertanyaan - bagaimana cara melacak kueri yang menyebabkan kesalahan ini (dan dengan demikian mungkin semua masalah)? Sepertinya sejak upgrade Hibernate kami, telah meluncurkan beberapa pertanyaan besar di SQL Server, dan itu rusak. Ketika itu terjadi, saya memiliki beberapa ide tentang apa yang mungkin terjadi, tetapi akan baik untuk dapat melacaknya.
Saya tentu saja dapat menjalankan profiler SQL Server, tetapi setelah ini dilakukan (dan menghasilkan sejumlah besar data - ini adalah database OLTP yang sibuk), bagaimana cara saya memfilter untuk menemukan pertanyaan yang bermasalah?
Terima kasih!
sumber
Jawaban:
Ikuti langkah-langkah yang dijelaskan di Cara menggunakan
DBCC MEMORYSTATUS
perintah untuk memantau penggunaan memori pada SQL Server . Tindakan pemulihan akan tergantung pada temuan Anda. Anda juga dapat membaca Cara Mengidentifikasi Kemacetan Memori Microsoft SQL Server yang lebih mudah diakses.Satu kata peringatan: tidak mungkin Anda akan menemukan pertanyaan individu untuk disalahkan. Melacak masalah memori lebih halus dari itu. Perlu diingat bahwa saat Anda kehabisan sumber daya dan kueri melempar kesalahan kehabisan memori, mungkin kueri yang melempar kesalahan hanyalah korban , bukan pelakunya.
sumber
Sepertinya Anda ingin pergi untuk
Extended Events
konfigurasi menggunakan acaraquery_memory_grant_xxxxx
.Ini adalah pilihan terbaik bagi Anda untuk mencatat informasi dan menyimpan SQL Engine ukuran luar yang dapat Anda baca kapan saja (Anda juga dapat menonton data langsung), informasi yang disimpan tidak akan terhapus ketika server restart terjadi tidak seperti
DMVs
Langkah-langkah pengaturan cepat ..
sumber