Oracle - jakikolwiek sposób na wyświetlenie niezaangażowanych zmian w konkretnej tabeli?


24

Obecnie debuguję proces wsadowy, który wykonuje wiele instrukcji DML, ale nie wykonuje od razu zatwierdzenia. Byłoby miło móc zobaczyć „oczekujące” zmiany z innej sesji, gdy transakcja nie jest zatwierdzona. czy to możliwe?

Przykład:

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

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

...other DML statements....

commit;

Jest na to więcej niż jeden sposób. Na przykład poniższe instrukcje SQL mogą rozwiązać: ducquoc.wordpress.com/2012/07/14/oracle-uncommited-changes szczęście,

Odpowiedzi:


18

Istnieje kilka różnych podejść w zależności od szczegółów procesu wsadowego i powodu, dla którego próbujesz wyświetlić niezatwierdzone zmiany.

1) Oracle Workspace Manager to narzędzie, które pierwotnie zostało zaprojektowane w celu umożliwienia osobom opracowującym aplikacje przestrzenne równoważenie niezwykle długotrwałych transakcji (tj. Transakcji, które mogą wymagać wielu dni lub tygodni od ludzi zastanawiających się, gdzie uruchomić rurociąg w jednej transakcji ). W procesie wsadowym można utworzyć nowy obszar roboczy (co logicznie przypomina tworzenie nowej transakcji), wprowadzić dowolne zmiany w tym obszarze roboczym, zatwierdzając je w dowolnym momencie. W oddzielnej sesji nie zobaczysz żadnych zatwierdzonych zmian, dopóki nie wejdziesz do obszaru roboczego procesu wsadowego. Po zakończeniu procesu wsadowego może połączyć swój obszar roboczy z powrotem z aktywnym obszarem roboczym, co jest równoważne z dokonaniem transakcji.

2) Pakiet DBMS_XA może służyć do „przekazania” transakcji z jednej sesji do drugiej oraz do umożliwienia jednej sesji połączenia z transakcją rozpoczętą przez inną sesję. Jest to dość niejasny pakiet do użycia, ale był miły przykład użycia go w PL / SQL Challenge (możesz potrzebować darmowego konta, aby uzyskać do niego dostęp) ostatnio.

3) Jeśli po prostu próbujesz zobaczyć status procesu wsadowego, a nie rzeczywiste dane, proces wsadowy może zapisać informacje rejestrowania przy użyciu autonomicznych transakcji, które możesz następnie zapytać z innej sesji. Możesz też użyć pakietu DBMS_APPLICATION_INFO, aby aplikacja zaktualizowała różne atrybuty w V $ SESSION i / lub V $ SESSION_LONGOPS, abyś mógł monitorować status obciążenia z innej sesji.


10

edycja: zostało napisane przed wyjaśnieniem pytania

Możesz użyć zapytań retrospektywnych, aby zobaczyć tabelę bez własnych nieproszonych danych.

Rozważać:

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

Aby zobaczyć różnicę między tabelą z moją transakcją a tabelą widzianą przez innych, mógłbym wydać:

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

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

2
@jack: nie jest jasne, czy OP chce widzieć nieproszone dane poza swoją sesją (pseudo-skrypt może znajdować się w jednej sesji). Moja odpowiedź działałaby tylko w celu zobaczenia własnych oczekujących modyfikacji tabeli.
Vincent Malgrat

masz rację, przepraszam. Świetna odpowiedź.
Jack Douglas

8

Tak - LogMiner może to zrobić. W rzeczywistości, jeśli chcesz tylko zatwierdzone transakcje, musisz specjalnie filtrować dane wyjściowe! I nie ma TABLE_NAMEw V$LOGMINER_CONTENTS, to jak byś wyglądał w jednej tabeli.



5

Nie ma bezpośredniej metody; będziesz musiał albo przeanalizować dzienniki (jak wspomniano w innej odpowiedzi), albo użyć alternatywnych metod, aby zobaczyć, co dzieje się w długotrwałym procesie.

