แบ่งปันเลย:
สารบัญ ซ่อน
5. การสร้างเซสชันเหตุการณ์ขยายโดยใช้ T-SQL
8. กรณีการใช้งานจริงและตัวอย่าง
8.6 การตรวจจับปัญหาการทุจริตและความสมบูรณ์ของฐานข้อมูล

1. บทนำ

1.1 อะไรคือ SQL Server กิจกรรมขยายเวลา?

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

1.2 เหตุใดจึงใช้เหตุการณ์ขยายสำหรับการตรวจสอบ?

SQL Server Extended Events นำเสนอข้อดีที่น่าสนใจหลายประการสำหรับการตรวจสอบและการแก้ไขปัญหาฐานข้อมูล:

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

1.3 เหตุการณ์ขยายเทียบกับ SQL Server Profiler

ในขณะที่ SQL Server Profiler MS SQL Extended Events เป็นเครื่องมือตรวจสอบแบบดั้งเดิม จึงเป็นทางเลือกที่มีประสิทธิภาพมากกว่า Extended Events ใช้ทรัพยากรระบบน้อยลงและรองรับการปรับขนาดได้ดีกว่าสำหรับสภาพแวดล้อมการใช้งานจริง

SQL Server Profiler ไม่ได้รับการสนับสนุนอีกต่อไปแล้ว และ Microsoft ขอแนะนำให้ย้ายไปยัง Extended Events สำหรับกิจกรรมการตรวจสอบทั้งหมด

2. การทำความเข้าใจสถาปัตยกรรมเหตุการณ์ขยาย

2.1 ส่วนประกอบของเอนจิ้นเหตุการณ์ขยาย

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

  • ผู้จัดส่ง: ส่วนประกอบของตัวจัดการจะประสานงานการไหลของเหตุการณ์จากแหล่งที่มาของเหตุการณ์ไปยังเอ็นจินเหตุการณ์ที่ขยาย เมื่อเหตุการณ์เกิดขึ้น ตัวจัดการจะได้รับการแจ้งเตือนและส่งต่อไปยังเซสชันที่ใช้งานอยู่ซึ่งสมัครใช้งานประเภทเหตุการณ์นั้นโดยเฉพาะ
  • บัฟเฟอร์: บัฟเฟอร์จะจัดเก็บข้อมูลเหตุการณ์ไว้ในหน่วยความจำชั่วคราวก่อนที่จะเขียนไปยังปลายทาง กลไกการบัฟเฟอร์นี้ช่วยเพิ่มประสิทธิภาพโดยลดการทำงานของ I/O ขนาดบัฟเฟอร์และการตั้งค่าการจัดการสามารถกำหนดค่าได้เพื่อให้เกิดความสมดุลระหว่างการใช้หน่วยความจำกับความต้องการในการเก็บรวบรวมข้อมูล
  • เซสชั่น: เซสชันกำหนดขอบเขตของการตรวจสอบเหตุการณ์ โดยระบุว่าเหตุการณ์ใดที่จะบันทึก การกระทำใดที่จะดำเนินการ เงื่อนไขใดที่จะใช้ และจะจัดเก็บผลลัพธ์ไว้ที่ใด เซสชันสามารถสร้าง แก้ไข เริ่ม และหยุดได้อย่างอิสระ
  • อินสแตนซ์เป้าหมาย: อินสแตนซ์เป้าหมายแสดงถึงปลายทางในการจัดเก็บข้อมูลเหตุการณ์ที่บันทึกไว้ แต่ละเซสชันสามารถเขียนไปยังเป้าหมายหนึ่งหรือหลายเป้าหมาย เช่น ไฟล์ บัฟเฟอร์แบบวงแหวน หรือตัวนับ เป้าหมายจะประมวลผลและเก็บรักษาข้อมูลเหตุการณ์ไว้เพื่อการวิเคราะห์ในภายหลัง

2.2 แพ็คเกจกิจกรรม

SQL Server Extended Events จัดระเบียบฟังก์ชันการทำงานเป็นแพ็กเกจ โดยแต่ละแพ็กเกจจะประกอบด้วยเหตุการณ์ การกระทำ ประเภท เงื่อนไข และเป้าหมายที่เกี่ยวข้อง แพ็กเกจทั่วไปได้แก่ sqlserver, sqlos และ package0

  • แพ็คเกจ sqlserver มอบเหตุการณ์เฉพาะฐานข้อมูล เช่น แบบสอบถามและธุรกรรม
  • แพ็คเกจ sqlos มีเหตุการณ์ของระบบปฏิบัติการ
  • package0 นำเสนอฟังก์ชันวัตถุประสงค์ทั่วไปที่ใช้กับแพ็คเกจทั้งหมด

2.3 ประเภทเหตุการณ์และฟิลด์

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

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

2.4 การกระทำ

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

การดำเนินการทั่วไป ได้แก่ sql_text เพื่อบันทึกข้อความคำสั่ง SQL, database_name เพื่อระบุฐานข้อมูล และ client_hostname เพื่อติดตามเซิร์ฟเวอร์ต้นทาง การดำเนินการเหล่านี้ให้ข้อมูลบริบทที่สำคัญสำหรับการแก้ไขปัญหาและการวิเคราะห์

2.5 เป้าหมาย

เป้าหมายจะกำหนดวิธีการและสถานที่จัดเก็บข้อมูลเหตุการณ์ SQL Server Extended Events รองรับประเภทเป้าหมายหลายประเภท รวมถึง:

  • event_file สำหรับจัดเก็บดิสก์ ซึ่งให้พื้นที่จัดเก็บถาวรสำหรับการวิเคราะห์โดยละเอียด
  • ring_buffer สำหรับการเก็บข้อมูลตามหน่วยความจำ ช่วยให้เข้าถึงเหตุการณ์ล่าสุดได้อย่างรวดเร็วด้วยค่าใช้จ่ายน้อยที่สุด
  • event_counter สำหรับการนับแบบง่าย
  • ฮิสโทแกรมสำหรับการจัดกลุ่ม
  • pair_matching เพื่อเชื่อมโยงเหตุการณ์ที่เกี่ยวข้อง

2.6 คำทำนาย (ตัวกรอง)

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

การใช้เพรดิเคตที่มีประสิทธิภาพจะช่วยลดผลกระทบต่อประสิทธิภาพการทำงานโดยจับเฉพาะเหตุการณ์ที่เกี่ยวข้องเท่านั้น เพรดิเคตที่ซับซ้อนจะรวมเงื่อนไขต่างๆ เข้าด้วยกันโดยใช้ตัวดำเนินการเชิงตรรกะเพื่อสร้างเกณฑ์การกรองที่แม่นยำ

3. สถานะเซสชันเหตุการณ์ที่ขยายและวงจรชีวิต

3.1 สถานะเซสชัน: สร้าง แก้ไข และลบ

เซสชันกิจกรรมขยายจะดำเนินไปตามสถานะที่แตกต่างกัน:

  • คำสั่ง CREATE EVENT SESSION กำหนดเซสชันใหม่ แต่ไม่ได้เริ่มต้นเซสชันนั้น เซสชันจะอยู่ในสถานะหยุดทำงานจนกว่าจะถูกเปิดใช้งานอย่างชัดเจน
  • คำสั่ง ALTER EVENT SESSION ใช้สำหรับแก้ไขการตั้งค่าเซสชันหรือเปลี่ยนสถานะของเซสชันระหว่างหยุดและเริ่มต้น
  • คำสั่ง DROP EVENT SESSION จะลบคำจำกัดความเซสชันออกจากเซิร์ฟเวอร์ทั้งหมด

3.2 เนื้อหาและลักษณะของเซสชัน

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

คุณลักษณะของเซสชัน ได้แก่ การคงอยู่ของเซสชันหลังการรีสตาร์ทเซิร์ฟเวอร์ การจัดสรรหน่วยความจำสูงสุด และวิธีการจัดการกับปัญหาหน่วยความจำล้น การตั้งค่าเหล่านี้ส่งผลกระทบอย่างมากต่อพฤติกรรมของเซสชันและการใช้ทรัพยากร

3.3 ขอบเขตเซสชันและแพ็คเกจ

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

ความสัมพันธ์ของแพ็กเกจช่วยให้คุณสามารถรวมเหตุการณ์จากหลายแหล่งภายในเซสชันเดียว ความสามารถนี้ช่วยให้สามารถติดตามสถานการณ์ได้อย่างครอบคลุมและครอบคลุม SQL Server ระบบย่อย

4. การสร้างเซสชันเหตุการณ์ขยายโดยใช้ SSMS

4.1 ข้อกำหนดเบื้องต้นและการตั้งค่า

ก่อนสร้าง SQL Server สำหรับเซสชันเหตุการณ์ที่ขยาย โปรดตรวจสอบให้แน่ใจว่าคุณมีสิทธิ์ที่เหมาะสม คุณต้องมีสิทธิ์ ALTER ANY EVENT SESSION สำหรับเซสชันที่กำหนดขอบเขตเซิร์ฟเวอร์ หรือสิทธิ์ CONTROL บนฐานข้อมูลสำหรับเซสชันที่กำหนดขอบเขตฐานข้อมูล

ยืนยันว่า SQL Server โปรแกรม Management Studio ได้รับการติดตั้งและเชื่อมต่อกับอินสแตนซ์เป้าหมายของคุณแล้ว โปรดศึกษาข้อกำหนดในการตรวจสอบและระบุว่าเหตุการณ์และเป้าหมายใดเหมาะสมกับความต้องการของคุณมากที่สุด

4.2 การเข้าถึงเหตุการณ์ที่ขยายใน Object Explorer

หากต้องการเข้าถึงอินเทอร์เฟซเหตุการณ์ขยายใน SSMS ให้ทำตามขั้นตอนเหล่านี้:

  1. จุดเปิด SQL Server Management Studio และเชื่อมต่อกับคุณ SQL Server ตัวอย่าง.
  2. ใน Object Explorer ให้ขยาย การจัดการ -> กิจกรรมขยาย.
  3. โหนดเหตุการณ์ขยายประกอบด้วย การประชุม และ แบบรวดเร็ว โฟลเดอร์สำหรับจัดการการกำหนดค่าการตรวจสอบของคุณ

เข้าถึงอินเทอร์เฟซเหตุการณ์ขยายใน SQL Server สตูดิโอการจัดการ

4.3 สร้างเซสชันใหม่

