การติดตามแบบสอบถามของ Oracle ติดตามเซสชันของบุคคลอื่นใน ORACLE oracle_trace คืออะไร

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

ยังไง... ?

วิธีค้นหาวัตถุที่เป็นแหล่งกำเนิดของเหตุการณ์ทั้งหมด บัฟเฟอร์ไม่ว่างรอซึ่งสามารถเห็นได้ในมุมมอง v$รอสถิติ?

เราทุกคนได้อ่านคู่มือการปรับแต่งประสิทธิภาพแล้ว: "ถ้าคุณเห็น... คุณอาจต้องเพิ่มจำนวนรายการ ที่นั่งฟรี (รายการอิสระ) สำหรับตารางที่มีปัญหา" แต่ไม่ได้บอกว่าจะหาตารางที่มีปัญหามากนี้ได้อย่างไร

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

ตัวเลือกที่ 2: เปิดใช้งานเหตุการณ์ 10046 ที่ระดับ 8 และรับสตรีมข้อมูลการรอในไฟล์การติดตาม มันสร้างความเครียดให้กับระบบมากและยังต้องใช้โชคอีกด้วย

ตัวเลือกที่ 3: มีเหตุการณ์ (10240) ที่ควรสร้างรายการที่อยู่บล็อกในไฟล์การติดตามที่เรากำลังรอ (เย้!) แต่ฉันยังไม่สามารถทำให้เหตุการณ์นี้ทำงานได้ หากคุณรู้วิธีการทำเช่นนี้โปรดแจ้งให้เราทราบด้วย การตัดสินใจครั้งนี้เหมาะสมที่สุดอย่างแน่นอน

ดังนั้น คุณต้องการรับรายการบล็อกที่คุณต้องรอ พร้อมด้วย ID ของเซสชันการรอ เหตุผลและระยะเวลาของการรอ ทั้งหมดนี้มี ต้นทุนขั้นต่ำทรัพยากร? นี่คือสิ่งที่ช่วยให้คุณได้รับ oracle_trace.

oracle_trace คืออะไร

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

เหตุการณ์เหล่านี้รวมถึงการรอ การเชื่อมต่อ การยกเลิกการเชื่อมต่อ การแยกวิเคราะห์และการดำเนินการค้นหา การดึงแถว และอื่นๆ

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

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

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

การใช้เครื่องมือ oracle_trace

แล้วยังไงล่ะ oracle_traceช่วยตอบคำถามเดิม?