Osobiście sugeruję użycie autonomicznych transakcji, aby włączyć tę funkcję - nie w samej transakcji, ale jako mechanizm rejestrowania, który informuje Cię o tym, co się dzieje. Na przykład możesz mieć wywołanie PROCEDURE LONG_ACTION PROCEDURE WRITE_LOG_ENTRY (zdefiniowane jako transakcja autonomiczna), które zapisałoby VARCHAR2 do innej tabeli. Transakcje autonomiczne NIE zakłócają bieżącej transakcji (z perspektywy LOGICZNEJ, uważaj na potencjalny wpływ na wydajność), dzięki czemu możesz zobaczyć, co się dzieje, poprzez wpisy logowania, niezależnie od ZALECENIA lub ROLLBACK w bieżącej transakcji. To powiedziawszy, możesz to zrobić za pomocą jednej ogromnej instrukcji DML; musisz użyć pętli.

Rozważać:

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;

Biorąc pod uwagę powyższe, otrzymasz wpis dziennika dla każdych 500 przetworzonych wierszy, niezależnie od powodzenia długiej akcji. Jeśli potrzebujesz dokładnego duplikatu danych, aby zobaczyć, jak działa, sugeruję utworzenie duplikatu tabeli i wywołanie procedury, która powieliby dane (procedura jest transakcją autonomiczną). Potem nuke dane po fakcie. (Nie ma potrzeby kopiowania).

Ponadto, jeśli jest to w celu debugowania, sugeruję usunięcie lub drastyczne zmniejszenie potrzeby takiego rejestrowania, gdy rzeczy zostały przetestowane. I jak zawsze testuj, testuj, testuj na swoim własnym systemie, aby sprawdzić, jak wszystko będzie działać. (Zobacz komentarz Nialla, aby zobaczyć dobry przykład, w jaki sposób rejestrowanie może drastycznie wpłynąć na wydajność).

(Wreszcie, ponieważ wcześniej nie wspomniałem o tym: strzeżcie się transakcji autonomicznych. Zrozumcie je w pełni przed wdrożeniem i nie używajcie ich „tylko dlatego, że”. Można ich używać na milion sposobów niepoprawnie (powiedzmy na przykład, aby PRÓBOWAĆ, aby unikaj błędu mutacji w wyzwalaczu), więc zawsze najlepiej jest znaleźć alternatywy, jeśli to możliwe. Jeśli nie możesz, postępuj ostrożnie. Rejestrowanie podczas długotrwałych operacji zawsze było jednym przypadkiem, w którym jest dość bezpieczne (ignorowanie problemy z wydajnością), ale nie spiesz się, aby zastosować go do innych zastosowań, nie znając konsekwencji.)


1
Ostrzeżenia na końcu tej sugestii zostały omówione w mojej długiej odpowiedzi (z kodem) na stronie orawin.info/blog/2011/09/06/advice-from-the-internet . Krótko mówiąc, przyjęcie tego podejścia może poważnie i negatywnie wpłynąć na kod, który jest już wolny.
Niall Litchfield,

1
@Niall Litchfield, Jak zawsze, korzystając z porad z Internetu, należy zawsze testować, testować, testować. Kiedy wspomniałem, że transakcja autonomiczna nie ma wpływu na transakcję, miałem na myśli fakt, że ani ona NIE NALEŻY ani NIE ZWRACA twojej bieżącej transakcji; dlatego w sensie logicznym nic nie wpływa na bieżącą transakcję. Tak, oczywiście, Oracle robi rzeczy za kulisami, aby wszystko działało, co może oznaczać problemy z wydajnością, z punktu widzenia transakcji, autonomiczna transakcja nie przeszkadza w stanie mojej obecnej transakcji.
Kerri Shotts,

@Niall Litchfield, To powiedziawszy, autonomiczne transakcje mają swój własny uczciwy udział w problemach (jednym z nich jest to, że ludzie próbują je wykorzystać, aby obejść mutujący stół), dlatego polecam je oszczędnie i ostrożnie, i TYLKO ze zrozumieniem, co się dzieje.
Kerri Shotts,

3

Niedostępne w 10 g, ale DBMS_XA może pozwolić na transakcję obejmującą wiele sesji. Korzystając z tego, druga sesja może zobaczyć, co dzieje się w transakcji


3

Oprócz innych informacji tutaj, dodatkowymi sposobami przesłania informacji o niezatwierdzonej transakcji byłoby wysłanie wiadomości e-mail lub zapisanie pliku tekstowego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.