วิธีการติดตามแบบสอบถาม SQL ที่ crashing SQL Server


9

เรามีเซิร์ฟเวอร์ฐานข้อมูล SQL Server 2008 (เกิดขึ้นกับการทำงานภายใต้ MS Failover Clustering แต่ฉันไม่คิดว่าเกี่ยวข้องกับที่นี่)

แอปพลิเคชันของเรารัน Hibernate สำหรับการเข้าถึงฐานข้อมูลและเนื่องจากเราอัปเกรดเมื่อเร็ว ๆ นี้จาก v3.1 เป็น 3.6 เราพบ SQL Server หยุดทำงานเป็นประจำ (ทุก ๆ 24-48 ชั่วโมง แต่บางครั้งก็บ่อยกว่า)

ปัญหาเฉพาะในคำถามน่าจะเกี่ยวข้องกับหน่วยความจำ ก่อนที่เซิร์ฟเวอร์จะล่ม (และจากนั้นรีสตาร์ทอัตโนมัติโดยตัวจัดการคลัสเตอร์ล้มเหลวที่ดูเหมือนว่า) เราได้รับข้อผิดพลาดเหล่านี้:

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

ข้อความ (แต่ปกติ) เป็นครั้งคราวของ

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.

ข้อผิดพลาด: 17312, ความรุนแรง: 16, สถานะ: 1. (พารามิเตอร์ :) ข้อผิดพลาดถูกพิมพ์ในโหมด terse เนื่องจากเกิดข้อผิดพลาดระหว่างการจัดรูปแบบ การติดตาม, ETW, การแจ้งเตือน ฯลฯ ถูกข้ามไป

ฉันยังได้รับข้อผิดพลาดระดับแอปเช่น

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

จากนั้นข้อผิดพลาดที่น่าตื่นเต้นและให้คำแนะนำ:

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.

โหลดบนเซิร์ฟเวอร์ไม่เปลี่ยนแปลงดังนั้นจึงไม่มีเหตุผลที่หน่วยความจำจะหมดเมื่อก่อนหน้านี้ไม่ได้ระบุปัญหาที่มีการส่งแบบสอบถามไป

ทีนี้คำถาม - ฉันจะติดตามเคียวรีที่ทำให้เกิดข้อผิดพลาดนี้ได้อย่างไร (และน่าจะเป็นปัญหาทั้งหมด) ดูเหมือนว่าตั้งแต่การอัพเกรดไฮเบอร์เนตของเรามันมีการใช้คิวรีขนาดใหญ่บางอย่างที่ SQL Server และมันก็หัก มันเกิดขึ้นฉันมีความคิดบางอย่างเกี่ยวกับสิ่งที่พวกเขาอาจจะเป็น แต่มันจะดีที่จะสามารถติดตามพวกเขา

ฉันสามารถรันโปรแกรมสร้างโปรไฟล์ของ SQL Server ได้ แต่เมื่อเสร็จแล้ว (และผลิตข้อมูลจำนวนมหาศาล - เป็นฐานข้อมูล OLTP ที่ยุ่ง) ฉันจะกรองเพื่อค้นหาข้อความค้นหาที่มีปัญหาได้อย่างไร

ขอบคุณ!


1
ทุกอย่างทำงานบนเซิร์ฟเวอร์เดียวกันหรือไม่ หมายความว่าแอปพลิเคชันเซิร์ฟเวอร์กับ java ยังทำงานบนเซิร์ฟเวอร์ฐานข้อมูลหรือไม่
swasheck

1
สอดคล้องกับคำถามของ @ swasheck: คุณมีการตั้งค่าที่ชัดเจนสำหรับหน่วยความจำสูงสุดของ SQL Server หรือไม่ คุณได้จัดการกับแรงกดดันหน่วยความจำภายนอกหรือไม่?
Mike Fal

คุณลองดูที่ร่องรอยกล่องดำหรือไม่? พวกเขาอาจชี้คุณไปในทิศทางที่ถูกต้อง
datagod