ในการสร้างเซสชันใหม่:

    1. คลิกขวาที่ไอคอน การประชุม ภายใต้โฟลเดอร์ กิจกรรมขยาย.
    2. เลือก เซสชั่นใหม่ เพื่อเปิดกล่องโต้ตอบการกำหนดค่า เนื้อหาต่อไปนี้จะใช้วิธีนี้เพื่อสร้างเซสชันใหม่

สร้างเซสชันใหม่ของกิจกรรมขยายใน SQL Server สตูดิโอการจัดการ

หมายเหตุ: ตัวช่วยสร้างเซสชันใหม่ ยังพร้อมให้สัมผัสประสบการณ์ที่เป็นไกด์นำทางมากขึ้นอีกด้วย

4.3.1 การกำหนดค่าหน้าทั่วไป

เกี่ยวกับ ทั่วไป หน้ากำหนดค่าคุณสมบัติเซสชันพื้นฐาน:

  1. ป้อนชื่อเซสชันใน ชื่อเซสชัน ฟิลด์ ใช้ชื่อที่อธิบายวัตถุประสงค์ในการตรวจสอบ
  2. เลือกได้ตามต้องการ เริ่มเซสชันกิจกรรมเมื่อเซิร์ฟเวอร์เริ่มต้นทำงาน เพื่อเปิดใช้งานการเปิดใช้งานเซสชันอัตโนมัติ
  3. เทมเพลตเซสชันเริ่มต้นคือ ว่างเปล่าคุณสามารถใช้เทมเพลตอื่นได้หากใช้การกำหนดค่าที่กำหนดไว้ล่วงหน้า

หน้าทั่วไปของเซสชันกิจกรรมขยายใน SQL Server สตูดิโอการจัดการ

4.3.2 การตั้งค่าหน้ากิจกรรม

การขอ อีเวนต์ หน้าช่วยให้คุณเลือกเหตุการณ์ที่จะตรวจสอบ:

  1. เลือก อีเวนต์ หน้าจากซ้าย เลือกหน้า แผงหน้าปัด.
  2. ตัว Vortex Indicator ได้ถูกนำเสนอลงในนิตยสาร คลังกิจกรรมเรียกดูกิจกรรมที่มีอยู่หรือใช้ฟังก์ชันการค้นหา
  3. กรองเหตุการณ์โดยการพิมพ์คำสำคัญเช่น “sql_statement_completed” เพื่อค้นหาเหตุการณ์ที่เกี่ยวข้อง
  4. เลือกเหตุการณ์ที่ต้องการ เช่น sql_statement_completed
  5. คลิกปุ่มลูกศรขวาเพื่อย้ายเหตุการณ์ไปที่ กิจกรรมที่เลือก รายการ.

หน้ากิจกรรมของเซสชันกิจกรรมขยายใน SQL Server สตูดิโอการจัดการ

4.3.3 การกำหนดค่าการจัดเก็บข้อมูล

การขอ การจัดเก็บข้อมูล หน้าจะกำหนดว่าข้อมูลเหตุการณ์จะถูกเก็บไว้ที่ไหน:

  1. เลือก การจัดเก็บข้อมูล หน้าจากซ้าย เลือกหน้า แผงหน้าปัด.
  2. ตัว Vortex Indicator ได้ถูกนำเสนอลงในนิตยสาร เป้าหมาย ในพื้นที่นั้น ให้เลือกประเภทเป้าหมายจากเมนูแบบเลื่อนลง

หน้าจัดเก็บข้อมูลของเซสชันเหตุการณ์ขยายใน SQL Server สตูดิโอการจัดการ

(1) ไฟล์เหตุการณ์เป้าหมาย

เป้าหมาย event_file จะบันทึกข้อมูลลงในไฟล์บนดิสก์ที่มีนามสกุล .xel:

  1. เลือก ไฟล์เหตุการณ์ จากเมนูแบบเลื่อนลงประเภทเป้าหมาย
  2. ระบุพาthของไฟล์ เช่น C:\temp\YourSession_Target.xel
  3. กำหนดค่าตัวเลือกการพลิกกลับเพื่อจัดการพื้นที่ดิสก์โดยการตั้งค่าขนาดไฟล์สูงสุดและจำนวนไฟล์
  4. โปรแกรมเป้าหมายจะบันทึกเหตุการณ์อย่างต่อเนื่องจนกว่าเซสชันจะหยุดลงหรือพื้นที่จัดเก็บข้อมูลเต็ม

ตั้งค่าเป้าหมายเซสชันเป็น event_file ใน SSMS

(2) ring_buffer เป้าหมาย

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

  1. เลือก ริงบัฟเฟอร์ เป็นประเภทเป้าหมาย
  2. กำหนดค่าการจัดสรรหน่วยความจำสูงสุดสำหรับบัฟเฟอร์
  3. เข้าใจว่าเหตุการณ์เก่าๆ จะถูกลบทิ้งเมื่อบัฟเฟอร์เต็ม ทำให้เหมาะสำหรับการตรวจสอบกิจกรรมล่าสุด

ตั้งค่าเป้าหมายเป็น ring_buffer สำหรับเซสชัน Extended Events ใน SQL Server สตูดิโอการจัดการ

(3) เป้าหมายตัวนับเหตุการณ์

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

ตั้งค่าเป้าหมายเป็น event_counter สำหรับเซสชัน Extended Events ใน SQL Server สตูดิโอการจัดการ

(4) ฮิสโตแกรมเป้าหมาย

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

ตั้งค่าเป้าหมายเป็นฮิสโตแกรมสำหรับเซสชัน Extended Events ใน SQL Server สตูดิโอการจัดการ

(5) การจับคู่เป้าหมาย

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

ตั้งค่าเป้าหมายเซสชันเป็น pair_matching ใน SSMS

ไม่เคยตั้งค่าขั้นสูง

การขอ ค้นหาระดับสูง หน้าแสดงตัวเลือกการกำหนดค่าระดับเซสชัน:

  1. เลือก ค้นหาระดับสูง หน้าจากซ้าย เลือกหน้า แผงหน้าปัด.
  2. กำหนดค่า โหมดการเก็บรักษาเหตุการณ์ เพื่อควบคุมวิธีการจัดการเหตุการณ์ภายใต้แรงกดดันของหน่วยความจำ
  3. ชุด ความหน่วงเวลาในการจัดส่งสูงสุด เพื่อสร้างสมดุลระหว่างการประมวลผลแบบเรียลไทม์กับประสิทธิภาพของระบบ
  4. กำหนดค่า ขนาดหน่วยความจำสูงสุด และ ขนาดกิจกรรมสูงสุด ขึ้นอยู่กับข้อกำหนดการติดตามของคุณ
  5. เลือก โหมดพาร์ติชั่นหน่วยความจำ เพื่อเพิ่มประสิทธิภาพสำหรับสภาพแวดล้อม CPU เดียวหรือหลาย CPU

หน้าขั้นสูงของเซสชั่นใน SQL Server สตูดิโอการจัดการ

4.4 การกำหนดค่าตัวกรองเหตุการณ์ (คำทำนาย)

เพรดิเคตช่วยลดปริมาณข้อมูลโดยการกรองเหตุการณ์ตามเกณฑ์เฉพาะ การกำหนดค่าตัวกรอง:

  1. เกี่ยวกับ อีเวนต์ หน้า เลือกเหตุการณ์ที่คุณต้องการกรอง เช่น “sql_statement_completed”
  2. คลิก กำหนดค่า เพื่อเปิดกล่องโต้ตอบการกำหนดค่าเหตุการณ์
    กำหนดค่าเหตุการณ์ของเซสชันเหตุการณ์ขยายใน SQL Server สตูดิโอการจัดการ
  3. เลือก ตัวกรอง (ภาคแสดง) แถบ
  4. ตัว Vortex Indicator ได้ถูกนำเสนอลงในนิตยสาร สนาม แบบดรอปดาวน์ เลือกฟิลด์ที่ต้องการกรอง เช่น ระยะเวลา
  5. เลือก a ผู้ประกอบการเช่น ">”
  6. เข้าสู่ตัวกรอง ความคุ้มค่าเช่น 1000000 (1 วินาที)
  7. เพิ่มเงื่อนไขเพิ่มเติมหากจำเป็น

กำหนดค่าตัวกรอง (คำทำนาย) สำหรับเหตุการณ์

4.5 การเลือกการดำเนินการและฟิลด์เหตุการณ์

สำหรับแต่ละเหตุการณ์ คุณสามารถเลือกข้อมูลที่จะรวบรวมได้:

  1. เกี่ยวกับ อีเวนต์ หน้าเลือกเหตุการณ์ที่คุณต้องการเลือกข้อมูล เช่น “sql_statement_completed”
  2. คลิก กำหนดค่า เพื่อเปิดกล่องโต้ตอบการกำหนดค่าเหตุการณ์
  3. เลือก ฟิลด์ทั่วโลก (การดำเนินการ) แถบ
  4. เลือกการดำเนินการเพื่อเพิ่มข้อมูลเพิ่มเติม เช่น ชื่อฐานข้อมูล หรือ ชื่อแอปพลิเคชันไคลเอ็นต์
    กำหนดค่าการดำเนินการของเหตุการณ์
  5. ตรวจสอบ ฟิลด์กิจกรรม ส่วนที่จะดูว่าฟิลด์ไหนถูกจับภาพโดยอัตโนมัติ
  6. ล้างช่องข้อมูลที่ไม่จำเป็นเพื่อลดปริมาณข้อมูล
    กำหนดค่าฟิลด์ของเหตุการณ์

4.6 การเริ่มต้นและการจัดการเซสชัน

หลังจากตั้งค่าเซสชันเสร็จแล้ว คุณสามารถเริ่มใช้งานและตรวจสอบการทำงานได้:

  1. คลิก OK เพื่อสร้างเซสชัน
  2. ใน Object Explorer ให้ขยาย การประชุม โฟลเดอร์เพื่อดูเซสชันใหม่ของคุณ
  3. คลิกขวาที่ชื่อเซสชันและเลือก เริ่มเซสชัน เพื่อเริ่มบันทึกเหตุการณ์
    เริ่มเซสชัน Extended Events ใน SQL Server สตูดิโอการจัดการ
  4. หากต้องการดูข้อมูลสด ให้คลิกขวาที่เซสชันแล้วเลือก ดูข้อมูลสด.
    รับชมข้อมูลสดของเซสชันกิจกรรมขยายเวลาใน SQL Server สตูดิโอการจัดการ
  5. หยุดเซสชันโดยคลิกขวาและเลือก หยุดเซสชัน.

