มีการหมดเวลาสำหรับการค้นหาผ่านลิงก์ฐานข้อมูลหรือไม่


11

แก้ไข / คำนำ: คำถามนี้ถูกย้ายมาจาก SO เนื่องจากฉันสนใจเป็นพิเศษกับคำถามเกี่ยวกับการหมดเวลาของการสืบค้นลิงก์ DB วิธีแก้ปัญหาที่ให้ไว้จาก SO ค่อนข้างโอเค แต่ฉันสนใจคำถามจริงๆ

แรงจูงใจ:
ฉันมีข้อความค้นหาหนึ่งคำที่เรียกใช้ "ถาวร" (มากกว่า 2 วันจนกระทั่งฉันฆ่าเซสชัน) ซึ่งใช้ลิงค์ฐานข้อมูล ปัญหาดูเหมือนว่าฐานข้อมูลระยะไกลไม่พร้อมใช้งานและด้วยเหตุผลบางอย่างที่ยังไม่ทราบว่าไม่มีORA-02068การยกระดับ (ไม่ต้องพูดถึงที่นี่) และแบบสอบถามเพิ่งรอและรอ

(เคียวรีออกโดยงาน dbms_scheduler ซึ่งดำเนินการโพรซีเดอร์ในแพ็คเกจ PL / SQL ดังนั้นงานก็ยังติดอยู่ แต่นั่นไม่ใช่สิ่งที่น่าสนใจเป็นพิเศษสำหรับแกนหลักของคำถามนี้)

ฉันจำลองสถานการณ์นี้โดยใส่หนึ่งในฐานข้อมูลทดสอบของฉันในโหมด quiesce และสอบถามผ่านลิงก์ฐานข้อมูล ตามที่คาดไว้แบบสอบถามกำลังรอจนกว่าจะถูกยกเลิกด้วยตนเองหรือฐานข้อมูลระยะไกลไม่ได้ถูกสอบถาม

คำถาม:
ฉันไม่สามารถควบคุมพฤติกรรมของฐานข้อมูลระยะไกลและเวลาปัจจุบันดังนั้นฉันจึงค้นหาความเป็นไปได้ในการตั้งค่าการหมดเวลาในแบบสอบถามซึ่งใช้ลิงค์ฐานข้อมูล

เราได้ตรวจสอบแล้วเป็นโปรไฟล์ ( CPU_PER_CALLฯลฯ ) sqlnet.oraพารามิเตอร์เพิ่มพารามิเตอร์การตั้งชื่อในท้องถิ่นโดยตรงในสตริงการเชื่อมต่อ (เช่นการเพิ่ม(connect_timeout=10)คำนิยามการเชื่อมโยงฐานข้อมูล), เรียกใช้คำสั่งที่มี... for update wait 1แต่พวกเขาทำงานอย่างใดอย่างหนึ่งสำหรับการประชุมไม่ว่างหรือไม่ได้ใช้งาน แต่ไม่ได้ สำหรับช่วงเวลาที่รอ

ดังนั้นฉันอยู่ในการค้นหาตัวเลือกในด้าน "ท้องถิ่น" ของลิงค์ฐานข้อมูลซึ่งกำหนดเวลาหมดสำหรับการค้นหาผ่านลิงก์ฐานข้อมูล
วิธีแก้ปัญหาบางอย่างชอบalter session set xyzหรือselect ... from a@b "wait 100" --(yes, I know this syntax doesn't exist)น่าชื่นชมเนื่องจากฉันไม่มีสิทธิ์ DBA ในฐานข้อมูลเหล่านี้

ขณะนี้ฉันใช้ 10gR2 แต่อัปเกรดเป็น 11gR2 ในอีกไม่กี่สัปดาห์ดังนั้นแนวคิดสำหรับรุ่นใด ๆ เหล่านี้จะมีประโยชน์


แบบสอบถามใช้อย่างไร ส่วนหนึ่งของโพรซีเดอร์ / แพ็คเกจที่มีขนาดใหญ่กว่า, SQL พื้นฐานสำหรับมุมมองแบบ mat, รันจากแอพภายนอก, ... ? ฉันไม่รู้ไวยากรณ์ "wait xxx" ที่เรียบง่ายโซลูชันของคุณอาจต้องเป็นส่วนหนึ่งของโปรแกรมที่มีขนาดใหญ่ขึ้นอยู่กับการใช้งานของคุณ

เคียวรีถูกเรียกใช้โดยงาน dbms_scheduler ซึ่งดำเนินการโพรซีเดอร์ในแพ็กเกจ PL / SQL (อัปเดตคำถามพร้อมคำถามนั้น)
GWu

คำตอบ:


4

เนื่องจากคุณใช้ dbms_scheduler คุณสามารถตั้งค่าคุณสมบัติmax_run_duration ของงานให้ถึงขีด จำกัด ได้จากนั้นให้ผู้จัดตารางเวลาส่งอีเมลถึงคุณหากมีเหตุการณ์ดังกล่าวเกิดขึ้น เบื้องหลัง Oracle ใช้ตารางการเข้าคิว (ซึ่งช่วยให้คุณสามารถสร้างงานที่ดำเนินการเมื่อมีเหตุการณ์ยกขึ้นหากคุณต้องการใช้ขั้นตอนพิเศษเพื่อดำเนินการอัตโนมัติเพิ่มเติมเกี่ยวกับการตอบกลับของคุณ) แต่โดยทั่วไปงานใด ๆ ที่ทำงานบน max_run_duration ที่คุณตั้งค่าจะเพิ่มประเภทเหตุการณ์: JOB_OVER_MAX_DUR

ชิ้นส่วนอีเมลถูกสร้างขึ้นใน 11gr2 ดูที่นี่สำหรับการเขียนที่ดี

หวังว่าจะช่วย


ความคิดที่ดีขอบคุณ! มันไม่ได้เป็นคำตอบสำหรับคำถามเฉพาะเกี่ยวกับการหมดเวลาในการเชื่อมโยงฐานข้อมูล แต่ฉันคิดว่ามันแก้ปัญหาเริ่มต้นของฉันต่อไปดังนั้น +1 :-) ฉันไม่รู้ max_run_duration และเริ่มจากสิ่งนี้ฉันเพิ่งพบวิธีหยุดและวางงานที่หยุดทำงาน (ฟอรัม.oracle.com/forums/thread.jspa?threadID=521939#2002982 )
GWu

ด้วยเหตุผลบางอย่างฉันไม่สามารถmax_run_durationเพิ่มเหตุการณ์ได้ดังนั้นฉันจึงถามคำถามใหม่ที่นี่
GWu

0

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

ALTER SESSION CLOSE DATABASE LINK dblink;

แน่นอนคุณสามารถสำรวจเซิร์ฟเวอร์ระยะไกลก่อนด้วย:

select * from dual@dblink

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

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