ฉันเพิ่งเจอสิ่งนี้และร่องรอยที่ฉันทิ้งไว้ให้แสดงฐานข้อมูลที่ไม่ได้ใช้งานจากมุมมองของแอปพลิเคชัน
Joshua

คุณใช้การค้นหาข้อความเต็มหรือไม่? นอกจากนี้อะไรคือรุ่นบิวด์ที่แน่นอน + รุ่นของเซิร์ฟเวอร์ sql ที่คุณกำลังใช้งานอยู่?
Kin Shah

คำตอบ:


5

ทำตามขั้นตอนในโครงร่างวิธีการใช้DBCC MEMORYSTATUSคำสั่งในการตรวจสอบการใช้งานหน่วยความจำใน SQL Server การแก้ไขจะขึ้นอยู่กับการค้นพบของคุณ คุณยังสามารถอ่านวิธีการระบุคอขวดหน่วยความจำเซิร์ฟเวอร์ Microsoft SQLซึ่งสามารถเข้าถึงได้มากขึ้น

แม้ว่าจะมีคำเตือนอย่างหนึ่ง: ไม่น่าเป็นไปได้ที่คุณจะพบคำค้นหาที่จะตำหนิ การติดตามปัญหาหน่วยความจำดาวน์นั้นละเอียดกว่านั้นมาก โปรดทราบว่าเมื่อคุณใช้ทรัพยากรจนหมดและคิวรีเกิดข้อผิดพลาดหน่วยความจำไม่เพียงพออาจเป็นได้ว่าคิวรีที่ส่งข้อผิดพลาดนั้นเป็นเพียงเหยื่อไม่ใช่ผู้กระทำผิด


ขอบคุณ - ฉันได้ดูสิ่งเหล่านี้แล้ว แต่ปัญหาคือเซิร์ฟเวอร์ดูเหมือนว่าทำงานได้ดีและจากนั้นก็ไปไม่ได้หน่วยความจำก็ค่อยๆหมดลง นอกจากนี้ยังไม่ชัดเจนจากสิ่งใดที่ฉันสามารถค้นหาทางออนไลน์ว่าข้อผิดพลาด "มีหน่วยความจำระบบไม่เพียงพอในกลุ่มทรัพยากร 'ภายใน' เพื่อเรียกใช้แบบสอบถามนี้ จริง ๆ แล้วหมายถึง - อะไรคือพูลทรัพยากรภายในที่เกี่ยวกับผลลัพธ์ของ DBCC MEMORYSTATUS

นี่เป็นเซิร์ฟเวอร์การพัฒนาหรือไม่ ถ้าเป็นเช่นนั้นคุณสามารถปรับลดรุ่นเป็น Hibernate 3.1 เพื่อตรวจสอบว่าปัญหาหายไปหรือไม่ คุณมีคำถามเริ่มต้นสองบรรทัดและคุณต้องพยายามกำจัดอย่างใดอย่างหนึ่งไม่ว่าจะเป็น SQL Server มีการ จำกัด หน่วยความจำและเกินหรือส่วนอื่น ๆ ของระบบใช้หน่วยความจำและ SQL Server กำลังถูกบีบอัด จัดทำระบบรอบเวลาที่เกิดความผิดพลาดเพื่อพิจารณาว่าเกิดอะไรขึ้น
epo

0

ดูเหมือนว่าคุณต้องการไปสำหรับการตั้งค่าโดยใช้เหตุการณ์ที่เกิดขึ้นExtended Eventsquery_memory_grant_xxxxx

นี่เป็นตัวเลือกที่ดีที่สุดสำหรับคุณในการบันทึกข้อมูลและจัดเก็บ SQL Engine ที่มีขนาดต่าง ๆ ซึ่งคุณสามารถอ่านได้ทุกเวลา (คุณสามารถดูข้อมูลสด) ข้อมูลที่เก็บไว้จะไม่ถูกลบเมื่อเซิร์ฟเวอร์รีสตาร์ทเกิดขึ้น DMVs

ขั้นตอนการตั้งค่าด่วน ..

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.