5. การสร้างเซสชันเหตุการณ์ขยายโดยใช้ T-SQL

5.1 ไวยากรณ์การสร้างเซสชันเหตุการณ์

การสร้างเซสชันเหตุการณ์แบบขยายด้วย T-SQL ช่วยให้ควบคุมได้อย่างแม่นยำและเปิดใช้งานสคริปต์สำหรับการปรับใช้แบบอัตโนมัติ คำสั่ง CREATE EVENT SESSION เป็นไปตามโครงสร้างไวยากรณ์เฉพาะ

ไวยากรณ์พื้นฐานประกอบด้วยชื่อเซสชัน ข้อความ ADD EVENT สำหรับแต่ละเหตุการณ์ ข้อความ ADD TARGET สำหรับปลายทางการจัดเก็บข้อมูล และข้อความ WITH ที่เป็นตัวเลือกสำหรับการกำหนดค่าเซสชัน

5.2 การสร้างเซสชันเหตุการณ์พื้นฐาน

เซสชันพื้นฐานจะตรวจสอบเหตุการณ์เฉพาะและเขียนผลลัพธ์ไปยังปลายทางที่กำหนด ต่อไปนี้คือวิธีการสร้างส่วนประกอบที่สำคัญ

5.2.1 การกำหนดชื่อเซสชันและตัวเลือก

เริ่มต้นด้วยการสร้างเซสชันโดยตั้งชื่อที่สื่อความหมาย:

CREATE EVENT SESSION [SampleSession] ON SERVER

คำสั่ง ON SERVER จะสร้างเซสชันที่จำกัดขอบเขตเซิร์ฟเวอร์ ซึ่งจะคงอยู่ตลอดการเปลี่ยนแปลงฐานข้อมูล สำหรับ Azure SQL Database ให้ใช้ ON DATABASE สำหรับเซสชันที่จำกัดขอบเขตฐานข้อมูล

5.2.2 การเพิ่มเหตุการณ์ด้วย ADD EVENT

เพิ่มเหตุการณ์ที่จะบันทึกโดยใช้คำสั่ง ADD EVENT:

CREATE EVENT SESSION [SampleSession] ON SERVER
ADD EVENT sqlserver.sql_statement_completed

การดำเนินการนี้จะบันทึกคำสั่ง SQL ที่เสร็จสมบูรณ์ทั้งหมด คุณสามารถเพิ่มเหตุการณ์ได้หลายรายการโดยการเพิ่มคำสั่ง ADD EVENT เพิ่มเติม

5.2.3 การกำหนดค่าการดำเนินการเหตุการณ์

การดำเนินการจะรวบรวมบริบทเพิ่มเติมสำหรับแต่ละเหตุการณ์ เพิ่มการดำเนินการภายในวงเล็บหลังชื่อเหตุการณ์:

CREATE EVENT SESSION [SampleSession] ON SERVER
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(sqlserver.sql_text, sqlserver.database_name, sqlserver.username)
)

ตัวอย่างนี้จับข้อความ SQL ชื่อฐานข้อมูล และชื่อผู้ใช้สำหรับคำสั่งที่เสร็จสมบูรณ์แต่ละคำสั่ง

5.2.4 การตั้งค่าคำทำนายเหตุการณ์ (WHERE Clause)

เพรดิเคตจะกรองเหตุการณ์เพื่อลดปริมาณข้อมูล ใช้คำสั่ง WHERE ภายในนิยามเหตุการณ์:

CREATE EVENT SESSION [SampleSession] ON SERVER
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(sqlserver.sql_text)
    WHERE ([package0].[greater_than_uint64]([duration],(5000000)))
)

ตัวกรองนี้สำหรับคำสั่งที่มีระยะเวลามากกว่า 5 วินาที (5,000,000 ไมโครวินาที)

5.3 การเพิ่มเป้าหมายของกิจกรรม

เป้าหมายจะกำหนดว่าข้อมูลเหตุการณ์จะถูกจัดเก็บไว้ที่ใดและจะถูกประมวลผลอย่างไร

5.3.1 ไวยากรณ์การเพิ่มเป้าหมาย

เพิ่มเป้าหมายโดยใช้คำสั่ง ADD TARGET หลังจากกำหนดเหตุการณ์ทั้งหมดแล้ว:

ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\SampleSession.xel'
)

คำนำหน้า package0 บ่งชี้ว่าเป้าหมายมาจากแพ็กเกจพื้นฐาน

5.3.2 การกำหนดค่าพารามิเตอร์เป้าหมาย

แต่ละประเภทเป้าหมายจะรับพารามิเตอร์เฉพาะ สำหรับ event_file ให้กำหนดค่า filename, max_file_size และ max_rollover_files:

ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\SampleSession.xel',
        max_file_size=(50),
        max_rollover_files=(5)
)

การกำหนดค่านี้จะสร้างไฟล์ขนาดสูงสุด 50 MB ต่อไฟล์ และรักษาไฟล์ไว้ได้สูงสุด 5 ไฟล์เมื่อทำการโรลโอเวอร์

5.4 ตัวเลือกและการตั้งค่าเซสชัน

คำสั่ง WITH จะกำหนดค่าตัวเลือกในระดับเซสชันที่ควบคุมพฤติกรรมและการใช้ทรัพยากร

5.4.1 MAX_MEMORY และ EVENT_RETENTION_MODE

ควบคุมการจัดสรรหน่วยความจำและการจัดการเหตุการณ์ภายใต้แรงกดดัน:

WITH (
    MAX_MEMORY=4096 KB,
    EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS
)

ตัวเลือก EVENT_RETENTION_MODE ประกอบด้วย ALLOW_SINGLE_EVENT_LOSS สำหรับการใช้หน่วยความจำน้อยที่สุด, ALLOW_MULTIPLE_EVENT_LOSS สำหรับการใช้หน่วยความจำในระดับปานกลาง และ NO_EVENT_LOSS สำหรับการเก็บรักษาข้อมูลอย่างสมบูรณ์โดยแลกกับผลกระทบต่อประสิทธิภาพการทำงาน

5.4.2 ความหน่วงเวลาสูงสุดในการจัดส่ง

กำหนดเวลาสูงสุดที่เหตุการณ์สามารถคงอยู่ในบัฟเฟอร์ก่อนที่จะถูกเขียนไปยังปลายทาง:

WITH (
    MAX_DISPATCH_LATENCY=30 SECONDS
)

ค่าที่ต่ำกว่าจะให้ข้อมูลแบบเรียลไทม์มากขึ้น แต่ก็ต้องแลกมาด้วยการเพิ่มขึ้นของจำนวนการดำเนินการ I/O

5.4.3 โหมดหน่วยความจำ_พาร์ติชั่น

เพิ่มประสิทธิภาพการแบ่งพาร์ติชันหน่วยความจำสำหรับการกำหนดค่าฮาร์ดแวร์ของคุณ:

WITH (
    MEMORY_PARTITION_MODE=PER_CPU
)

ตัวเลือกต่างๆ ได้แก่ NONE สำหรับพาร์ติชันเดียว PER_NODE สำหรับระบบ NUMA และ PER_CPU สำหรับการทำงานพร้อมกันสูงสุดบนระบบที่มี CPU หลายตัว

5.5 การเริ่มต้น การหยุด และการปรับเปลี่ยนช่วงเวลาการบำบัด

จัดการสถานะเซสชันและการกำหนดค่าผ่านคำสั่ง ALTER EVENT SESSION

5.5.1 เปลี่ยนแปลงเซสชันเหตุการณ์เพื่อเริ่ม/หยุด

เริ่มเซสชันหลังจากสร้างเสร็จแล้ว:

ALTER EVENT SESSION [SampleSession] ON SERVER STATE = START;

หยุดเซสชันการทำงาน:

ALTER EVENT SESSION [SampleSession] ON SERVER STATE = STOP;

5.5.2 การแก้ไขเซสชันที่มีอยู่

แก้ไขการกำหนดค่าเซสชันขณะหยุด เพิ่มเหตุการณ์:

ALTER EVENT SESSION [SampleSession] ON SERVER
ADD EVENT sqlserver.sql_batch_completed;

ลบเหตุการณ์:

ALTER EVENT SESSION [SampleSession] ON SERVER
DROP EVENT sqlserver.sql_statement_completed;

5.5.3 การยกเลิกเซสชันเหตุการณ์

ลบเซสชันทั้งหมดด้วย DROP EVENT SESSION:

DROP EVENT SESSION [SampleSession] ON SERVER;

จะต้องหยุดเซสชั่นก่อนจึงจะยกเลิกได้

6. การทำงานกับเป้าหมายของกิจกรรมโดยละเอียด

6.1 การกำหนดค่าเป้าหมายไฟล์เหตุการณ์

เป้าหมาย event_file ให้พื้นที่จัดเก็บข้อมูลเหตุการณ์แบบถาวร พร้อมตัวเลือกการกำหนดค่าที่ยืดหยุ่น

6.1.1 เส้นทางไฟล์และข้อตกลงการตั้งชื่อ

ระบุเส้นทางแบบเต็มและชื่อไฟล์สำหรับไฟล์เหตุการณ์:

ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\MySession.xel'
)

ใช้นามสกุลไฟล์ .xel สำหรับไฟล์บันทึกเหตุการณ์แบบขยาย ตรวจสอบให้แน่ใจว่า SQL Server บัญชีบริการมีสิทธิ์เขียนลงในไดเร็กทอรีที่ระบุ

6.1.2 การหมุนเวียนไฟล์และการจัดการขนาด

กำหนดค่าการหมุนเวียนไฟล์อัตโนมัติเพื่อจัดการพื้นที่ดิสก์:

ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\MySession.xel',
        max_file_size=(50),
        max_rollover_files=(10)
)

เมื่อไฟล์ถึง 50 MB SQL Server Extended Events จะสร้างไฟล์ใหม่โดยเพิ่มส่วนต่อท้าย เมื่อครบ 10 ไฟล์แล้ว ไฟล์ที่เก่าที่สุดจะถูกเขียนทับ

6.1.3 การอ่านข้อมูลไฟล์เหตุการณ์

สอบถามข้อมูลไฟล์เหตุการณ์โดยใช้ฟังก์ชัน sys.fn_xe_file_target_read_file:

SELECT
    event_data,
    file_name,
    file_offset
FROM sys.fn_xe_file_target_read_file(
    'C:\XEvents\MySession*.xel',
    NULL, NULL, NULL
);

รูปแบบไวด์การ์ดจะอ่านไฟล์ทั้งหมดที่เกี่ยวข้องกับเซสชัน

