24. April 2007

Den DBA informieren: Langlaufende Jobs ...

Nochmal zum Thema "Den DBA informieren": Wie man Informationen in die View V$SESSION schreibt, haben wir ja gesehen. Nun setzen wir das fort: Es gibt einen längerlaufenden Job - und der DBA soll über den Fortschritt des Jobs informiert werden.
Naja, man könnte Informationen in eine Tabelle schreiben oder mit UTL_FILE anfangen, eine externe Datei zu befüllen. Nachteile: Im ersten Fall müsste man zwischendurch ein COMMIT absetzen, um zweiten Fall muss man mit einer zusätzlichen externen Datei umgehen ... man muss wissen, wo sie ist, wie man den Inhalt interpretiert und so weiter und so fort.
In der Oracle-Datenbank gibt es allerdings schon eine (dem DBA auch bekannte) View für diese Dinge: V$SESSION_LONGOPS. Wenn ein Prozess von Oracle (bspw. DBMS_REDEFINITION) losläuft, schreibt er Informationen über seinen Fortschritt dort hinein. Und das gleiche kann der Anwendungsentwickler auch tun, wie das folgende Beispiel zeigt (zur "Simulation" von Arbeit wird hier DBMS_LOCK.SLEEP aufgerufen; am besten also als SYS oder SYSTEM laufen lassen) ...
declare
  v_rindex   binary_integer := dbms_application_info.set_session_longops_nohint;
  v_slno     binary_integer;
  v_sofar    number := 0;

  v_seconds  binary_integer := 120;
begin
  dbms_application_info.set_session_longops(
    rindex    => v_rindex
   ,slno      => v_slno
   ,op_name   => 'TEST_SESSION_LONGOPS'
   ,totalwork => v_seconds
   ,sofar     => v_sofar
  );
  while v_sofar < v_seconds loop
    dbms_lock.sleep(v_seconds / 10);
    v_sofar := v_sofar + (v_seconds / 10);
    dbms_application_info.set_session_longops(
      rindex    => v_rindex
     ,slno      => v_slno
     ,op_name   => 'TEST_SESSION_LONGOPS'
     ,totalwork => v_seconds
     ,sofar     => v_sofar
    );
  end loop;
end;
/
sho err
Fragt der DBA nun seine View V$SESSION_LONGOPS ab,so sieht er ...
SQL> select opname, sofar, totalwork from v$session_longops where opname like 'TEST%';

OPNAME                         SOFAR            TOTALWORK 
------------------------------ ---------- ---------------
TEST_SESSION_LONGOPS                   60             120
60 von 120 sind bereits vollbracht, der Job ist also zur Hälfte erledigt. Was die TOTALWORK ist, bestimmt der Entwickler selbst - man sollte nur darauf achten, dass ein realistisches Bild abgegeben wird.

1 Kommentar:

Fiona hat gesagt…

Das ist mal ein richtig hilfreicher Beitrag, vielen Dank dafür :) Die DBAs beim Kunden kennen das Ding zwar sicher nicht, aber für mich zum Debuggen hier ist das schon genial!

Beliebte Postings