Edit / Pendahuluan: Pertanyaan ini telah dimigrasikan dari SO karena saya sangat tertarik dengan pertanyaan tentang timeout pada permintaan tautan DB. Solusi yang disediakan dari SO agak OK, tapi saya benar-benar tertarik dengan pertanyaan itu sendiri.
Motivasi:
Saya memiliki satu kueri yang menjalankan "selamanya" (lebih dari 2 hari, sampai saya mengakhiri sesi), yang menggunakan tautan basis data. Masalahnya tampaknya bahwa basis data jauh menjadi tidak tersedia dan untuk beberapa alasan belum diketahui tidak ORA-02068
ada dinaikkan (tidak akan dibahas di sini) dan permintaan hanya menunggu dan menunggu.
(Permintaan dikeluarkan oleh pekerjaan dbms_scheduler, yang menjalankan prosedur dalam paket PL / SQL. Akibatnya, pekerjaan itu juga macet. Tapi itu bukan minat khusus untuk inti dari pertanyaan ini)
Saya telah mensimulasikan situasi ini dengan meletakkan salah satu DB pengujian saya dalam mode diam dan menanyakannya melalui tautan basis data. Seperti yang telah diantisipasi, permintaan menunggu sampai dibatalkan secara manual atau DB jarak jauh tidak diumumkan.
Pertanyaan:
Saya tidak memiliki kontrol atas perilaku dan up-time basis data jauh, jadi saya sedang mencari beberapa kemungkinan untuk menetapkan batas waktu pada permintaan yang menggunakan tautan basis data.
Saya sudah melihat profil ( CPU_PER_CALL
dll), sqlnet.ora
parameter, menambahkan parameter penamaan lokal langsung ke string koneksi (seperti menambahkan (connect_timeout=10)
ke definisi tautan basis data), menjalankan perintah dengan ... for update wait 1
, tetapi mereka bekerja untuk sesi sibuk atau idle, tetapi tidak untuk sesi menunggu.
Jadi saya sedang mencari beberapa opsi di sisi "lokal" dari tautan basis data, yang mana yang menetapkan batas waktu untuk permintaan atas tautan basis data.
Beberapa solusi suka alter session set xyz
atau select ... from a@b "wait 100" --(yes, I know this syntax doesn't exist)
akan dihargai, karena saya tidak punya hak DBA pada DB tertentu ini.
Saya saat ini menggunakan 10gR2 tetapi meningkatkan ke 11gR2 dalam beberapa minggu, jadi ide untuk versi ini akan berguna.
Jawaban:
Karena Anda menggunakan dbms_scheduler, Anda dapat mengatur atribut max_run_duration pekerjaan ke batas tertentu, dan kemudian memiliki penjadwal mengirim email kepada Anda jika acara itu dinaikkan. Di belakang layar, Oracle menggunakan tabel antrian (yang dapat memungkinkan Anda untuk menciptakan pekerjaan yang memanas ketika suatu acara dimunculkan , jika Anda ingin mengambil langkah-langkah tambahan untuk melakukan lebih banyak otomatisasi di sekitar respons Anda). Tetapi pada dasarnya pekerjaan apa pun yang berjalan di atas max_run_duration yang Anda setup akan meningkatkan jenis acara: JOB_OVER_MAX_DUR
Sepotong email dibuat dalam 11gr2, lihat di sini untuk penulisan yang baik.
Semoga itu bisa membantu.
sumber
max_run_duration
dapat mengangkat acara tersebut, jadi saya mengajukan pertanyaan baru di siniSaya tidak mengatakan saya punya solusi tetapi saya juga ingin diskusi lebih lanjut tentang cara mengontrol batas waktu dblink. Saya kira bisa dibayangkan untuk menulis kode yang menyalakan suatu peristiwa, atau menunggu peristiwa batas waktu TNS, dan kemudian menjalankan:
Anda tentu saja dapat polling server jauh sebelumnya dengan:
untuk memeriksa apakah itu tersedia, tetapi itu tidak memperbaiki masalah kode yang berjalan terlalu lama pada remote. Kode jarak jauh yang buruk harus mengaktifkan acara tunggu, jadi saya kira itu bisa terjebak (bahkan di tingkat kelas dalam 12c). Itu masih tidak memberi kita solusi elegan untuk memaksa sesi dblink ke timeout.
sumber