6.2 การใช้งานเป้าหมาย ring_buffer

เป้าหมาย ring_buffer จะจัดเก็บเหตุการณ์ไว้ในหน่วยความจำเพื่อให้เข้าถึงกิจกรรมล่าสุดได้อย่างรวดเร็ว

6.2.1 การจัดเก็บเหตุการณ์ตามหน่วยความจำ

กำหนดค่า ring_buffer สำหรับที่เก็บข้อมูลตามหน่วยความจำ:

ADD TARGET package0.ring_buffer

กิจกรรมจะสามารถเข้าถึงได้เฉพาะในขณะที่เซสชันกำลังดำเนินการอยู่เท่านั้น SQL Server กำลังทำงานอยู่ ข้อมูลจะสูญหายเมื่อเซสชันหยุดลงหรือเซิร์ฟเวอร์รีสตาร์ท

6.2.2 ขนาดบัฟเฟอร์และการกำหนดค่า

ควบคุมการจัดสรรหน่วยความจำสำหรับบัฟเฟอร์วงแหวน:

ADD TARGET package0.ring_buffer(
    SET max_memory=(4096)
)

ระบุหน่วยความจำเป็นหน่วย KB เมื่อบัฟเฟอร์เต็ม เหตุการณ์เก่าจะถูกลบออกโดยใช้วิธี FIFO

6.2.3 การสอบถามข้อมูลบัฟเฟอร์ริง

เข้าถึงข้อมูลบัฟเฟอร์วงแหวนผ่าน DMV:

SELECT
    CAST(target_data AS XML) AS TargetData
FROM sys.dm_xe_session_targets AS t
JOIN sys.dm_xe_sessions AS s
    ON s.address = t.event_session_address
WHERE s.name = 'YourSessionName'
    AND t.target_name = 'ring_buffer';

ตัวแปร target_data ประกอบด้วยข้อมูลเหตุการณ์ในรูปแบบ XML

6.3 ตัวนับเหตุการณ์เป้าหมาย

เป้าหมาย event_counter ให้การนับอย่างง่ายโดยไม่ต้องจัดเก็บข้อมูลโดยละเอียด:

ADD TARGET package0.event_counter

เป้าหมายนี้ติดตามความถี่ของเหตุการณ์โดยใช้ทรัพยากรน้อยที่สุด เหมาะสำหรับการตรวจสอบปริมาณมากที่ต้องการนับจำนวนเหตุการณ์เท่านั้น

6.4 ฮิสโตแกรมเป้าหมาย

ฮิสโตแกรมนี้จัดกลุ่มเหตุการณ์ตามค่าของฟิลด์:

ADD TARGET package0.histogram(
    SET filtering_event_name=N'sqlserver.sql_statement_completed',
        source_type=0,
        source=N'database_name'
)

การกำหนดค่านี้จะสร้างฮิสโทแกรมที่แสดงการกระจายของเหตุการณ์ต่างๆ ทั่วทั้งฐานข้อมูล

6.5 pair_matching Target

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

ADD TARGET package0.pair_matching(
    SET begin_event=N'sqlserver.lock_acquired',
        end_event=N'sqlserver.lock_released',
        begin_matching_columns=N'resource_type',
        end_matching_columns=N'resource_type'
)

ซึ่งช่วยให้สามารถวิเคราะห์การดำเนินการแบบจับคู่และระยะเวลาได้

7. การดูและวิเคราะห์ข้อมูลเหตุการณ์ขยาย

7.1 การใช้ SSMS เพื่อดูข้อมูลสด

SQL Server Management Studio มอบอินเทอร์เฟซกราฟิกสำหรับการดูข้อมูลเหตุการณ์ขยายแบบเรียลไทม์:

  1. ใน Object Explorer ให้ขยาย การจัดการ -> กิจกรรมขยาย -> การประชุม.
  2. คลิกขวาที่เซสชันที่ใช้งานอยู่ของคุณ
  3. เลือก ดูข้อมูลสด เพื่อเปิดดูข้อมูลสด
    รับชมข้อมูลสดของเซสชันกิจกรรมขยายเวลาใน SQL Server สตูดิโอการจัดการ
  4. เหตุการณ์จะปรากฏในกริดเมื่อเกิดขึ้น
  5. คลิกที่เหตุการณ์แต่ละเหตุการณ์เพื่อดูค่าฟิลด์โดยละเอียดในบานหน้าต่างรายละเอียด
    ชมข้อมูลสดของเหตุการณ์ต่างๆ รวมถึงรายละเอียดของเหตุการณ์
  6. ใช้ตัวกรองแถบเครื่องมือเพื่อเน้นเฉพาะประเภทเหตุการณ์หรือค่าฟิลด์

7.2 การสอบถามข้อมูลไฟล์เหตุการณ์ด้วย T-SQL

แบบสอบถาม T-SQL ช่วยให้วิเคราะห์ข้อมูลเหตุการณ์ที่บันทึกไว้ได้อย่างยืดหยุ่น

7.2.1 ฟังก์ชัน sys.fn_xe_file_target_read_file

อ่านข้อมูลไฟล์เหตุการณ์โดยใช้ฟังก์ชันระบบนี้:

SELECT
    object_name AS EventName,
    CAST(event_data AS XML) AS EventData,
    file_name,
    file_offset,
    timestamp_utc
FROM sys.fn_xe_file_target_read_file(
    'C:\XEvents\MySession*.xel',
    NULL, NULL, NULL
);

ฟังก์ชันนี้จะส่งคืนหนึ่งแถวต่อเหตุการณ์โดยมีรายละเอียดที่จัดรูปแบบเป็น XML

7.2.2 การแยกวิเคราะห์ข้อมูลเหตุการณ์ XML

แยกค่าเฉพาะจากข้อมูลเหตุการณ์ XML:

SELECT
    event_data.value('(event/@name)[1]', 'VARCHAR(50)') AS EventName,
    event_data.value('(event/@timestamp)[1]', 'DATETIME2') AS Timestamp,
    event_data.value('(event/data[@name="duration"]/value)[1]', 'BIGINT') AS Duration,
    event_data.value('(event/data[@name="statement"]/value)[1]', 'VARCHAR(MAX)') AS Statement
FROM (
    SELECT CAST(event_data AS XML) AS event_data
    FROM sys.fn_xe_file_target_read_file(
        'C:\XEvents\MySession*.xel',
        NULL, NULL, NULL
    )
) AS EventData;

นิพจน์ XQuery จะดึงค่าฟิลด์แต่ละค่าจากโครงสร้าง XML

7.2.3 การแปลงข้อมูลเหตุการณ์เป็นตาราง

สร้างชุดผลลัพธ์ที่มีโครงสร้างจากข้อมูลเหตุการณ์:

WITH EventData AS (
    SELECT CAST(event_data AS XML) AS EventXML
    FROM sys.fn_xe_file_target_read_file(
        'C:\XEvents\MySession*.xel',
        NULL, NULL, NULL
    )
)
SELECT
    EventXML.value('(event/@name)[1]', 'VARCHAR(100)') AS EventName,
    EventXML.value('(event/data[@name="cpu_time"]/value)[1]', 'BIGINT') AS CPUTime,
    EventXML.value('(event/data[@name="physical_reads"]/value)[1]', 'BIGINT') AS PhysicalReads,
    EventXML.value('(event/action[@name="sql_text"]/value)[1]', 'VARCHAR(MAX)') AS SQLText,
    EventXML.value('(event/action[@name="database_name"]/value)[1]', 'VARCHAR(128)') AS DatabaseName
FROM EventData;

7.3 การสอบถามข้อมูลบัฟเฟอร์ริง

ดึงข้อมูลจากเป้าหมาย ring_buffer:

SELECT
    n.value('(@name)[1]', 'VARCHAR(50)') AS EventName,
    n.value('(@timestamp)[1]', 'DATETIME2') AS Timestamp,
    n.value('(data[@name="duration"]/value)[1]', 'BIGINT') AS Duration,
    n.value('(action[@name="sql_text"]/value)[1]', 'VARCHAR(MAX)') AS SQLText
FROM (
    SELECT CAST(target_data AS XML) AS TargetData
    FROM sys.dm_xe_session_targets AS t
    JOIN sys.dm_xe_sessions AS s
        ON s.address = t.event_session_address
    WHERE s.name = 'YourSessionName'
        AND t.target_name = 'ring_buffer'
) AS Data
CROSS APPLY TargetData.nodes('//event') AS q(n);

7.4 มุมมองระบบสำหรับเหตุการณ์ที่ขยาย

SQL Server มี DMV และมุมมองแค็ตตาล็อกหลายรายการสำหรับการจัดการและติดตามเซสชันเหตุการณ์ขยาย

7.4.1 sys.server_event_sessions

ดูคำจำกัดความเซสชันที่เก็บไว้ในเซิร์ฟเวอร์:

SELECT
    name,
    event_retention_mode_desc,
    max_dispatch_latency,
    max_memory,
    max_event_size,
    memory_partition_mode_desc
FROM sys.server_event_sessions;

มุมมองแคตตาล็อกนี้แสดงรายละเอียดการกำหนดค่าสำหรับเซสชันที่กำหนดทั้งหมด

7.4.2 sys.dm_xe_sessions

ดูเซสชันที่ใช้งานอยู่ในปัจจุบัน:

SELECT
    name,
    create_time,
    total_regular_buffers,
    regular_buffer_size,
    total_large_buffers,
    large_buffer_size
FROM sys.dm_xe_sessions;

DMV นี้ให้ข้อมูลรันไทม์เกี่ยวกับเซสชัน Extended Event ที่ใช้งานอยู่

7.4.3 sys.dm_xe_session_targets

ดูเป้าหมายที่เกี่ยวข้องกับเซสชันที่ใช้งานอยู่:

SELECT
    s.name AS SessionName,
    t.target_name,
    t.execution_count,
    t.execution_duration_ms
FROM sys.dm_xe_session_targets AS t
JOIN sys.dm_xe_sessions AS s
    ON s.address = t.event_session_address;

7.4.4 DMV ที่เป็นประโยชน์อื่นๆ

มุมมองเพิ่มเติมให้ข้อมูลเซสชันที่ครอบคลุม:

  • sys.dm_xe_session_events: แสดงรายการเหตุการณ์ในเซสชันที่ใช้งานอยู่
  • sys.dm_xe_session_event_actions: แสดงการดำเนินการที่กำหนดค่าไว้สำหรับเหตุการณ์เซสชัน
  • sys.dm_xe_objects: รวบรวมเหตุการณ์ การกระทำ และเป้าหมายทั้งหมดที่มีอยู่
  • sys.dm_xe_object_columns: ฟิลด์รายละเอียดที่มีให้สำหรับประเภทเหตุการณ์แต่ละประเภท
  • sys.dm_xe_packages: แสดงรายการแพ็กเกจ Extended Event ทั้งหมด

