Oracle - Gibt es eine Möglichkeit, nicht festgeschriebene Änderungen an einer bestimmten Tabelle anzuzeigen?


24

Ich teste gerade einen Batch-Prozess, der viele DML-Anweisungen ausführt, aber nicht sofort ein Commit ausführt. Es wäre schön, wenn Sie die "ausstehenden" Änderungen aus einer anderen Sitzung anzeigen könnten, während die Transaktion nicht festgeschrieben ist. Ist das möglich?

Beispiel:

Insert into table myTable (col1, col2) values ("col1", "col2");

--Somehow view the pending transaction maybe by system view?....

...other DML statements....

commit;

Es gibt mehr als einen Weg, dies zu tun. Zum Beispiel können die SQL-Anweisungen hier Folgendes lösen: ducquoc.wordpress.com/2012/07/14/oracle-uncommited-changes good luck,

Antworten:


18

Abhängig von den Details Ihres Stapelprozesses und dem Grund, warum Sie versuchen, die nicht festgeschriebenen Änderungen anzuzeigen, gibt es einige unterschiedliche Ansätze.

1) Oracle Workspace Manager ist ein Tool, das ursprünglich entwickelt wurde, um Entwicklern von Spatial-Anwendungen die Ausführung von Transaktionen mit extrem langer Laufzeit zu ermöglichen (dh Transaktionen, für die mehrere Tage oder Wochen erforderlich sind, um herauszufinden, wo eine Pipeline in einer Transaktion ausgeführt werden soll) ). Ihr Stapelverarbeitungsprozess könnte einen neuen Arbeitsbereich erstellen (was logischerweise mit dem Erstellen einer neuen Transaktion vergleichbar ist). Nehmen Sie die gewünschten Änderungen in diesem Arbeitsbereich vor, während Sie einen Commit ausführen, wann immer dies gewünscht wird. In einer separaten Sitzung werden die festgeschriebenen Änderungen erst angezeigt, wenn Sie den Arbeitsbereich des Stapelverarbeitungsprozesses betreten haben. Wenn der Batch-Vorgang abgeschlossen ist, kann der Arbeitsbereich wieder mit dem Live-Arbeitsbereich zusammengeführt werden, was dem Festschreiben einer Transaktion entspricht.

2) Mit dem DBMS_XA-Paket können Sie eine Transaktion von einer Sitzung zu einer anderen "übergeben" und einer Sitzung erlauben, eine Verbindung zu einer Transaktion herzustellen , die von einer anderen Sitzung gestartet wurde. Dies ist ein ziemlich undurchsichtiges Paket, aber es gab kürzlich ein gutes Beispiel für die Verwendung in der PL / SQL-Challenge (Sie benötigen möglicherweise ein kostenloses Konto, um darauf zuzugreifen).

3) Wenn Sie nur versuchen, den Status des Stapelverarbeitungsprozesses und nicht die tatsächlichen Daten anzuzeigen, kann der Stapelverarbeitungsprozess Protokollinformationen mithilfe von autonomen Transaktionen schreiben, die Sie dann in einer anderen Sitzung abfragen können. Oder Sie können das Paket DBMS_APPLICATION_INFO verwenden , um Ihre Anwendung verschiedene Attribute in V $ SESSION und / oder V $ SESSION_LONGOPS aktualisieren zu lassen, damit Sie den Status der Auslastung aus einer anderen Sitzung überwachen können.


10

edit: dies wurde geschrieben, bevor die Frage geklärt wurde

Sie können Flashback-Abfragen verwenden, um die Tabelle ohne Ihre eigenen nicht festgeschriebenen Daten anzuzeigen.

Erwägen:

SQL> CREATE TABLE my_table
  2  AS SELECT ROWNUM ID FROM dual CONNECT BY LEVEL <= 5;

Table created

SQL> INSERT INTO my_table VALUES (6);

1 row inserted

Um den Unterschied zwischen der Tabelle mit meiner Transaktion und der Tabelle aus Sicht anderer zu sehen, könnte ich Folgendes ausgeben:

SQL> SELECT * FROM my_table
  2  MINUS
  3  SELECT * FROM my_table AS OF TIMESTAMP (systimestamp);

        ID
----------
         6

2
@jack: Es ist nicht klar, ob das OP nicht festgeschriebene Daten außerhalb seiner Sitzung anzeigen möchte (das Pseudo-Skript könnte sich in einer einzelnen Sitzung befinden). Meine Antwort würde nur funktionieren, wenn die eigenen ausstehenden Änderungen an einer Tabelle angezeigt würden.
Vincent Malgrat

du hast recht, sorry. Gute Antwort.
Jack Douglas

8

Ja - LogMiner kann dies tun. Wenn Sie nur festgeschriebene Transaktionen wünschen, müssen Sie die Ausgabe gezielt filtern ! Und es ist TABLE_NAMEin V$LOGMINER_CONTENTS, das ist , wie man an einem einzigen Tisch aussehen würde.



5

Es gibt keine direkte Methode; Sie müssen entweder die Protokolle analysieren (wie in einer anderen Antwort erwähnt) oder alternative Methoden verwenden, um zu sehen, was in einem langfristigen Prozess geschieht.

