Oracle - Belirli bir tabloda yapılan değişikliklerden herhangi birini görüntülemek için herhangi bir yol var mı?


24

Şu anda birçok DML deyimi yapan ancak hemen bir taahhütte bulunmayan bir toplu işlem sırasında hata ayıklamaktayım. İşlem yapılmazken başka bir oturumdaki "beklemede" değişiklikleri görebilmek güzel olurdu. Mümkün mü?

Örnek:

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

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

...other DML statements....

commit;

Bunu yapmanın birden fazla yolu var. Örneğin, buradaki SQL ifadeleri çözebilir: ducquoc.wordpress.com/2012/07/14/oracle-uncommited- iyi şanslar,

Yanıtlar:


18

Toplu işleminizin ayrıntılarına ve kabul edilmeyen değişiklikleri neden görüntülemeye çalıştığınıza bağlı olarak birkaç farklı yaklaşım vardır.

1) Oracle Workspace Manager , başlangıçta Uzamsal uygulamalar geliştiren kişilerin çok uzun süren işlemlere eşdeğerde olmalarını sağlamak için tasarlanan bir araçtır (yani, bir işlemde boru hattını nereye koyacaklarını bulmak için birkaç gün veya haftalarca insan gerektirebilecek işlemler) ). Toplu işleminiz, yeni bir çalışma alanı oluşturabilir (mantıksal olarak yeni bir işlem oluşturmak gibidir), istediği zaman işleme devam ederken bu çalışma alanında istediği değişiklikleri yapabilir. Ayrı bir oturumda, toplu işlemin çalışma alanına girinceye kadar taahhüt edilen değişikliklerden hiçbirini göremezsiniz. Toplu işlem tamamlandığında, çalışma alanını, bir işlem gerçekleştirmenin eşdeğeri olan canlı çalışma alanında birleştirebilir.

2) DBMS_XA paketi , bir işlemi bir oturumdan diğerine "teslim etmenize" izin vermek ve bir oturumun başka bir oturum tarafından başlatılan bir işleme bağlanmasına izin vermek için kullanılabilir. Bu kullanmak için oldukça karanlık bir paket, ancak son zamanlarda PL / SQL Mücadelesinde (buna erişmek için ücretsiz bir hesaba ihtiyacınız olabilir) kullanmanın güzel bir örneği vardı .

3) Asıl verileri görmek yerine toplu işlemin durumunu görmeye çalışıyorsanız, toplu işlem daha sonra başka bir oturumdan sorgulayabileceğiniz özerk işlemleri kullanarak günlük bilgilerini yazabilir. Veya uygulamanızın V $ SESSION ve / veya V $ SESSION_LONGOPS içindeki çeşitli nitelikleri güncellemesini sağlamak için yükün durumunu başka bir oturumdan izleyebilmeniz için DBMS_APPLICATION_INFO paketini kullanabilirsiniz .


10

düzenleme: bu soru netleştirilmeden önce yazılmıştır

Kendi uncommited verileriniz olmadan tabloyu görmek için flashback sorgularını kullanabilirsiniz .

Düşünmek:

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

Yaptığım işlemle masa ile diğerlerinin gördüğü masa arasındaki farkı görmek için aşağıdakileri yapabilirim:

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

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

2
@jack: OP'nin oturumu dışında istenmeyen verileri görmek isteyip istemediği belli değil (sözde komut dosyası tek bir oturumda olabilir). Cevabım, yalnızca bir kişinin masadaki beklemedeki değişikliklerini görmeye çalışır.
Vincent Malgrat

haklısın üzgünüm. Mükemmel cevap.
Jack Douglas

8

Evet - LogMiner bunu yapabilir. Aslında, yalnızca taahhütlü işlemler istiyorsanız , çıktıyı özel olarak filtrelemeniz gerekir! Ve orada TABLE_NAMEiçinde V$LOGMINER_CONTENTSo tek masada nasıl görüneceğini var.



5

Doğrudan bir yöntem yoktur; Günlükleri incelemelisiniz (başka bir cevapta belirtildiği gibi) veya uzun süren bir süreçte neler olduğunu görmek için alternatif yöntemler kullanmanız gerekir.