8. กรณีการใช้งานจริงและตัวอย่าง

8.1 การตรวจสอบการดำเนินการคำสั่ง SQL

การติดตามการดำเนินการคำสั่ง SQL ช่วยให้เข้าใจรูปแบบแบบสอบถามและลักษณะประสิทธิภาพ

8.1.1 การติดตามเหตุการณ์ sql_statement_completed

สร้างเซสชันเพื่อตรวจสอบคำสั่ง SQL ที่เสร็จสมบูรณ์:

CREATE EVENT SESSION [QueryMonitoring] ON SERVER
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(
        sqlserver.sql_text,
        sqlserver.database_name,
        sqlserver.client_hostname,
        sqlserver.username
    )
)
ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\QueryMonitoring.xel',
        max_file_size=(100),
        max_rollover_files=(5)
)
WITH (
    MAX_MEMORY=4096 KB,
    EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
    MAX_DISPATCH_LATENCY=30 SECONDS,
    STARTUP_STATE=OFF
);

ALTER EVENT SESSION [QueryMonitoring] ON SERVER STATE = START;

8.1.2 การกรองตามฐานข้อมูลหรือแอปพลิเคชัน

มุ่งเน้นไปที่ฐานข้อมูลหรือแอปพลิเคชันเฉพาะโดยใช้คำทำนาย:

CREATE EVENT SESSION [AppSpecificMonitoring] ON SERVER
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(sqlserver.sql_text, sqlserver.client_app_name)
    WHERE (
        [sqlserver].[database_name] = N'YourDatabase'
        AND [sqlserver].[client_app_name] LIKE N'YourApplication%'
    )
)
ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\AppMonitoring.xel'
);

8.2 การจับข้อมูลเดดล็อก

การวิเคราะห์เดดล็อกต้องรวบรวมข้อมูลโดยละเอียดเกี่ยวกับธุรกรรมที่ขัดแย้ง

8.2.1 เหตุการณ์ xml_deadlock_report

สร้างเซสชันเพื่อจับภาพกราฟเดดล็อกที่สมบูรณ์:

CREATE EVENT SESSION [DeadlockMonitoring] ON SERVER
ADD EVENT sqlserver.xml_deadlock_report(
    ACTION(
        sqlserver.database_name,
        sqlserver.sql_text
    )
)
ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\Deadlocks.xel'
)
WITH (STARTUP_STATE=ON);

ALTER EVENT SESSION [DeadlockMonitoring] ON SERVER STATE = START;

8.2.2 การวิเคราะห์กราฟเดดล็อก

สกัดและวิเคราะห์ข้อมูลเดดล็อก:

SELECT
    EventXML.value('(event/@timestamp)[1]', 'DATETIME2') AS DeadlockTime,
    EventXML.query('.') AS DeadlockGraph
FROM (
    SELECT CAST(event_data AS XML) AS EventXML
    FROM sys.fn_xe_file_target_read_file(
        'C:\XEvents\Deadlocks*.xel',
        NULL, NULL, NULL
    )
) AS EventData
WHERE EventXML.value('(event/@name)[1]', 'VARCHAR(50)') = 'xml_deadlock_report';

กราฟเดดล็อกประกอบด้วยรายละเอียดเกี่ยวกับกระบวนการ ทรัพยากร และการเลือกเหยื่อ

8.3 การติดตามปัญหาประสิทธิภาพการทำงานของแบบสอบถาม

ระบุแบบสอบถามที่ทำงานได้ไม่ดีโดยใช้เมตริกระยะเวลาและการใช้ทรัพยากร

8.3.1 การตรวจจับแบบสอบถามแบบรันยาว

จับภาพแบบสอบถามที่เกินเกณฑ์ระยะเวลาที่กำหนด:

CREATE EVENT SESSION [LongRunningQueries] ON SERVER
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(
        sqlserver.sql_text,
        sqlserver.database_name,
        sqlserver.plan_handle
    )
    WHERE ([duration] > 5000000)  -- 5 seconds in microseconds
)
ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\LongQueries.xel'
);

8.3.2 การวิเคราะห์แผนการดำเนินการ

จับภาพแผนการสอบถามเพื่อการวิเคราะห์ประสิทธิภาพ:

CREATE EVENT SESSION [QueryPlans] ON SERVER
ADD EVENT sqlserver.query_post_execution_showplan(
    ACTION(
        sqlserver.sql_text,
        sqlserver.database_name
    )
    WHERE ([duration] > 10000000)  -- 10 seconds
)
ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\QueryPlans.xel',
    max_file_size=(200)
);

8.4 การตรวจสอบเหตุการณ์การเข้าสู่ระบบและความปลอดภัย

ติดตามกิจกรรมการตรวจสอบสิทธิ์และการอนุญาตเพื่อการตรวจสอบความปลอดภัย

8.4.1 การติดตามการเข้าสู่ระบบสำเร็จและล้มเหลว

ตรวจสอบความพยายามเข้าสู่ระบบทั้งที่สำเร็จและล้มเหลว:

CREATE EVENT SESSION [LoginMonitoring] ON SERVER
ADD EVENT sqlserver.login(
    ACTION(
        sqlserver.client_hostname,
        sqlserver.client_app_name
    )
),
ADD EVENT sqlserver.login_failed(
    ACTION(
        sqlserver.client_hostname
    )
)
ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\Logins.xel'
)
WITH (STARTUP_STATE=ON);

8.4.2 การเปลี่ยนแปลงการอนุญาต

ติดตามการแก้ไขการอนุญาตด้านความปลอดภัย:

CREATE EVENT SESSION [SecurityChanges] ON SERVER
ADD EVENT sqlserver.server_principal_management_event,
ADD EVENT sqlserver.database_principal_management_event,
ADD EVENT sqlserver.database_permission_change_event
ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\SecurityAudit.xel'
);

8.5 การตรวจสอบระดับฐานข้อมูล

ตรวจสอบการดำเนินงานเฉพาะฐานข้อมูลและการเปลี่ยนแปลงสถานะ

8.5.1 เหตุการณ์การสำรองและกู้คืน

ติดตามการสำรองข้อมูลและคืนค่าการดำเนินการ:

CREATE EVENT SESSION [BackupMonitoring] ON SERVER
ADD EVENT sqlserver.backup_restore_progress_trace,
ADD EVENT sqlserver.databases_backup_restore_event
ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\BackupRestore.xel'
);

8.5.2 การเปลี่ยนแปลงสถานะฐานข้อมูล

ตรวจสอบการเปลี่ยนแปลงสถานะฐานข้อมูล:

CREATE EVENT SESSION [DatabaseStateChanges] ON SERVER
ADD EVENT sqlserver.database_started,
ADD EVENT sqlserver.database_stopped
ADD TARGET package0.ring_buffer;

8.6 การตรวจจับปัญหาการทุจริตและความสมบูรณ์ของฐานข้อมูล

SQL Server Extended Events มอบความสามารถในการเตือนล่วงหน้าสำหรับการตรวจจับความเสียหายของฐานข้อมูลที่อาจเกิดขึ้น ช่วยให้สามารถดำเนินการเชิงรุกได้ก่อนที่ปัญหาจะลุกลาม

8.6.1 เหตุการณ์สำคัญสำหรับการตรวจจับการทุจริต

เหตุการณ์หลายอย่างบ่งชี้ถึงการทุจริตที่อาจเกิดขึ้นหรือปัญหา I/O

8.6.1.1 error_reported เหตุการณ์สำหรับข้อผิดพลาดร้ายแรง

เหตุการณ์ error_reported จะจับภาพทั้งหมด SQL Server ข้อผิดพลาด รวมถึงหมายเลขข้อผิดพลาดที่เกี่ยวข้องกับการทุจริต:

ADD EVENT sqlserver.error_reported(
    WHERE (
        [severity] >= (20)
        OR [error_number] IN (823, 824, 825, 832, 855, 856)
    )
)

ข้อผิดพลาด 823 ระบุข้อผิดพลาด I/O, 824 ส่งสัญญาณข้อผิดพลาดความสอดคล้องทางตรรกะ และ 825 รายงานความสำเร็จในการอ่านซ้ำซึ่งอาจบ่งชี้ถึงปัญหาฮาร์ดแวร์

8.6.1.2 เหตุการณ์ database_suspect_data_page

เหตุการณ์นี้เกิดขึ้นเมื่อ SQL Server พบกับหน้าผู้ต้องสงสัย:

ADD EVENT sqlserver.database_suspect_data_page

หน้าที่น่าสงสัยระบุถึงการทุจริตที่อาจเกิดขึ้นและจะถูกบันทึกไว้ในตาราง msdb.dbo.suspect_pages

8.6.1.3 เหตุการณ์ errorlog_write

บันทึกรายการที่ถูกเขียนลงใน SQL Server บันทึกข้อผิดพลาด:

ADD EVENT sqlserver.errorlog_written(
    WHERE ([severity] >= (16))
)

8.6.2 การสร้างเซสชันการตรวจสอบการทุจริต

จัดตั้งเซสชันที่ครอบคลุมสำหรับการตรวจจับและการติดตามการทุจริต

8.6.2.1 การกรองหมายเลขข้อผิดพลาดการทุจริต (823, 824, 825)

จัดประชุมเฉพาะเจาะจงโดยมุ่งเน้นไปที่ตัวชี้วัดการทุจริต:

CREATE EVENT SESSION [CorruptionDetection] ON SERVER
ADD EVENT sqlserver.error_reported(
    ACTION(
        sqlserver.database_name,
        sqlserver.sql_text
    )
    WHERE (
        [error_number] IN (823, 824, 825, 832, 855, 856)
        OR [severity] >= (20)
    )
),
ADD EVENT sqlserver.database_suspect_data_page(
    ACTION(
        sqlserver.database_name
    )
)
8.6.2.2 การกำหนดระดับความรุนแรงที่เหมาะสม

รวมถึงข้อผิดพลาดร้ายแรงที่อาจบ่งชี้ถึงการทุจริต:

WHERE (
    [severity] >= (20)
    OR [error_number] IN (823, 824, 825)
)

