Có thời gian chờ cho một truy vấn trên liên kết cơ sở dữ liệu?


11

Chỉnh sửa / Lời nói đầu: Câu hỏi này đã được di chuyển từ SO vì tôi đặc biệt quan tâm đến câu hỏi về thời gian chờ trên các truy vấn liên kết DB. Cách giải quyết được cung cấp từ SO có phần ổn, nhưng tôi thực sự quan tâm đến câu hỏi.

Động lực:
Tôi đã có một truy vấn chạy "mãi mãi" (hơn 2 ngày, cho đến khi tôi giết phiên), đó là sử dụng liên kết cơ sở dữ liệu. Vấn đề dường như là cơ sở dữ liệu từ xa trở nên không khả dụng và vì một số lý do chưa rõ ràng ORA-02068đã không được nêu ra (không được thảo luận ở đây) và truy vấn chỉ chờ và chờ đợi.

(Truy vấn được ban hành bởi một công việc dbms_scheduler, thực thi một thủ tục trong gói PL / SQL. Do đó, công việc cũng bị kẹt. Nhưng đó không phải là mối quan tâm đặc biệt cho cốt lõi của câu hỏi này)

Tôi đã mô phỏng tình huống này bằng cách đặt một trong các DB thử nghiệm của mình ở chế độ hoạt động và truy vấn nó qua một liên kết cơ sở dữ liệu. Như dự đoán, truy vấn đã đợi cho đến khi bị hủy thủ công hoặc DB từ xa không được yêu cầu.

Câu hỏi:
Tôi không có quyền kiểm soát hành vi và thời gian hoạt động của cơ sở dữ liệu từ xa, vì vậy tôi đang tìm kiếm một số khả năng để đặt thời gian chờ cho truy vấn đang sử dụng liên kết cơ sở dữ liệu.

Tôi đã xem xét các cấu hình ( CPU_PER_CALLvv), sqlnet.oracác tham số, thêm các tham số đặt tên cục bộ trực tiếp vào chuỗi kết nối (chẳng hạn như thêm (connect_timeout=10)vào định nghĩa liên kết cơ sở dữ liệu), chạy một lệnh với ... for update wait 1, nhưng chúng có thể hoạt động cho các phiên bận hoặc nhàn rỗi, nhưng không cho các phiên trong chờ đợi.

Vì vậy, tôi đang tìm kiếm một số tùy chọn ở phía "cục bộ" của liên kết cơ sở dữ liệu, loại này đặt thời gian chờ cho các truy vấn trên các liên kết cơ sở dữ liệu.
Một số giải pháp thích alter session set xyzhoặc select ... from a@b "wait 100" --(yes, I know this syntax doesn't exist)sẽ được đánh giá cao, vì tôi không có quyền DBA đối với các DB cụ thể này.

Tôi hiện đang sử dụng 10gR2 nhưng nâng cấp lên 11gR2 sau vài tuần, vì vậy ý ​​tưởng cho bất kỳ phiên bản nào trong số này sẽ hữu ích.


truy vấn được sử dụng như thế nào? một phần của một thủ tục / gói lớn hơn, SQL cơ bản cho chế độ xem mat, chạy từ một ứng dụng bên ngoài, ...? Tôi không biết cú pháp "chờ xxx" đơn giản, giải pháp của bạn có thể cần là một phần của chương trình lớn hơn, tùy thuộc vào cách sử dụng của bạn.

Truy vấn được ban hành bởi một công việc dbms_scheduler, thực thi một thủ tục trong gói PL / SQL. (câu hỏi được cập nhật với điều đó)
GWu

Câu trả lời:


4

Vì bạn đang sử dụng dbms_scheduler, bạn có thể đặt thuộc tính max_run_duration của công việc thành một số giới hạn và sau đó gửi lịch trình email cho bạn nếu sự kiện đó được nêu ra. Đằng sau hậu trường, Oracle sử dụng các bảng xếp hàng (có thể cho phép bạn tạo các công việc phát sinh khi một sự kiện được nêu ra , nếu bạn muốn thực hiện các bước bổ sung để thực hiện tự động hóa hơn xung quanh phản hồi của bạn). Nhưng về cơ bản, bất kỳ công việc nào chạy qua max_run_duration mà bạn thiết lập sẽ tăng loại sự kiện: JOB_OVER_MAX_DUR

Các mảnh email được xây dựng trong 11gr2, xem ở đây để viết tốt.

Mong rằng sẽ giúp.


ý tưởng tuyệt vời, cảm ơn! Đây không phải là câu trả lời chính xác cho câu hỏi cụ thể về thời gian chờ trên các liên kết DB, nhưng tôi đoán nó vẫn giải quyết được vấn đề ban đầu của tôi, vì vậy +1 :-). Tôi không biết max_run_duration và bắt đầu từ tôi điều này chỉ tìm thấy làm thế nào để ngăn chặn và thả công việc treo ( forums.oracle.com/forums/thread.jspa?threadID=521939#2002982 )
GWU

Vì một số lý do, tôi không thể max_run_durationnêu ra sự kiện này, vì vậy tôi đã bỏ qua một câu hỏi mới tại đây
GWu

0

Tôi không nói rằng tôi có một giải pháp nhưng tôi cũng muốn thảo luận thêm về cách kiểm soát thời gian chờ của dblink. Tôi cho rằng có thể hiểu được khi viết mã phát sinh sự kiện hoặc chờ đợi sự kiện hết thời gian TNS và sau đó thực thi:

ALTER SESSION CLOSE DATABASE LINK dblink;

Tất nhiên bạn có thể thăm dò máy chủ từ xa trước với:

select * from dual@dblink

để kiểm tra xem nó có khả dụng không, nhưng điều đó không khắc phục được vấn đề về mã chạy quá lâu trên điều khiển từ xa. Mã từ xa xấu sẽ kích hoạt các sự kiện chờ đợi, vì vậy tôi cho rằng chúng có thể bị mắc kẹt (ngay cả ở cấp độ lớp trong 12c). Điều đó vẫn không cung cấp cho chúng tôi một giải pháp tao nhã khi buộc một phiên dblink hết thời gian.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.