Şahsen, bu özelliği etkinleştirmek için özerk işlemler kullanmanızı öneririm - işlemin kendisinde değil, neler olduğunu bilmenizi sağlayan bir kayıt mekanizması olarak. Örneğin, başka bir tabloya VARCHAR2 yazacak PROCEDURE LONG_ACTION çağrı PROCEDURE WRITE_LOG_ENTRY (otonom bir işlem olarak tanımlanmıştır) olabilir. Özerk işlemler şu anki işleminize karışmaz (LOJİK bir bakış açısıyla; performans üzerindeki olası etkilerden sakının) ve böylece mevcut işleminizde bir KOMİTE veya ROLLBACK ne olursa olsun, kayıt girişlerinizle neler olup bittiğini görebilirsiniz. Bununla birlikte, bunu büyük bir DML ifadesiyle yapabileceğinizi söyledi; bir döngü kullanmak zorunda kalacaksın.

Düşünmek:

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;

Yukarıdakiler göz önüne alındığında, uzun eylemin başarısı ne olursa olsun, işlenen her 500 satır için bir günlük girişi alırsınız. Çalışmakta olduğunu görmek için verilerin kesin bir kopyasına ihtiyacınız varsa, yinelenen bir tablo hazırlamanızı ve verileri kopyalayacak bir prosedürü çağırmanızı (prosedür özerk bir işlemdir) öneririm. Sonra veriyi gerçeğin ardından çek. (Çoğaltmaya gerek yok.)

Ayrıca, eğer bu hata ayıklama amaçlıysa, test edildiğinde bu tür kayıtlara olan ihtiyacı ortadan kaldırmayı ya da büyük ölçüde azaltmayı öneriyorum. Ve her zamanki gibi, işlerin nasıl yürüdüğünü doğrulamak için kendi sisteminizde test edin, test edin, test edin. (Günlüğe kaydetmenin performansı nasıl önemli ölçüde etkileyebileceğine dair iyi bir örnek için Niall'in yorumuna bakın.)

(Son olarak, daha önce bahsetmeyi ihmal ettiğim için: özerk işlemlere dikkat edin. Bunları uygulamadan önce tamamen anlayın ve bunları "sadece çünkü" kullanmayın. Milyonlarca yanlış bir şekilde kullanılabilir (örneğin, ATTEMPT tetikte mutasyon hatası yapmaktan kaçının), bu nedenle mümkünse alternatifler bulmak her zaman en iyisidir. performans sorunları), ancak sonuçlarını bilmeden diğer kullanımlara uygulamak için acele etmeyin.)


1
Bu önerinin sonundaki uyarılar, uzun cevaplarımda (kodla) orawin.info/blog/2011/09/06/advice-from-the-internet adresinde daha fazla araştırıldı . Kısacası, bu yaklaşımı benimsemek, yavaş olan kodu ciddi ve olumsuz şekilde etkileyebilir.
Niall Litchfield

1
@Hayır Litchfield, Her zaman olduğu gibi, internetten tavsiye alırken, her zaman test edilmeli, test edilmelidir, test edilmelidir. Özerk işlemin işlemi etkilemediğinden bahsettiğimde, şu andaki işleminizin ne KOMİTE ne de ROLLsBACK olduğu gerçeğinden bahsediyordum; Bu nedenle, LOJİK anlamda, mevcut işleminize bir şey yapmaz. Evet, elbette, Oracle, işleri yürütmek için sahne arkasında işler yapar, bu da sadece işlem bakış açısıyla performans sorunları anlamına gelebilir, özerk işlem şu anki işlemimin yerine geçmiyor.
Kerri 10:11

@Niall Litchfield, Bunların hepsi, özerk işlemlerin kendilerine göre adil bir sorun payına sahiptir (bunlardan biri insanların onları mutasyon masasında dolaşmak için kullanmaya çalıştıklarıdır) ve bu yüzden onları dikkatli ve dikkatli bir şekilde tavsiye ediyorum ve SADECE neler olduğunu anlayarak.
Kerri 10:11

3

10 g olarak kullanılamaz, ancak DBMS_XA bir işlemin birden çok oturumu geçmesine izin verebilir. Bunu kullanmak, ikinci oturumun işlemde nelere neden olduğunu görebilir


3

Buradaki diğer bilgilere ek olarak, taahhüt edilmemiş bir işlem hakkında bilgi göndermenin bazı ek yolları bir e-posta göndermek veya bir metin dosyasına yazmak olabilir.

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.