ระดับความรุนแรง 20 ขึ้นไปบ่งชี้ถึงปัญหาในระดับระบบที่มักเกี่ยวข้องกับการทุจริต

8.6.2.3 การกำหนดค่าไฟล์เป้าหมายเหตุการณ์สำหรับการแจ้งเตือน

จัดเก็บเหตุการณ์การทุจริตเพื่อวิเคราะห์และแจ้งเตือน:

ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\CorruptionMonitoring.xel',
        max_file_size=(50),
        max_rollover_files=(10)
)
WITH (
    STARTUP_STATE=ON,
    MAX_DISPATCH_LATENCY=5 SECONDS
);

ALTER EVENT SESSION [CorruptionDetection] ON SERVER STATE = START;

8.6.3 การวิเคราะห์ข้อมูลเหตุการณ์การทุจริต

สกัดและตีความเหตุการณ์ที่เกี่ยวข้องกับการทุจริตจากข้อมูลที่จับได้

8.6.3.1 การระบุหน้าผู้ต้องสงสัย

แบบสอบถามสำหรับเหตุการณ์ database_suspect_data_page:

SELECT
    EventXML.value('(event/@timestamp)[1]', 'DATETIME2') AS EventTime,
    EventXML.value('(event/data[@name="database_id"]/value)[1]', 'INT') AS DatabaseID,
    EventXML.value('(event/data[@name="file_id"]/value)[1]', 'INT') AS FileID,
    EventXML.value('(event/data[@name="page_id"]/value)[1]', 'BIGINT') AS PageID,
    EventXML.value('(event/action[@name="database_name"]/value)[1]', 'VARCHAR(128)') AS DatabaseName
FROM (
    SELECT CAST(event_data AS XML) AS EventXML
    FROM sys.fn_xe_file_target_read_file(
        'C:\XEvents\CorruptionMonitoring*.xel',
        NULL, NULL, NULL
    )
) AS EventData
WHERE EventXML.value('(event/@name)[1]', 'VARCHAR(50)') = 'database_suspect_data_page';
8.6.3.2 การแยกรายละเอียดข้อผิดพลาดและบริบท

วิเคราะห์เหตุการณ์ที่รายงานข้อผิดพลาดสำหรับรูปแบบการทุจริต:

SELECT
    EventXML.value('(event/@timestamp)[1]', 'DATETIME2') AS ErrorTime,
    EventXML.value('(event/data[@name="error_number"]/value)[1]', 'INT') AS ErrorNumber,
    EventXML.value('(event/data[@name="severity"]/value)[1]', 'INT') AS Severity,
    EventXML.value('(event/data[@name="message"]/value)[1]', 'VARCHAR(MAX)') AS ErrorMessage,
    EventXML.value('(event/action[@name="database_name"]/value)[1]', 'VARCHAR(128)') AS DatabaseName,
    EventXML.value('(event/action[@name="sql_text"]/value)[1]', 'VARCHAR(MAX)') AS SQLText
FROM (
    SELECT CAST(event_data AS XML) AS EventXML
    FROM sys.fn_xe_file_target_read_file(
        'C:\XEvents\CorruptionMonitoring*.xel',
        NULL, NULL, NULL
    )
) AS EventData
WHERE EventXML.value('(event/@name)[1]', 'VARCHAR(50)') = 'error_reported'
    AND EventXML.value('(event/data[@name="error_number"]/value)[1]', 'INT') IN (823, 824, 825);

8.6.4 การบูรณาการกับ DBCC CHECKDB

ใช้ข้อมูลเหตุการณ์ขยายเพื่อเป็นแนวทาง DBCC CHECKDB การดำเนินการ

8.6.4.1 การเรียกใช้ DBCC CHECKDB ตามเหตุการณ์

เมื่อตรวจพบเหตุการณ์ทุจริต ให้ดำเนินการ DBCC CHECKDB เพื่อตรวจสอบอย่างครอบคลุม:

-- After detecting corruption events, run DBCC CHECKDB
DBCC CHECKDB ('YourDatabaseName') WITH NO_INFOMSGS, ALL_ERRORMSGS;

Extended Events จะให้คำเตือนล่วงหน้า ในขณะที่ DBCC CHECKDB ดำเนินการตรวจสอบอย่างละเอียด

8.6.4.2 เวิร์กโฟลว์การตอบสนองต่อการทุจริตอัตโนมัติ

นำการตอบสนองอัตโนมัติมาใช้โดยการตรวจสอบไฟล์เหตุการณ์:

  1. กำหนดค่า SQL Server งานตัวแทนจะต้องสอบถามไฟล์เหตุการณ์การตรวจสอบการทุจริตเป็นระยะๆ
  2. เมื่อพบเหตุการณ์ทุจริต ให้ดำเนินการ DBCC CHECKDB บนฐานข้อมูลที่ได้รับผลกระทบ
  3. ส่งการแจ้งเตือนทางอีเมลถึง DBA พร้อมรายละเอียดเหตุการณ์และผลลัพธ์ DBCC CHECKDB
  4. บันทึกผลการค้นพบลงในตารางการตรวจสอบแบบรวมศูนย์เพื่อวิเคราะห์แนวโน้ม
8.6.4.3 การสร้างสมดุลระหว่างการตรวจสอบเชิงรุกกับประสิทธิภาพ

Extended Events มอบการตรวจจับการทุจริตที่มีค่าใช้จ่ายต่ำเมื่อเทียบกับการดำเนินการ DBCC CHECKDB บ่อยครั้ง:

  • เรียกใช้ Extended Events อย่างต่อเนื่องเพื่อตรวจจับการทุจริตแบบเรียลไทม์
  • ดำเนินการ DBCC CHECKDB เฉพาะเมื่อตัวบ่งชี้การทุจริตปรากฏขึ้น
  • กำหนดเวลา DBCC CHECKDB เป็นประจำในช่วงเวลาการบำรุงรักษา
  • ใช้เหตุการณ์ที่ขยายเพื่อระบุฐานข้อมูลที่ต้องการความสนใจทันที

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

8.6.4.4 ซ่อมแซมฐานข้อมูลที่เสียหาย

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

9. เหตุการณ์ขยายขอบเขตเซิร์ฟเวอร์เทียบกับขอบเขตฐานข้อมูล

9.1 เซสชันเหตุการณ์ที่กำหนดขอบเขตเซิร์ฟเวอร์

เซสชันที่มีขอบเขตเซิร์ฟเวอร์จะตรวจสอบกิจกรรมทั่วทั้ง SQL Server อินสแตนซ์ เซสชันเหล่านี้ถูกสร้างขึ้นโดยใช้คำสั่ง ON SERVER และคงอยู่ในฐานข้อมูลหลัก

CREATE EVENT SESSION [ServerWideMonitoring] ON SERVER
ADD EVENT sqlserver.sql_statement_completed
ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\ServerWide.xel'
);

เซสชันที่มีขอบเขตเซิร์ฟเวอร์จะบันทึกเหตุการณ์จากฐานข้อมูลทั้งหมดและเหมาะสำหรับการตรวจสอบในระดับอินสแตนซ์

9.2 เซสชันเหตุการณ์ที่กำหนดขอบเขตฐานข้อมูล (ฐานข้อมูล Azure SQL)

เซสชันที่มีขอบเขตฐานข้อมูลจะจำกัดอยู่ที่ฐานข้อมูลเดียวและส่วนใหญ่จะใช้ในฐานข้อมูล Azure SQL ที่การเข้าถึงระดับเซิร์ฟเวอร์ถูกจำกัด:

CREATE EVENT SESSION [DatabaseSpecificMonitoring] ON DATABASE
ADD EVENT sqlserver.sql_statement_completed
ADD TARGET package0.event_file(
    SET filename=N'DatabaseMonitoring.xel'
);

ใน Azure SQL Database ไฟล์เหตุการณ์จะถูกเก็บไว้ใน Azure Blob Storage แทนที่จะอยู่ในระบบไฟล์ภายในเครื่อง

9.3 ความแตกต่างและกรณีการใช้งาน

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

ใช้เซสชันที่จำกัดขอบเขตเซิร์ฟเวอร์สำหรับการตรวจสอบแบบรวมศูนย์ การแก้ไขปัญหาประสิทธิภาพการทำงานข้ามฐานข้อมูล และการตรวจสอบความปลอดภัย ใช้เซสชันที่จำกัดขอบเขตฐานข้อมูลใน Azure SQL Database, สภาพแวดล้อมแบบหลายผู้เช่า หรือเมื่อมอบหมายความรับผิดชอบในการตรวจสอบให้กับทีมแอปพลิเคชัน

10. เหตุการณ์ขยายในฐานข้อมูล Azure SQL

10.1 ข้อควรพิจารณาเฉพาะ Azure

Azure SQL Database นำ Extended Events มาใช้โดยมีความแตกต่างบางประการจากแบบภายในองค์กร SQL Serverเซสชันจะมีขอบเขตของฐานข้อมูลตามค่าเริ่มต้น และการจัดเก็บไฟล์เหตุการณ์จะใช้ Azure Blob Storage แทนระบบไฟล์ภายในเครื่อง

การตรวจสอบสิทธิ์ในการเข้าถึง Azure Blob Storage จำเป็นต้องใช้โทเค็น SAS ที่กำหนดค่าไว้ภายในไฟล์เป้าหมายของเหตุการณ์ สตริงการเชื่อมต่อจะอ้างอิงถึงบัญชีเก็บข้อมูลและคอนเทนเนอร์ที่จัดเก็บไฟล์เหตุการณ์ไว้

10.2 เป้าหมายที่ใช้งานได้ใน Azure

Azure SQL Database รองรับเป้าหมาย Extended Event ต่อไปนี้:

  • event_file: เขียนไปยัง Azure Blob Storage
  • ring_buffer: ที่เก็บข้อมูลบนหน่วยความจำที่มีพฤติกรรมแบบเดียวกับภายในองค์กร
  • event_counter: นับจำนวนเหตุการณ์ที่เกิดขึ้น

เป้าหมาย event_file จำเป็นต้องกำหนดค่าด้วยข้อมูลรับรอง Azure Blob Storage:

ADD TARGET package0.event_file(
    SET filename=N'https://yourstorageaccount.blob.core.windows.net/container/EventFile.xel'
)

10.3 การสร้างเซสชันที่มีขอบเขตฐานข้อมูล

สร้างเซสชันในฐานข้อมูล Azure SQL:

CREATE EVENT SESSION [AzureMonitoring] ON DATABASE
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(sqlserver.sql_text, sqlserver.database_name)
)
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY=4096 KB);

