Veritabanı bağlantısı üzerinden bir sorgu için zaman aşımı var mı?


11

Düzenle / Önsöz: Ben özellikle DB bağlantı sorguları zaman aşımı sorusu ile ilgileniyorum Bu soru SO taşınmıştır. SO sağlanan geçici çözüm biraz Tamam, ama gerçekten sorunun kendisi ile ilgileniyorum.

Motivasyon:
Bir veritabanı bağlantısı kullanan "sonsuza kadar" (oturumu öldürene kadar 2 günden fazla) çalışan bir sorgu vardı. Sorun, uzak veritabanının kullanılamaması ve henüz bilinmeyen bir nedenden ötürü ORA-02068(burada tartışılmayacak) hayırın ortaya çıkması ve sorgunun beklemesi ve beklenmesi gibi görünüyordu.

(Sorgu, PL / SQL paketinde bir prosedür yürüten bir dbms_scheduler işi tarafından verilir. Sonuç olarak, iş de sıkışmıştı. Ancak bu sorunun özü için özel bir ilgi alanı yok)

Test DB'lerimi quiesce moduna koyarak ve bir veritabanı bağlantısı üzerinden sorgulayarak bu durumu simüle ettim. Beklendiği gibi, sorgu elle iptal edilene veya uzak DB sorgulanana kadar bekliyordu.

Soru:
Uzak veritabanı davranışı ve çalışma süresi üzerinde hiçbir denetimim yok, bu yüzden bir veritabanı bağlantısı kullanan bir sorgu üzerinde bir zaman aşımı ayarlamak için bazı olasılık için arama.

Profilleri ( CPU_PER_CALLvb.), sqlnet.oraParametreleri, doğrudan bağlantı dizesine ( (connect_timeout=10)veritabanı bağlantısı tanımına ekleme gibi) doğrudan yerel adlandırma parametreleri ekleyerek , bir komut çalıştırarak baktım ... for update wait 1, ancak meşgul veya boş oturumlar için çalışıyorlar, ama değil bekleme oturumları için.

Bu yüzden veritabanı bağlantılarının sorguları için bir zaman aşımı ayarlar veritabanı bağlantı "yerel" tarafında bazı seçenek için arıyorum. Bu DB'lerde DBA haklarına sahip olmadığım için
bazı çözümler gibi alter session set xyzveya select ... from a@b "wait 100" --(yes, I know this syntax doesn't exist)takdir edilecektir.

Şu anda 10gR2 kullanıyorum ancak birkaç hafta içinde 11gR2'ye geçiyorum, bu nedenle bu sürümlerden herhangi biri için fikirler yararlı olacaktır.


sorgu nasıl kullanılır? bir mat görünümü için temel SQL, daha büyük bir yordam / paket parçası, harici bir uygulamadan çalıştırmak, ...? Ben basit bir "beklemek xxx" sözdizimi bilmiyorum, çözüm büyük bir programın bir parçası olması gerekebilir, kullanım tho bağlıdır.

Sorgu, bir PL / SQL paketinde bir yordamı yürüten bir dbms_scheduler işi tarafından verilir. (bununla birlikte güncellenen soru)
GWu

Yanıtlar:


4

Dbms_scheduler kullandığınız için , işin max_run_duration özniteliğini bir sınıra ayarlayabilir ve daha sonra bu olay ortaya çıkarsa zamanlayıcının size e-posta göndermesini sağlayabilirsiniz. Sahnelerin arkasında Oracle kuyruk tablolarını kullanır (bu, yanıtınız etrafında daha fazla otomasyon yapmak için fazladan adımlar atmak istiyorsanız, bir etkinlik gerçekleştiğinde tetiklenen işler oluşturmanızı sağlayabilir ). Ancak temel olarak ayarladığınız max_run_duration üzerinde çalışan herhangi bir iş olay türünü yükseltir: JOB_OVER_MAX_DUR

E-posta parçası 11gr2'de oluşturulmuştur, iyi yazma için buraya bakın .

Umarım yardımcı olur.


harika fikir, teşekkürler! Bu tam olarak DB bağlantıları zaman aşımı belirli soruya bir cevap değil, ama yine de benim ilk sorunu çözer, yani +1 :-) sanırım. Ben max_run_duration biliyor ve sadece dur ve asılmış işi bırak nasıl bulundu bu I başlayarak vermedi ( forums.oracle.com/forums/thread.jspa?threadID=521939#2002982 )
GWU

Bir nedenden dolayı max_run_durationetkinliği gündeme
getiremiyorum

0

Ben bir çözüm var demiyorum ama aynı zamanda bir dblink zaman aşımı nasıl kontrol hakkında daha fazla tartışma istiyorum. Bir olayı tetikleyen veya bir TNS zaman aşımı olayı bekler ve sonra yürütür kod yazmak düşünülebilir varsayalım:

ALTER SESSION CLOSE DATABASE LINK dblink;

Elbette uzak sunucuyu daha önce şununla sorgulayabilirsiniz:

select * from dual@dblink

kullanılabilir olup olmadığını kontrol etmek, ancak bu uzaktan kumandada çok uzun süre çalışan kod sorununu çözmez. Kötü uzaktan kod bekleme olayları ateş gerekir, bu yüzden (12c sınıf düzeyinde bile) sıkışmış olabilir varsayalım. Bu hala bir dblink oturumunu zaman aşımına zorlamak için zarif bir çözüm sunmuyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.