Persönlich empfehle ich die Verwendung autonomer Transaktionen, um diese Funktion zu aktivieren - nicht für die Transaktion selbst, sondern als Protokollierungsmechanismus, der Sie über die aktuellen Vorgänge informiert. Beispielsweise könnte PROCEDURE LONG_ACTION den Aufruf PROCEDURE WRITE_LOG_ENTRY (definiert als autonome Transaktion) haben, der einen VARCHAR2 in eine andere Tabelle schreibt. Autonome Transaktionen beeinträchtigen Ihre aktuelle Transaktion NICHT (aus LOGISCHER Sicht; achten Sie auf mögliche Auswirkungen auf die Leistung), sodass Sie anhand Ihrer Protokolleinträge unabhängig von einem COMMIT oder ROLLBACK in Ihrer aktuellen Transaktion sehen können, was vor sich geht. Das heißt, Sie können das mit einer massiven DML-Anweisung tun. Sie müssten eine Schleife verwenden.

Erwägen:

TABLE LOG_ENTRIES defined as
    activity_date  date,
    log_entry varchar2(2000)

TABLE BIG_JOB (definition doesn't really matter)

PROCEDURE WRITE_LOG_ENTRY
                        ( str VARCHAR2 )
IS
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    INSERT INTO LOG_ENTRIES VALUES ( SYSDATE, str );
    COMMIT;
END;

PROCEDURE LONG_ACTION IS
    c NUMBER;
BEGIN
    FOR r IN ( SELECT * FROM BIG_JOB )
    LOOP
       c := c + 1;
       UPDATE BIG_JOB z
          SET fld = hairy_calculation
        WHERE z.rowid = r.rowid;
       IF MOD(c,500) = 0 THEN
           WRITE_LOG_ENTRY ( c || ' rows processed.' );
       END IF;
    END LOOP;
    COMMIT;
END;

Aus den oben genannten Gründen erhalten Sie unabhängig vom Erfolg der langen Aktion alle 500 verarbeiteten Zeilen einen Protokolleintrag. Wenn Sie ein genaues Duplikat der Daten benötigen, um zu sehen, wie es funktioniert, empfehle ich, eine Duplikattabelle zu erstellen und eine Prozedur aufzurufen, die die Daten dupliziert (wobei die Prozedur eine autonome Transaktion ist). Dann nuke die Daten nachträglich. (Keine Notwendigkeit zur Vervielfältigung.)

Wenn dies zum Debuggen gedacht ist, empfehle ich außerdem, die Notwendigkeit einer solchen Protokollierung zu entfernen oder drastisch zu reduzieren, wenn die Dinge getestet wurden. Und wie immer testen, testen, testen Sie auf Ihrem eigenen System, um zu überprüfen, wie die Dinge funktionieren werden. (Im Kommentar von Niall finden Sie ein gutes Beispiel dafür, wie sich die Protokollierung drastisch auf die Leistung auswirkt.)

(Schließlich, weil ich es versäumt habe, es vorher zu erwähnen: Passen Sie auf autonome Transaktionen auf. Verstehen Sie sie vollständig, bevor Sie sie implementieren, und verwenden Sie sie nicht "nur weil". Sie können auf millionenfache Weise falsch verwendet werden (sagen Sie zum Beispiel zu ATTEMPT) Vermeiden Sie einen mutierten Fehler in einem Trigger.) Wenn dies nicht möglich ist, sollten Sie immer nach Alternativen suchen. Wenn dies nicht möglich ist, gehen Sie vorsichtig vor. Die Protokollierung während längerer Operationen war immer ein Fall, in dem dies ziemlich sicher war (Ignorieren) Leistungsprobleme), aber beeilen Sie sich nicht, um es auf andere Verwendungen anzuwenden, ohne die Konsequenzen zu kennen.)


1
Die Vorsichtsmaßnahmen am Ende dieses Vorschlags werden in meiner langen Antwort (mit Code) unter orawin.info/blog/2011/09/06/advice-from-the-internet näher erläutert . Kurz gesagt, diese Vorgehensweise kann sich ernsthaft und nachteilig auf Code auswirken, der bereits langsam ist.
Niall Litchfield

1
@Niall Litchfield, Wie immer, wenn man Ratschläge aus dem Internet annimmt, sollte man immer testen, testen, testen. Als erwähnt wurde, dass die autonome Transaktion die Transaktion nicht beeinflusst, bezog ich mich auf die Tatsache, dass sie Ihre aktuelle Transaktion weder COMMIT noch ROLLSBACK enthält. Aus logischen Gründen hat dies keine Auswirkung auf Ihre aktuelle Transaktion. Ja, Oracle hat natürlich Dinge hinter den Kulissen getan, damit diese funktionieren. Dies kann zu Performance-Problemen führen. Aus Sicht der Transaktion allein steht die autonome Transaktion dem Status meiner aktuellen Transaktion nicht im Wege.
Kerri Shotts

@Niall Litchfield, Alles in allem haben autonome Transaktionen ihre eigenen Probleme (eines davon ist, dass die Leute versuchen, mit ihnen an einem mutierenden Tisch herumzukommen), und deshalb empfehle ich sie sparsam und mit Vorsicht und NUR mit dem Verständnis, was los ist.
Kerri Shotts

3

Nicht in 10g verfügbar, aber DBMS_XA kann es einer Transaktion ermöglichen, mehrere Sitzungen zu durchlaufen . Auf diese Weise kann die zweite Sitzung sehen, was in der Transaktion vor sich geht


3

Zusätzlich zu den anderen hier aufgeführten Informationen können Sie Informationen zu einer nicht festgeschriebenen Transaktion auch per E-Mail senden oder in eine Textdatei schreiben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.