ALTER EVENT SESSION [AzureMonitoring] ON DATABASE STATE = START;

เซสชันที่มีขอบเขตของฐานข้อมูลใน Azure จะทำงานคล้ายกับเซสชันที่มีขอบเขตของเซิร์ฟเวอร์ภายในองค์กร แต่มีขอบเขตจำกัดเฉพาะฐานข้อมูลปัจจุบัน

11. แนวทางปฏิบัติที่ดีที่สุดและการเพิ่มประสิทธิภาพการทำงาน

11.1 การลดผลกระทบต่อประสิทธิภาพให้น้อยที่สุด

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

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

11.2 การเลือกเหตุการณ์และตัวกรองที่ถูกต้อง

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

ตัวอย่างเช่น แทนที่จะจับเหตุการณ์ sql_statement_completed ทั้งหมด ให้กรองตามฐานข้อมูลเฉพาะหรือเกณฑ์ระยะเวลา:

WHERE (
    [sqlserver].[database_name] = N'ProductionDB'
    AND [duration] > 1000000
)

11.3 หลักเกณฑ์การคัดเลือกเป้าหมาย

เลือกเป้าหมายตามความต้องการในการวิเคราะห์ของคุณ:

  • ใช้ event_file เพื่อวิเคราะห์ประวัติโดยละเอียดและการเก็บรักษาในระยะยาว
  • ใช้ ring_buffer สำหรับการตรวจสอบแบบเรียลไทม์โดยมีผลกระทบต่อ I/O น้อยที่สุด
  • ใช้ event_counter เมื่อมีเพียงความถี่เท่านั้นที่มีความสำคัญ
  • ใช้ฮิสโทแกรมเพื่อการวิเคราะห์การกระจาย
  • ใช้ pair_matching เพื่อวิเคราะห์เหตุการณ์ที่สัมพันธ์กัน

11.4 คำแนะนำการกำหนดค่าเซสชัน

กำหนดค่าเซสชันด้วยขีดจำกัดทรัพยากรที่เหมาะสม:

  • ตั้งค่า MAX_MEMORY ตามปริมาณเหตุการณ์ที่คาดหวังและทรัพยากรเซิร์ฟเวอร์
  • ใช้ ALLOW_SINGLE_EVENT_LOSS เพื่อลดภาระการทำงานให้น้อยที่สุดในสถานการณ์ส่วนใหญ่
  • ตั้งค่า MAX_DISPATCH_LATENCY เพื่อสร้างสมดุลระหว่างความต้องการแบบเรียลไทม์กับประสิทธิภาพ
  • ใช้การแบ่งพาร์ติชันหน่วยความจำ PER_CPU บนระบบมัลติโปรเซสเซอร์
  • หลีกเลี่ยงการตั้งค่า STARTUP_STATE=ON เว้นแต่จำเป็นต้องมีการตรวจสอบอย่างต่อเนื่อง

11.5 การจัดการขนาดไฟล์เหตุการณ์และการเก็บรักษา

กำหนดค่าการหมุนเวียนไฟล์เพื่อป้องกันการใช้งานดิสก์ที่ไม่จำกัด:

ADD TARGET package0.event_file(
    SET filename=N'C:\XEvents\Session.xel',
        max_file_size=(100),
        max_rollover_files=(10)
)

การกำหนดค่านี้จะรักษาข้อมูลเหตุการณ์ไว้ประมาณ 1 GB (10 ไฟล์ × 100 MB) สามารถปรับได้ตามข้อกำหนดการเก็บรักษาและพื้นที่เก็บข้อมูลที่มีอยู่ของคุณ

12. การแก้ไขปัญหาเหตุการณ์ที่ขยายออกไป

12.1 ปัญหาทั่วไปและแนวทางแก้ไข

ปัญหาที่พบบ่อยใน Extended Events ได้แก่ เซสชันไม่สามารถบันทึกข้อมูลได้ ประสิทธิภาพการทำงานลดลง ปัญหาเกี่ยวกับไฟล์เป้าหมาย และพฤติกรรมของเซสชันที่ไม่คาดฝัน

12.2 เซสชันไม่จับข้อมูล

หากเซสชันไม่ได้บันทึกเหตุการณ์ที่คาดหวัง:

  1. ตรวจสอบว่าเซสชันเริ่มต้นแล้วโดยใช้ sys.dm_xe_sessions
  2. ตรวจสอบคำทำนายเพื่อให้แน่ใจว่าไม่ได้กรองเหตุการณ์ทั้งหมดออกไป
  3. ตรวจสอบว่าเหตุการณ์ทำงานถูกต้องหรือไม่ โดยการลบตัวกรองออกชั่วคราว
  4. ตรวจสอบสิทธิ์ในการอนุญาตเพื่อให้แน่ใจว่าคุณสามารถเข้าถึงข้อมูลเซสชันได้
  5. ตรวจสอบว่าการกำหนดค่าเป้าหมายถูกต้องและสามารถเขียนได้
SELECT name, create_time
FROM sys.dm_xe_sessions
WHERE name = 'YourSessionName';

12.3 การเสื่อมประสิทธิภาพ

หากเหตุการณ์ที่ขยายทำให้เกิดปัญหาด้านประสิทธิภาพ:

  1. เพิ่มคำทำนายเพื่อลดปริมาณเหตุการณ์
  2. ลบขั้นตอนที่ไม่จำเป็นซึ่งรวบรวมข้อมูลเพิ่มเติมออกไป
  3. เพิ่ม MAX_DISPATCH_LATENCY เพื่อลดความถี่ในการเขียน
  4. เปลี่ยน EVENT_RETENTION_MODE เป็น ALLOW_SINGLE_EVENT_LOSS
  5. พิจารณาใช้ ring_buffer แทน event_file สำหรับเหตุการณ์ความถี่สูง

12.4 ปัญหาเป้าหมายไฟล์

ปัญหาเกี่ยวกับไฟล์เป้าหมายมักเกี่ยวข้องกับสิทธิ์การเข้าถึงหรือพื้นที่ดิสก์:

  1. ตรวจสอบ SQL Server บัญชีบริการมีสิทธิ์ในการเขียนไปยังไดเร็กทอรีเป้าหมาย
  2. ตรวจสอบให้แน่ใจว่ามีเนื้อที่ว่างบนดิสก์เพียงพอ
  3. ตรวจสอบว่าเส้นทางที่ระบุมีอยู่และสามารถเข้าถึงได้
  4. ตรวจสอบการกำหนดค่าการหมุนเวียนไฟล์หากไฟล์ไม่ได้หมุนเวียนตามที่คาดหวัง

12.5 การดีบักด้วยมุมมองระบบ

ใช้ DMV เพื่อวินิจฉัยปัญหาเหตุการณ์ขยาย:

-- Check session status
SELECT s.name, s.create_time, s.total_regular_buffers, s.total_large_buffers
FROM sys.dm_xe_sessions AS s;

-- View session targets and their status
SELECT
    s.name AS SessionName,
    t.target_name,
    t.execution_count,
    CAST(t.target_data AS XML) AS TargetData
FROM sys.dm_xe_session_targets AS t
JOIN sys.dm_xe_sessions AS s
    ON s.address = t.event_session_address;

-- Check for dropped events
SELECT s.name, s.dropped_event_count, s.dropped_buffer_count
FROM sys.dm_xe_sessions AS s;

13. หัวข้อขั้นสูง

13.1 การสร้างแพ็คเกจกิจกรรมที่กำหนดเอง

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

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

13.2 เทมเพลตเซสชันกิจกรรม

SSMS มีเทมเพลตในตัวสำหรับสถานการณ์การตรวจสอบทั่วไป เข้าถึงเทมเพลตเมื่อสร้างเซสชันใหม่ผ่านตัวช่วยสร้าง:

  1. ในกล่องโต้ตอบเซสชันใหม่ ให้คลิก แบบ หล่นลง.
  2. เลือกจากเทมเพลตที่มี เช่น การติดตามรายละเอียดแบบสอบถาม หรือสุขภาพระบบ
  3. ปรับเปลี่ยนเทมเพลตให้เหมาะกับความต้องการเฉพาะของคุณ

13.3 การบูรณาการกับโซลูชันการตรวจสอบ

ข้อมูลเหตุการณ์ที่ขยายออกไปสามารถป้อนให้กับโซลูชันการตรวจสอบองค์กรได้:

  • ส่งออกข้อมูลเหตุการณ์ไปยังระบบบันทึกข้อมูลแบบรวมศูนย์
  • แยกไฟล์เหตุการณ์และโหลดข้อมูลลงในฐานข้อมูลการตรวจสอบ
  • สร้างแดชบอร์ดแบบกำหนดเองโดยใช้เครื่องมือ BI
  • การแจ้งเตือนทริกเกอร์ตามรูปแบบเหตุการณ์เฉพาะ
  • ความสัมพันธ์ SQL Server เหตุการณ์ที่มีเมตริกแอปพลิเคชันและโครงสร้างพื้นฐาน

13.4 ระบบอัตโนมัติและการกำหนดตารางเวลา

การจัดการเหตุการณ์ขยายแบบอัตโนมัติโดยใช้ SQL Server ตัวแทน:

  • สร้างงานเพื่อเริ่ม/หยุดเซสชันในช่วงเวลาที่กำหนด
  • กำหนดเวลาการวิเคราะห์และการรายงานไฟล์เหตุการณ์
  • ดำเนินการตามนโยบายการเก็บรักษาข้อมูลโดยเก็บถาวรหรือลบไฟล์เหตุการณ์เก่า
  • ตอบสนองอัตโนมัติต่อเงื่อนไขที่ตรวจพบ เช่น ปัญหาประสิทธิภาพการทำงานหรือเหตุการณ์ด้านความปลอดภัย

14. การย้ายถิ่นฐานจาก SQL Server Profiler

14.1 SQL Server การแมปเหตุการณ์โปรไฟเลอร์ไปยังเหตุการณ์ขยาย

Microsoft จัดทำแผนที่ระหว่าง SQL Server Profiler เหตุการณ์และเหตุการณ์ขยาย การแมปทั่วไปประกอบด้วย:

  • SQL:BatchCompleted -> sql_batch_completed
  • SQL:BatchStarting -> sql_batch_starting
  • SQL:StmtCompleted -> sql_statement_completed
  • SQL:StmtStarting -> sql_statement_starting
  • กราฟเดดล็อก -> xml_deadlock_report
  • เข้าสู่ระบบการตรวจสอบ -> เข้าสู่ระบบ
  • ตรวจสอบการออกจากระบบ -> ออกจากระบบ