แบบง่าย: หนึ่งในคลาสของเหตุการณ์ที่สามารถติดตามได้คือการรอ คุณต้องตรวจสอบว่าเซิร์ฟเวอร์ทำงานในโหมดที่อนุญาตให้คุณเปิดใช้งานการติดตาม จากนั้นขอให้เซิร์ฟเวอร์ดำเนินการดังกล่าว (ไม่ว่าจะใช้ PL/SQL หรือจาก บรรทัดคำสั่ง) เริ่มการติดตามการรอ ในเวลาเดียวกัน เราจำกัดชุดกิจกรรมรอไว้เฉพาะกิจกรรมเท่านั้น 92 (นี้ บัฟเฟอร์ไม่ว่างรอใน Oracle 9i แต่ให้ตรวจสอบค่าคอลัมน์เผื่อไว้ เหตุการณ์#และ ชื่อจากมุมมอง v$event_nameในระบบของคุณ) จากนั้นคุณก็ต้องนั่งรอประมาณหนึ่งชั่วโมงในช่วงที่รู้สึกว่าปัญหารุนแรงที่สุด เมื่อเราได้รับเพียงพอ ไฟล์ขนาดใหญ่ติดตาม หยุดการติดตาม ใส่ข้อมูลจากไฟล์การติดตามลงในฐานข้อมูล และดำเนินการคำสั่ง SQL ที่ร้องขอดังต่อไปนี้:

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

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

นำมารวมกันทั้งหมด

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

รูปที่ 1: พารามิเตอร์การเริ่มต้นที่เกี่ยวข้อง oracle_trace

พารามิเตอร์ oracle_trace_collection_nameต้องกำหนดให้ชัดเจน ค่าว่าง "" เพราะความหมายมาตรฐานของมันคือ "ออราเคิล"และหากมีการระบุชื่อชุดและเปิดใช้งานการติดตาม เซิร์ฟเวอร์ออราเคิลดำเนินการติดตามระดับอินสแตนซ์ตั้งแต่เริ่มต้น (ว้าว!)

พารามิเตอร์ oracle_trace_collection_pathระบุไดเร็กทอรีที่จะเก็บไฟล์ไว้ ในแค็ตตาล็อก oracle_trace_facility_pathรายการเหตุการณ์ที่สามารถติดตามได้จะถูกโพสต์ ( ไฟล์คำจำกัดความสิ่งอำนวยความสะดวก- ไฟล์คำจำกัดความของเครื่องมือที่จัดทำโดย Oracle Corporation) พารามิเตอร์ oracle_trace_facility_nameระบุรายการกิจกรรมที่เราสนใจ สุดท้ายนี้ คุณสามารถจำกัดขนาด (เป็นไบต์) ของไฟล์การติดตามได้โดยการตั้งค่าพารามิเตอร์ oracle_trace_collection_size.

หลังจากที่เซิร์ฟเวอร์เริ่มทำงาน คุณสามารถเริ่มรวบรวมข้อมูลการติดตามได้

ในบทความนี้ ฉันจะใช้เครื่องมือบรรทัดคำสั่งเท่านั้น แม้ว่าจะมีอินเทอร์เฟซ PL/SQL สำรอง (package dbms_oracle_trace_agent- ประมาณ นักแปล) และแม้กระทั่ง กุยหากคุณซื้อโมดูลที่เกี่ยวข้องสำหรับ ออราเคิล เอ็นเตอร์ไพรส์ผู้จัดการ. เราจะใช้คำสั่งต่อไปนี้:

Otrccol เริ่ม 1 otrace.cfg

ทีม otrccol- อินเทอร์เฟซหลักสำหรับ oracle_trace- มีคำสั่งอื่นๆ แต่คุณสมบัติส่วนใหญ่ได้ถูกเพิ่มเข้าไปแล้ว otrccol- เห็นได้ชัดว่าเป็นพารามิเตอร์ เริ่มต้องเริ่มต้นการติดตาม (และพารามิเตอร์ หยุด- หยุดเธอ) ความหมาย " 1 " เป็นตัวระบุงานที่เลือกแบบสุ่มและ otrace.cfg- ไฟล์กำหนดค่า ตัวอย่างของไฟล์การกำหนดค่าจะแสดงในรูป 2.

รูปที่ 2: ตัวอย่างไฟล์การกำหนดค่า oracle_trace

ไฟล์นี้ต้องการให้เซิร์ฟเวอร์สร้างไฟล์ชุดข้อมูลชื่อ เจพีแอล.ดาทโดยมีไฟล์คำจำกัดความของคอลเลกชันชื่อ jpl.cdfและตั้งไอดี เจพีแอล- คำจำกัดความของเครื่องมือที่ตรวจสอบย้อนกลับอยู่ในไฟล์ รอ.fdf(ไฟล์นี้จัดทำโดย Oracle และมีเพียงเหตุการณ์รอเท่านั้น) ขนาดไฟล์การติดตามจะถูกจำกัดไว้ที่ 10 MB แต่จะถูกนำมาใช้ซ้ำเพื่อให้มีข้อมูล 10 MB ล่าสุดเสมอ ก่อนที่จะดัมพ์ข้อมูลลงในไฟล์นี้ เซิร์ฟเวอร์ Oracle จะสะสมข้อมูลไว้ในบัฟเฟอร์ขนาด 1 MB

ความเป็นไปได้ในการตั้งค่า เรียบร้อย- หนึ่งในมากที่สุด ความสามารถอันทรงพลัง oracle_trace- ค่า "มาตรฐาน" ของสตริงนี้ประกอบด้วย "0 0" แทนที่จะเป็นของฉัน "7 92" และเรียกร้องสิ่งนั้น oracle_traceติดตามอินสแตนซ์ Oracle ทั้งหมดซึ่งได้รับจาก id d901ที่ท้ายบรรทัด ฉันแค่ขอให้ติดตาม วิธีแก้ไขหมายเลข 7(รอกิจกรรม) องค์ประกอบที่ 92(ความคาดหวัง บัฟเฟอร์ไม่ว่างรอ).

หากจำเป็น คุณสามารถระบุหลายบรรทัดในไฟล์ได้ เรียบร้อย- สำหรับการทดลองชุดแรก ฉันใช้สองบรรทัด เรียบร้อยในไฟล์คอนฟิกูเรชันที่ระบุการติดตาม "7 129" และ "7 130" - การอ่านตามลำดับและแบบกระจาย ตามลำดับ เนื่องจากการรอประเภทนี้สร้างได้ง่าย

ฉันจะแสดงความคิดเห็นในส่วนที่ระบุคุณสมบัติการจัดรูปแบบเพิ่มเติม

หลังจากที่ระบบรันมาระยะหนึ่งแล้ว ให้รัน:

Otrccol หยุด 1 otrace.cfg รูปแบบ otrccol otrace.cfg

คำสั่งแรกจะหยุดการติดตาม คำสั่งที่สองอ่านไฟล์และดัมพ์ข้อมูลลงในตาราง Oracle จำนวนหนึ่ง

อย่างไรก็ตาม ก่อนที่คุณจะจัดรูปแบบชุดได้ คุณต้องสร้างสคีมาที่มีตารางที่ใช้ในการจัดรูปแบบก่อน สำหรับชื่อผู้ใช้และรหัสผ่าน เราใช้ค่าที่แสดงไว้ก่อนหน้าในรูป 2. เชือก เต็ม_รูปแบบ=1ในไฟล์คอนฟิกูเรชันทำให้ไฟล์ทั้งหมดถูกทิ้งลงในตาราง การติดตั้ง เต็ม_รูปแบบ=0จะรีเซ็ตเฉพาะข้อมูลใหม่เท่านั้น หมายเหตุด้วยชื่อบริการ ( บริการ) - ระบุฐานข้อมูลซึ่งมีบัญชีที่เกี่ยวข้องอยู่ หากต้องการใช้คำสั่ง รูปแบบคุณต้องเริ่มกระบวนการฟัง TNS (ตัวฟัง TNS) แม้ว่าข้อมูลจะถูกดัมพ์ลงในฐานข้อมูลท้องถิ่นก็ตาม

ในรูป รูปที่ 3 แสดงสคริปต์ขนาดเล็กที่สร้างบัญชีและให้สิทธิ์ที่จำเป็นแก่มัน

รูปที่ 3: การสร้างผู้ใช้ที่มีสคีมาจะมีตารางการติดตาม

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

EPC_COLLECTION

ชื่อของผู้อื่นจะไม่มีความหมายใด ๆ :

V_192216243_F_5_E_9_9_0

ปัญหาเกี่ยวกับชื่อที่น่าอึดอัดใจสามารถแก้ไขได้ด้วยการเรียกใช้สคริปต์ otrcsyn.sqlในแค็ตตาล็อก $ORACLE_HOME/otrace/demo.

สคริปต์นี้สร้างคำพ้องสำหรับตาราง โดยตั้งชื่อที่มีความหมาย เช่นนี้

รอการเชื่อมต่อ

(ชื่อจะแตกต่างกันไปขึ้นอยู่กับ. รุ่นที่แตกต่างกันออราเคิล)

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

ผลลัพธ์บางอย่าง

แล้วเราทำอะไร:

  • สร้างไฟล์การกำหนดค่าแล้ว
  • เริ่มการรวบรวมข้อมูล
  • ดำเนินการบางอย่างในฐานข้อมูล
  • หยุดการรวบรวมข้อมูล
  • จัดรูปแบบชุดข้อมูลแล้ว

แล้วตอนนี้ล่ะ?

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

ตัวอย่างเช่น เราสามารถดำเนินการคำสั่ง SQL ดังแสดงในรูปที่ 1 4:

เลือก p1 file_id, p2 block_id, p3เหตุผล_รหัส, นับ (*) ct, ผลรวม (time_waited)/100 วินาทีจากกลุ่มรอโดย p1, p2, p3 เรียงลำดับตามผลรวม (time_waited) desc ;

รูปที่ 4: ตัวอย่างแบบสอบถามเพื่อระบุการรอที่นานที่สุดสำหรับบล็อกที่ถูกครอบครอง

หากต้องการความแม่นยำมากขึ้น คุณสามารถส่งออกการรอทั้งหมดด้วยการประทับเวลา และตั้งชื่อคอลัมน์ (ค่อนข้างในแง่ดี) timestamp_nano.

หากคุณต้องการค้นหาว่าผู้ใช้รายใดต้องรอนานที่สุด ให้เปลี่ยนแบบสอบถามและสรุปตามคอลัมน์ session_index(เอสไอดี) และ session_serial (อนุกรม#- เพื่อให้ได้ตามค่า ( session_index, session_serial) ชื่อผู้ใช้ ชื่อเครื่อง เวลาที่ลงทะเบียน ฯลฯ คุณสามารถใช้ตาราง (คำพ้องความหมาย) การเชื่อมต่อ.

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

และหากคุณต้องการระบุคำสั่ง SQL เฉพาะที่คุณต้องรอ คุณสามารถเปลี่ยนไปใช้ไฟล์ได้ตลอดเวลา แม้ว่าจะต้องใช้ทรัพยากรมากขึ้นก็ตาม sql_waits.fdfซึ่งส่งผลให้มีตารางอีกหลายตารางที่เต็มไปด้วยข้อมูลการติดตาม ซึ่งสามารถรวมเข้ากับคอลัมน์ได้ session_index, session_serial, การประทับเวลาและ timestamp_nano.

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

อนาคต

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

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

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

บทสรุป

นี่เป็นเพียงการแนะนำสั้น ๆ เกี่ยวกับ oracle_traceซึ่งได้สัมผัสถึงพื้นฐานการใช้งาน เรายังต้องดำเนินการประเมินความมั่นคงของงานและ ผลข้างเคียงใช้ oracle_traceไม่ต้องพูดถึงผลกระทบต่อประสิทธิภาพการทำงาน

อย่างไรก็ตาม การวิจัยเพียงเล็กน้อยแสดงให้เห็นว่าเครื่องมือนี้ต้องการทรัพยากรน้อยกว่าเครื่องมือวินิจฉัยในตัวอื่นๆ อย่างมาก ทำให้การรายงานมีความยืดหยุ่นและแม่นยำยิ่งขึ้น

ท้ายที่สุดแล้ว oracle_traceช่วยให้คุณได้รับคำตอบที่ถูกต้องสำหรับคำถามที่ซับซ้อนจำนวนหนึ่งซึ่งสร้างปัญหาให้กับ DBA มาหลายปี

โดยส่วนตัวแล้วฉันจะไม่แปลกใจเกินไปถ้า oracle_traceในอีกไม่กี่ปีข้างหน้า มันจะเข้ามาแทนที่เครื่องมือวินิจฉัยอื่นๆ ทั้งหมดในที่สุด

ปัญหา

มีความแตกต่างมากมาย มักจะเป็นเพียงชื่อ ระหว่างการใช้งาน oracle_traceในเวอร์ชัน Oracle 8i และ Oracle 9i บทความนี้เขียนขึ้นจาก Oracle 9i โดยเฉพาะ

12 คำตอบ

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

ไปที่อินสแตนซ์ → เซสชัน และดูที่แท็บ SQL ของแต่ละเซสชัน

และแน่นอน คุณยังสามารถใช้เครื่องมือนี้ได้ อธิบายแผน FOR, TRACE และวิธีการใช้เครื่องมืออื่นๆ อีกมากมาย Enterprise Manager มีรายงานหลายฉบับสำหรับการสืบค้น SQL ที่แพงที่สุด คุณยังสามารถค้นหาได้ คำขอล่าสุด, เก็บไว้ในแคช

ฉันพบวิธีแก้ปัญหาง่ายๆ

ขั้นตอนที่ 1 เชื่อมต่อกับฐานข้อมูลโดยใช้ผู้ใช้ที่เป็นผู้ดูแลระบบโดยใช้ PLSQL หรือ sqldeveloper หรืออินเทอร์เฟซการสืบค้นอื่น ๆ

ขั้นตอนที่ 2 เรียกใช้สคริปต์ด้านล่าง ในคอลัมน์ S.SQL_TEXT คุณจะเห็นข้อความค้นหาที่ดำเนินการ

เลือก S.LAST_ACTIVE_TIME, S.MODULE, S.SQL_FULLTEXT, S.SQL_PROFILE, S.EXECUTTIONS, S.LAST_LOAD_TIME, S.PARSING_USER_ID, S.SERVICE จาก SYS.V_$SQL S, SYS.ALL_USERS U โดยที่ S.PARSING_USER_ID=U .USER_ID และ UPPER(U.USERNAME) IN ("ชื่อผู้ใช้ oracle ที่นี่") เรียงลำดับตาม TO_DATE(S.LAST_LOAD_TIME, "YYYY-MM-DD/HH24:MI:SS") เรียงลำดับ;

ปัญหาเดียวคือฉันไม่สามารถหาวิธีแสดงค่าได้ พารามิเตอร์อินพุต(สำหรับการเรียกใช้ฟังก์ชัน) แต่อย่างน้อยเราก็สามารถเห็นสิ่งที่ทำงานใน Oracle และลำดับของมันโดยไม่ต้องใช้เครื่องมือเฉพาะใดๆ

แก้ไขชุดระบบ timed_statistics=true

แก้ไขชุดเซสชัน timed_statistics=true -- หากต้องการติดตามเซสชันของคุณเอง

ควรใหญ่พอ:

เลือกค่าจาก v$parameter p โดยที่ name="max_dump_file_size"

ค้นหาจำนวนเมล็ดและ หมายเลขซีเรียลเซสชันที่คุณสนใจ:

เลือก sid, serial# จาก v$session โดยที่ ...your_search_params...

คุณสามารถเริ่มต้นการติดตามด้วยเหตุการณ์ 10046 พารามิเตอร์ที่สี่จะตั้งค่าระดับการติดตาม (12 คือสูงสุด):

เริ่มต้น sys.dbms_system.set_ev(sid, serial#, 10046, 12, "");

จบ;

ปิดการติดตามด้วยการตั้งค่าระดับศูนย์:

เริ่มต้น sys.dbms_system.set_ev(sid, serial#, 10046, 0, ""); จบ;

/* ระดับที่เป็นไปได้: 0 - ปิดการใช้งาน 1 - ระดับต่ำสุด คล้ายกับการตั้งค่า sql_trace = true 4 - ค่าตัวแปรการผูกจะถูกเพิ่มลงในไฟล์การติดตาม 8 - เพิ่มการรอ 12 - ค่าการผูกตัวแปรและเหตุการณ์รอจะถูกเพิ่ม */

เช่นเดียวกันหากคุณต้องการติดตามเซสชันของคุณในระดับที่สูงกว่า:

แก้ไขเหตุการณ์ชุดเซสชัน "บริบทชื่อการติดตาม 10046 ตลอดไป ระดับ 12";

ปิด:

แก้ไขเหตุการณ์ชุดเซสชัน "ปิดบริบทชื่อการติดตาม 10046";

ไฟล์ที่มีข้อมูลการติดตามดิบ:

เลือกค่าจาก v$parameter p โดยที่ name="user_dump_dest"

ชื่อไฟล์ (*. Trc) จะมี spid:

เลือก p.spid จาก v$session s, v$process p โดยที่ s.paddr=p.addr และ ...your_search_params...

คุณสามารถตั้งชื่อได้ด้วยตัวเอง:

สุดท้าย ใช้ TKPROF เพื่อทำให้ไฟล์การติดตามเข้าใจได้ง่ายขึ้น:

C:\ORACLE\admin\databaseSID\udump> C:\ORACLE\admin\databaseSID\udump>tkprof my_trace_file.trc output=my_file.prf TKPROF: Release 9.2.0.1.0 - การผลิตในวันพุธที่ 22 กันยายน 18:05:00 น. 2004 ลิขสิทธิ์ (c) 1982, 2002, ออราเคิล คอร์ปอเรชั่น สงวนลิขสิทธิ์. C:\ORACLE\admin\databaseSID\udump>

หากต้องการดูสถานะการใช้งานของไฟล์การติดตาม ให้ทำดังนี้

ตั้งค่าเซิร์ฟเวอร์เอาท์พุตเป็นขนาด 30000; ประกาศ ALevel binary_integer; เริ่มต้น SYS.DBMS_SYSTEM.Read_Ev (10046, ALevel);

ถ้า ALevel = 0 ดังนั้น DBMS_OUTPUT.Put_Line("sql_trace is off");

อื่น DBMS_OUTPUT.Put_Line("sql_trace เปิดอยู่");

สิ้นสุดถ้า; จบ; -

อีกสองสามอย่าง - ใน SQL*Plus - SET AUTOTRACE ON - จะให้แผนคำอธิบายและสถิติสำหรับแต่ละคำสั่งที่ดำเนินการ TOAD ยังอนุญาตให้ทำโปรไฟล์ฝั่งไคลเอ็นต์ได้ข้อเสียของทั้งสองประการคือ พวกเขาจะแจ้งให้คุณทราบถึงแผนการดำเนินการสำหรับคำสั่งเท่านั้น แต่ไม่ได้แจ้งว่าเครื่องมือเพิ่มประสิทธิภาพมาถึงแผนนั้นได้อย่างไร คุณจะต้องมีการติดตามฝั่งเซิร์ฟเวอร์ระดับล่างสำหรับสิ่งนั้น สิ่งสำคัญอีกประการหนึ่งที่ต้องทำความเข้าใจคือสแน็ปช็อต Statspackวิธีที่ดี

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

แผนการที่ดี กล่าวกันว่ามีการประหารชีวิต 1 ล้านครั้งต่อนาที Catch คือการบันทึกการดำเนินการ SQL ทั้งหมดระหว่างสองจุดในเวลา SQL Server ก็เช่นกัน

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

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

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

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

    ถ่ายภาพสแนปช็อตแรก เรียกใช้ sql ต่อไปนี้เพื่อสร้างสแน็ปช็อตแรก:

    สร้างตาราง sql_exec_before เป็นการดำเนินการแบบเลือก hash_value จาก v$sqlarea /

    ให้ผู้ใช้ปฏิบัติงานในแอปพลิเคชัน

    ถ่ายรูปที่สอง

    สร้างตาราง sql_exec_after เป็นการดำเนินการแบบเลือก hash_value จาก v$sqlarea /

    ตรวจสอบผลลัพธ์ เมื่อคุณได้บันทึก SQL แล้ว ก็ถึงเวลาค้นหาผลลัพธ์

สวัสดี
บ่อยครั้งที่ผู้ใช้หรือผู้ทดสอบของเราติดต่อฉันด้วยปัญหาต่อไปนี้:

“โปรแกรมเริ่มทำงานสำหรับฉัน ช้า!"

ในขณะเดียวกันก็ไม่มีเวลาศึกษาปัญหาโดยละเอียดเลย และแม้แต่เซิร์ฟเวอร์ที่ใช้งานได้ก็มักจะทำงานกับพารามิเตอร์ sql_trace = false...
ในกรณีนี้ ฉันพบวิธีแก้ปัญหา "ด่วน" ต่อไปนี้สำหรับตัวฉันเอง

1. เราขอให้ผู้ใช้ "เข้าสู่ระบบ" เข้าสู่โปรแกรม

2. ค้นหา sid และซีเรียลของเซสชันผู้ใช้ (เลือก sid, serial# จาก v$session โดยที่<условия поиска>)

3. ดำเนินการบล็อก PL/SQL นี้
ประกาศ
-- 0/1/โมฆะ<-->เท็จ/จริง/โมฆะ
-- พารามิเตอร์บูลีนถูกแปลจาก/เป็นจำนวนเต็ม:
sql_trace บูลีน:= sys.diutil.int_to_bool(1);
เริ่ม
-- เรียกขั้นตอน
dbms_system.set_sql_trace_in_session
(ซิด => 56,
อนุกรม# => 6656,
sql_trace => sql_trace);
จบ;
หลังจากดำเนินการแล้ว การติดตามเซสชันที่ระบุจะเริ่มต้นขึ้น

4. เราขอให้ผู้ใช้ดำเนินการเป็นเวลานาน...

6. ปิดใช้งานการติดตามโดยการรันสคริปต์นี้อีกครั้ง โดยระบุพารามิเตอร์ sql_trace = 0

7. ค้นหาไฟล์ .trc ในไดเรกทอรีเซิร์ฟเวอร์ UDUMP
ชื่อไฟล์ประกอบด้วย ID กระบวนการ ระบบปฏิบัติการ- คุณสามารถค้นหาได้เช่นนี้
SQL> เลือก p.spid จาก v$session s, v$process p
2 โดยที่ s.paddr=p.addr
3 และ ...my_selection_criteria...
4 /

8. เราประมวลผลไฟล์นี้ด้วยยูทิลิตี้ TKPROF (TKPROF<имя trc-файла> <имя выходного файла>)

9. ในไฟล์ผลลัพธ์ เราจะวิเคราะห์ผลลัพธ์สุดท้าย โดยประเมินพารามิเตอร์ CPU และ ELAPSED
เช่น วันนี้ผมได้รับภาพนี้
และผลปรากฏว่ามีปัญหาและเน้นไปที่ระยะเวลารอรับข้อมูล (20.85 วินาที)
เราจำเป็นต้องค้นหาคำถามที่มีปัญหา

10. ในหน้าต่างโดยใช้ ค้นหาคำสั่ง"ทั้งหมด"<имя выходного файла>>1.txt
เราค้นหาบรรทัดทั้งหมดที่ขึ้นต้นด้วย "ผลรวม" และบันทึกลงในไฟล์ 1.txt

11. เราตรวจสอบไฟล์นี้อย่างรวดเร็วและค้นหาค่าที่ไม่เหมาะกับเราในแง่ของมูลค่า
ในกรณีของฉันวันนี้ มีบรรทัดทั้งหมด 2 บรรทัดสำหรับคำขอสองรายการ ซึ่งกินเวลาเกือบทั้งหมดในการรอ
รวม 9 0.00 0.00 0 21 0 9
รวม 3 0.03 0.02 0 3 0 0
รวม 3 0.01 0.00 0 14 0 5
รวม 3 0.64 10.89 11848 17504 0 4
รวม 3 0.07 0.06 0 214 0 29
รวม 15 0.00 0.00 0 15 0 5
รวม 3 0.01 0.00 0 3 0 0
รวม 3 0.00 0.00 0 4 0 1
รวม 3 0.00 0.00 0 8 0 6
รวม 6 0.04 0.02 0 8 0 2
รวม 3 0.00 0.00 0 4 0 1
รวม 3 0.00 0.00 0 3 1 1
รวม 3 0.00 0.00 0 2 0 1
รวม 3 0.01 0.00 0 8 2 1
รวม 2 0.00 0.00 0 4 1 1
รวม 3 0.00 0.00 0 2 0 1
รวม 3 0.21 9.85 7760 12354 0 1
รวม 6 0.00 0.00 0 0 0 0
รวม 6 0.00 0.00 0 0 0 0
จากนั้น เมื่อใช้ค่าเหล่านี้จากบรรทัดเหล่านี้ในไฟล์การติดตามที่ประมวลผล เราจะพบคำขอที่มีปัญหาและจัดการกับคำขอเหล่านั้น
วันนี้ผมสร้างดัชนีสองอันก็เพียงพอแล้ว...
ทั้งหมด...

จากประสบการณ์ของฉัน การจัดการง่ายๆ เหล่านี้ช่วยแก้ไขปัญหาประสิทธิภาพของเซิร์ฟเวอร์ได้ประมาณ 90 เปอร์เซ็นต์

คุณอาจถามว่าทำไมถึงทำขั้นตอนที่ 10? ท้ายที่สุด คุณสามารถค้นหาข้อความค้นหาที่มีปัญหาในไฟล์ TRC ที่ประมวลผลได้ แน่นอนคุณทำได้ หากมีคำขอดังกล่าวหลายร้อยคำขอในการติดตามเดียว จะง่ายกว่าในการดูหรือประมวลผลเฉพาะผลรวมอย่างรวดเร็ว จากนั้นไปยังรายละเอียด...