Oracle - Будь-який спосіб перегляду невмілих змін певної таблиці?


24

Я налагоджую через пакетний процес в даний час, який робить багато операторів DML, але не виконує жодного разу. Було б непогано мати можливість переглянути "очікувані" зміни з іншого сеансу, поки транзакція не буде здійснена. Чи можливо це?

Приклад:

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

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

...other DML statements....

commit;

Існує більше ніж один спосіб зробити це. Наприклад, тут можна вирішити SQL-заяви: ducquoc.wordpress.com/2012/07/14/oracle-uncommited-changes удача,

Відповіді:


18

Існує декілька різних підходів, залежно від деталей вашого пакетного процесу та того, чому ви намагаєтесь переглянути невідомі зміни.

1) Oracle Workspace Manager - це інструмент, який спочатку був розроблений для того, щоб люди, що розробляють просторові програми, мали еквівалент надзвичайно тривалих транзакцій (тобто транзакцій, за якими людині можуть знадобитися кілька днів або тижнів, щоб з'ясувати, де провести трубопровід в одній транзакції ). Ваш пакетний процес може створити нову робочу область (що логічно як створення нової транзакції), вносити будь-які зміни, які вона хотіла б у цій робочій області, виконуючи будь-коли, коли вона захотіла. В окремому сеансі ви б не побачили жодних із здійснених змін, поки не увійдете в робочу область пакетного процесу. Коли пакетний процес закінчиться, він може об'єднати робочу область назад в робочу робочу область, що є еквівалентом здійснення транзакції.

2) Пакет DBMS_XA може використовуватися, щоб дозволити "передавати" транзакцію з одного сеансу в інший і дозволити одному сеансу підключитися до транзакції, розпочатої іншим сеансом. Це досить незрозумілий пакет, який ви використовуєте, але останнім часом був приємний приклад його використання у програмі PL / SQL Challenge (вам, можливо, знадобиться безкоштовний обліковий запис для доступу до нього).

3) Якщо ви просто намагаєтесь побачити статус пакетного процесу, а не бачити фактичні дані, пакетний процес може записувати інформацію журналу, використовуючи автономні транзакції, які ви могли б запитувати з іншого сеансу. Або ви можете використовувати пакет DBMS_APPLICATION_INFO, щоб ваша програма додала оновлення різних атрибутів у V $ SESSION та / або V $ SESSION_LONGOPS, щоб ви могли відстежувати стан завантаження з іншого сеансу.


10

редагувати: це було написано до того, як питання було з’ясовано

Ви можете використовувати запити про зворотний зв'язок, щоб переглянути таблицю без власних невпорядкованих даних.

Поміркуйте:

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

Щоб побачити різницю між таблицею та моєю транзакцією та таблицею, як бачили інші, я міг би видати:

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

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

2
@jack: незрозуміло, чи хоче ОП бачити некомплектні дані поза сеансом (псевдо-скрипт може бути за один сеанс). Моя відповідь спрацювала б лише для того, щоб побачити власні очікувані зміни до таблиці.
Вінсент Малграт

ти маєш рацію, вибач. Чудова відповідь.
Джек Дуглас

8

Так - LogMiner може це зробити. Насправді, якщо ви хочете лише здійснити транзакції, вам потрібно спеціально фільтрувати вихід! І є TABLE_NAMEв V$LOGMINER_CONTENTS, то, як ви будете виглядати в одній таблиці.


8

Те, що у Oracle не існує, - це режим ізоляції, який не читається, і не використовується . Інакше кажучи, ви не зможете запитувати невідправлені дані в іншій транзакції.

Існують способи виведення інформації з тривалої транзакції - не згадуваний поки що є автономні транзакції (які слід використовувати обережно)


5

Не існує прямого методу; вам доведеться або проаналізувати журнали (як згадується в іншій відповіді), або скористатися альтернативними методами, щоб побачити, що відбувається в тривалому процесі.

Особисто я пропоную використовувати автономні транзакції, щоб увімкнути цю функцію - не на саму транзакцію, а як механізм реєстрації даних, який дозволяє вам знати, що відбувається. Наприклад, ви могли б здійснити виклик PROCEDURE LONG_ACTION PROCEDURE WRITE_LOG_ENTRY (визначений як автономна транзакція), який запише VARCHAR2 в іншу таблицю. Автономні транзакції НЕ перешкоджають вашій поточній транзакції (з ЛОГІЧНОГО погляду; остерігайтеся потенційних наслідків для продуктивності), і таким чином ви можете бачити, що відбувається через ваші записи в журналі, незалежно від КОМІТЕТУ або ЗВ'ЯЗКУ в поточній транзакції. Однак це можна зробити за допомогою одного масивного оператора DML; вам доведеться використовувати цикл.

Поміркуйте:

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;

З огляду на вищесказане, ви отримаєте запис журналу на кожні 500 рядків, оброблених незалежно від успіху тривалої дії. Якщо вам потрібен точний дублікат даних, щоб побачити, як вони працюють, я пропоную зробити дублікат таблиці та викликати процедуру, яка буде дублювати дані (процедура є автономною транзакцією). Потім нуклеюйте дані за фактом. (Немає необхідності у дублюванні.)

Далі, якщо це з метою налагодження, я пропоную видалити або різко зменшити потребу в таких журналах, коли речі перевіряються. І, як завжди, тестуйте, тестуйте, тестуйте на власній системі, щоб перевірити, як все буде працювати. (Див. Коментар від Niall для гарного прикладу того, як ведення журналу може кардинально вплинути на продуктивність.)

(Нарешті, тому, що я знехтував згадувати це раніше: остерігайтеся автономних транзакцій. Розумійте їх повністю перед реалізацією, і не використовуйте їх "просто тому, що". Вони можуть бути використані мільйонними способами неправильно (скажімо, наприклад, для ATTEMPT для уникайте помилок мутації в тригері), тому завжди краще знайти альтернативи, якщо це можливо. Якщо ви не можете, то продовжуйте з обережністю. Ведення журналу під час довготривалих операцій завжди було одним із випадків, коли це досить безпечно (ігнорування проблеми з ефективністю), але не поспішайте застосовувати його до інших цілей, не знаючи наслідків.)


1
Застереження в кінці цієї пропозиції вивчаються далі у моїй тривалій відповіді (з кодом) на orawin.info/blog/2011/09/06/advice-from-the-internet . Коротше кажучи, прийняття такого підходу може серйозно і негативно вплинути на код, який вже повільно.
Найл Літчфілд

1
@Niall Litchfield, Як завжди, коли приймаєш поради з Інтернету, завжди слід перевіряти, тестувати, тестувати. Коли згадувалося, що автономна транзакція не впливає на транзакцію, я мав на увазі той факт, що вона не COMMITs або ROLLsBACK вашої поточної транзакції; тому в ЛОГІЧНОМУ сенсі це нічого не робить для вашої поточної транзакції. Так, звичайно, Oracle має щось робити за кадром, щоб змусити роботу працювати, що може означати проблеми з продуктивністю, з точки зору лише транзакції, автономна транзакція не перешкоджає стану моєї поточної транзакції.
Керрі Шотц

@Niall Litchfield. Все, що було сказано, автономні транзакції мають власну справедливу частку проблем (одна з яких трапляється так, що люди намагаються використовувати їх, щоб обійти мутуючий стіл), і тому я рекомендую їх скупо і обережно, і ТІЛЬКИ з розумінням того, що відбувається.
Керрі Шотц

3

Недоступно в 10 г, але DBMS_XA може дозволити транзакції перетинати кілька сеансів. За допомогою цього другого сеансу можна побачити, що відбувається в транзакції


3

На додаток до іншої інформації тут, додатковими способами надіслати інформацію про незареєстровану транзакцію було б надіслати електронний лист або написати текстовий файл.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.