14.2 การแปลงคำจำกัดความของร่องรอย

แปลงที่มีอยู่ SQL Server โปรไฟเลอร์ติดตามเซสชันเหตุการณ์ที่ขยายโดยการระบุเหตุการณ์ที่เทียบเท่าและกำหนดค่าเพรดิเคตที่เหมาะสม SSMS ให้ความช่วยเหลือสำหรับการแปลงทั่วไป

ตรวจสอบตัวกรองการติดตามและแปลงเป็นเพรดิเคตเหตุการณ์ที่ขยาย การดำเนินการในเหตุการณ์ที่ขยายจะแทนที่คอลัมน์การติดตามจาก SQL Server Profiler

14.3 การเปรียบเทียบประสิทธิภาพ

เหตุการณ์ที่ขยายออกไปนั้นให้ประสิทธิภาพที่ดีกว่าอย่างเห็นได้ชัด SQL Server โปรไฟเลอร์ การศึกษาเปรียบเทียบประสิทธิภาพแสดงให้เห็นว่า Extended Events ใช้รอบ CPU น้อยลงและมีผลกระทบต่อปริมาณงานธุรกรรมน้อยลง

เหตุการณ์ที่ขยายใช้การประมวลผลแบบอะซิงโครนัสและการจัดการหน่วยความจำที่ปรับให้เหมาะสมในขณะที่ SQL Server โปรไฟเลอร์จะอาศัยการจับเหตุการณ์แบบซิงโครนัสที่บล็อกจนกว่าการประมวลผลการติดตามจะเสร็จสิ้น

15 ข้อสรุป

15.1 สรุปแนวคิดหลัก

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

สามารถสร้างเซสชันได้โดยใช้ SSMS หรือ T-SQL ซึ่งให้ความยืดหยุ่นทั้งในการแก้ไขปัญหาเฉพาะหน้าและการตรวจสอบอัตโนมัติ ประเภทเป้าหมายหลายประเภทสนับสนุนวิธีการวิเคราะห์ที่แตกต่างกัน ตั้งแต่การตรวจสอบแบบเรียลไทม์ด้วย ring_buffer ไปจนถึงการวิเคราะห์ข้อมูลในอดีตด้วย event_file

Extended Events มอบประสิทธิภาพที่เหนือกว่าเมื่อเทียบกับ SQL Server Profiler พร้อมมอบความสามารถในการตรวจสอบที่ครอบคลุมยิ่งขึ้น ระบบนี้ช่วยให้ผู้ดูแลระบบและนักพัฒนาฐานข้อมูลสามารถวินิจฉัยปัญหา เพิ่มประสิทธิภาพการทำงาน ยกระดับความปลอดภัย และรักษาการปฏิบัติตามข้อกำหนด

15.2 ขั้นตอนต่อไปและทรัพยากรเพิ่มเติม

เพื่อพัฒนาคุณอย่างต่อเนื่อง SQL Server ความเชี่ยวชาญของ XEvents:

  • นำ Extended Events ไปใช้ในสภาพแวดล้อมการทดสอบเพื่อรับประสบการณ์จริง
  • ตรวจสอบเอกสารของ Microsoft เพื่อดูแค็ตตาล็อกเหตุการณ์ที่สมบูรณ์และการอ้างอิงไวยากรณ์โดยละเอียด
  • ร่วมเป็นผู้ขายกับเราที่ SQL Server ฟอรัมชุมชนเพื่อเรียนรู้จากประสบการณ์ของผู้อื่น
  • สำรวจสถานการณ์ขั้นสูงเช่นแพ็คเกจที่กำหนดเองและการบูรณาการกับแพลตฟอร์มการตรวจสอบ
  • พัฒนาคลังเทมเพลตเซสชันสำหรับสถานการณ์การตรวจสอบทั่วไป

16 ส่วนคำถามที่พบบ่อย

ถาม: คืออะไร SQL Server กิจกรรมขยายเวลา?

A: SQL Server Extended Events เป็นระบบตรวจสอบประสิทธิภาพน้ำหนักเบาที่รวมเข้ากับ SQL Server เครื่องมือฐานข้อมูลที่รวบรวมข้อมูลรายละเอียดเกี่ยวกับการทำงานของเซิร์ฟเวอร์ด้วยค่าใช้จ่ายขั้นต่ำ

ถาม: กิจกรรมที่ขยายออกไปแตกต่างจาก SQL Server โปรไฟเลอร์?

A: เหตุการณ์ที่ขยายออกไปนั้นมีประสิทธิภาพที่ดีกว่า ค่าใช้จ่ายที่ต่ำกว่า และการกำหนดค่าที่ยืดหยุ่นกว่า SQL Server Profiler SQL Server Profiler ไม่รองรับอีกต่อไปแล้ว และ Microsoft แนะนำให้ใช้ Extended Events สำหรับงานการตรวจสอบทั้งหมด

ถาม: เหตุการณ์ที่ขยายออกไปสามารถส่งผลกระทบได้หรือไม่ SQL Server ประสิทธิภาพ?

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

ถาม: ต้องมีสิทธิ์อนุญาตอะไรบ้างในการสร้างเซสชันกิจกรรมขยาย?

A: คุณต้องมีสิทธิ์อนุญาต ALTER ANY EVENT SESSION สำหรับเซสชันที่อยู่ในขอบเขตของเซิร์ฟเวอร์ หรือมีสิทธิ์อนุญาต CONTROL บนฐานข้อมูลสำหรับเซสชันที่อยู่ในขอบเขตของฐานข้อมูล

ถาม: ฉันจะดูข้อมูลเหตุการณ์ขยายได้อย่างไร

ก. การใช้ SQL Server โปรแกรมดูข้อมูลแบบเรียลไทม์ของ Management Studio, สามารถสอบถามไฟล์เหตุการณ์ด้วย sys.fn_xe_file_target_read_file หรือสอบถามข้อมูลบัฟเฟอร์วงแหวนผ่าน DMV ได้

ถาม: Extended Events สามารถตรวจจับความเสียหายของฐานข้อมูลได้หรือไม่

A: ใช่ Extended Events สามารถจับข้อผิดพลาดที่เกี่ยวข้องกับการทุจริต (823, 824, 825) และเหตุการณ์หน้าที่น่าสงสัยได้ โดยให้คำเตือนล่วงหน้าสำหรับปัญหาการทุจริตที่อาจเกิดขึ้น

ถาม: ความแตกต่างระหว่างเหตุการณ์ การกระทำ และคำทำนายคืออะไร?

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

ถาม: ฉันจะตรวจสอบแบบสอบถามจากแอปพลิเคชันหรือฐานข้อมูลเฉพาะได้อย่างไร

ก: ใช้คำทำนายในการกำหนดค่าเหตุการณ์ของคุณเพื่อกรองตาม database_name, client_app_name หรือฟิลด์ที่เกี่ยวข้องอื่นๆ

ถาม: ฉันควรใช้เป้าหมายใดสำหรับ Extended Events?

A: ใช้ event_file สำหรับการจัดเก็บถาวรและการวิเคราะห์ประวัติ, ring_buffer สำหรับการตรวจสอบแบบเรียลไทม์ด้วยโอเวอร์เฮดต่ำ, event_counter สำหรับการติดตามความถี่แบบง่าย และฮิสโทแกรมสำหรับการวิเคราะห์การกระจาย

ถาม: มี Extended Events ให้ใช้ใน Azure SQL Database หรือไม่

ตอบ: ใช่ Azure SQL Database รองรับ Extended Events ที่อยู่ในขอบเขตฐานข้อมูลโดยมีไฟล์เหตุการณ์ที่เก็บไว้ใน Azure Blob Storage

ถาม: ฉันจะแก้ไขปัญหาเซสชันเหตุการณ์ขยายที่ไม่ได้บันทึกข้อมูลได้อย่างไร

A: ตรวจสอบว่าเซสชันเริ่มต้นแล้ว ตรวจสอบว่าเงื่อนไขไม่ได้กรองเหตุการณ์ทั้งหมด ยืนยันการกำหนดค่าเป้าหมาย และตรวจสอบสิทธิ์โดยใช้ DMV ของระบบ

ถาม: ฉันสามารถจัดการ Extended Events โดยอัตโนมัติได้หรือไม่

A: ใช่ครับ ใช้ SQL Server หน้าที่ของเอเจนต์ ได้แก่ การเริ่มต้น/หยุดเซสชัน การวิเคราะห์ไฟล์เหตุการณ์ การบังคับใช้นโยบายการเก็บรักษาข้อมูล และการตอบสนองต่อเงื่อนไขที่ตรวจพบ

อ้างอิง


เกี่ยวกับผู้เขียน

หยวน เซิง เป็นผู้ดูแลฐานข้อมูลอาวุโส (DBA) ที่มีประสบการณ์มากกว่า 10 ปีใน SQL Server สภาพแวดล้อมและการจัดการฐานข้อมูลองค์กร เขาประสบความสำเร็จในการแก้ไขปัญหาการกู้คืนฐานข้อมูลหลายร้อยกรณีในองค์กรด้านบริการทางการเงิน การดูแลสุขภาพ และการผลิต

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

ด้วยความเชี่ยวชาญทางเทคนิคและแนวทางปฏิบัติ Yuan มุ่งเน้นที่การสร้างคู่มือที่ครอบคลุมซึ่งจะช่วยให้ผู้ดูแลระบบฐานข้อมูลและผู้เชี่ยวชาญด้านไอทีแก้ไขปัญหาที่ซับซ้อน SQL Server ท้าทายอย่างมีประสิทธิภาพ เขาคอยติดตามข่าวสารล่าสุดอยู่เสมอ SQL Server การเปิดตัวและเทคโนโลยีฐานข้อมูลที่พัฒนาอย่างต่อเนื่องของ Microsoft ทดสอบสถานการณ์การกู้คืนเป็นประจำเพื่อให้แน่ใจว่าคำแนะนำของเขาสะท้อนถึงแนวทางปฏิบัติที่ดีที่สุดในโลกแห่งความเป็นจริง

มีคำถามเกี่ยวกับ SQL Server การกู้คืนหรือต้องการคำแนะนำในการแก้ไขปัญหาฐานข้อมูลเพิ่มเติมหรือไม่? หยวนยินดีต้อนรับ ข้อเสนอแนะและข้อเสนอแนะ เพื่อปรับปรุงทรัพยากรทางเทคนิคเหล่านี้

แบ่งปันเลย: