Уничтожение задачи не разблокирует таблицы в SQL Developer

Я использую Oracle SQL Developer версии 3.0.04 для взаимодействия с базой данных 11g через VPN с сервером моей компании. Я заметил, что после уничтожения задачи через окно «Ход выполнения задачи» она на самом деле не «убивает» задачу сразу. Я читал на некоторых форумах, что Oracle пытается «откатить» изменения, сделанные процедурой, которую я вызываю, но я не могу себе представить, что откат к моему состоянию занимает более 10 минут. последний коммит после 5 минут работы. Это наводит меня на мысль, что он все равно продолжает работать.

Я могу сообщить администратору базы данных, чтобы тот уничтожил мой сеанс, что освободит блокировку таблиц, используемых процессом (а также исходный код пакета, чтобы я мог снова его отредактировать), но это не оптимальное решение. У меня нет доступа к БД из командной строки, и у меня нет прав администратора через SQL Developer. Есть ли способ окончательно убить задачу, которую я начал, а-ля kill -9?


person Matthew Presser    schedule 03.01.2012    source источник
comment
Я не могу себе представить, что откат к моему последнему коммиту после 5 минут работы занимает более 10 минут — Oracle оптимизирует производительность фиксации, поэтому откаты действительно могут быть на удивление дорогими.   -  person skaffman    schedule 04.01.2012
comment
Я все еще могу просто запустить его на 30 секунд, и для завершения потребуется более 5 минут (я больше не ждал, прежде чем попросить администратора баз данных завершить мой сеанс).   -  person Matthew Presser    schedule 04.01.2012


Ответы (1)


Я использую эту общую штуку, чтобы увидеть, что работает в схеме, и использовать ее для мониторинга отката. Он использует концепции, украденные из разных мест в сети, в том числе и из Ask Tom.

DECLARE

    SID                 INTEGER;
    LOCKWAIT            VARCHAR2(100);
    OSUSER              VARCHAR2(32);
    PROGRAM             VARCHAR2(48);
    LOGIN_TIME          DATE;
    SQL_TEXT            VARCHAR2(32760);
    estimated_rollback_megs     INTEGER;
    STATUS              VARCHAR2(8);

    OSUSERX VARCHAR2(100);
    PROGRAMX VARCHAR2(100);
    SIDX    INTEGER;
    STATUSX VARCHAR2(100);
    MACHINEX VARCHAR2(100);
    LOGON_TIMEX DATE;
    LOCKED_OBJECT_NAME VARCHAR2(100);

    processcount integer := 0;

    CURSOR raw_data IS
        WITH 
            sessionInfo AS
            (
                SELECT *
                FROM V$SESSION
                WHERE USERNAME = USER   -- Just data for my current schema
                ORDER BY SID
            )
            SELECT si.SID,
                   si.LOCKWAIT,
                   si.OSUSER,
                   si.PROGRAM,
                   si.LOGON_TIME,
                   si.STATUS,
                   (
                       SELECT ROUND(USED_UBLK*8/1024,1) 
                       FROM V$TRANSACTION,
                            sessionInfo
                       WHERE sessionInfo.TADDR = V$TRANSACTION.ADDR
                       AND sessionInfo.SID = si.SID

                    ) estimated_rollback_megs,

                    (
                       SELECT (MAX(DECODE(PIECE,  0,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE,  1,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE,  2,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE,  3,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE,  4,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE,  5,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE,  6,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE,  7,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE,  8,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE,  9,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 10,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 11,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 12,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 13,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 14,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 15,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 16,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 17,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 18,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 19,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 20,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 21,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 22,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 23,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 24,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 25,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 26,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 27,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 28,SQL_TEXT,NULL)) ||
                               MAX(DECODE(PIECE, 29,SQL_TEXT,NULL)))    
                        FROM V$SQLTEXT_WITH_NEWLINES
                        WHERE ADDRESS = SI.SQL_ADDRESS AND 
                        PIECE < 30
                    ) SQL_TEXT
            FROM sessionInfo  si;

            CURSOR LONG_OPERATIONS(SIDx number) IS
                SELECT VL.MESSAGE, 
                       VL.START_TIME, 
                       VL.LAST_UPDATE_TIME, 
                       VL.TIME_REMAINING
                FROM V$SESSION_LONGOPS VL,
                     V$SESSION V
                WHERE VL.USERNAME LIKE USER AND
                      V.SID = VL.SID AND
                      V.SERIAL# = VL.SERIAL# AND
                      V.SID = SIDx AND
                      VL.TIME_REMAINING > 0
                ORDER BY LAST_UPDATE_TIME DESC;

message         VARCHAR2(100);
startTime       DATE;
lastUpdateTime  DATE;
timeRemaining   VARCHAR2(100);


PROCEDURE print_sql_statement
(
    printThis IN VARCHAR2,
    Plen  IN NUMBER DEFAULT 132,
    Pwhsp IN VARCHAR2 DEFAULT  -- newline+space+tab+comma
             CHR(10) || CHR(32) || CHR(9) || ','
) 
IS
    NL CONSTANT VARCHAR2(1) := CHR(10);  -- newline character (OS-independent)
    SP CONSTANT VARCHAR2(1) := CHR(32);  -- space character
    TB CONSTANT VARCHAR2(1) := CHR(9);   -- tab character
    CM CONSTANT VARCHAR2(1) := ',';      -- comma
    substringStart INTEGER := 1;  -- start of string to print
    substringEnd  INTEGER;       -- end of substring to print
    endOfString  INTEGER := LENGTH(printThis);  -- end of string to print
    newLinePosition    INTEGER;       -- point where newline found
    stringLength       INTEGER := GREATEST(LEAST(Plen, 255), 10);  -- 10 <= len <= 255!
BEGIN

NULL;

END print_sql_statement;


BEGIN

    DBMS_OUTPUT.ENABLE(1000000);

    DBMS_OUTPUT.PUT_LINE('Monitor for ' || USER);

    OPEN raw_data;


    LOOP

        FETCH raw_data INTO
            SID,
            LOCKWAIT,
            OSUSER,
            PROGRAM,
            LOGIN_TIME,
            STATUS,
            estimated_rollback_megs,
            SQL_TEXT;

        EXIT WHEN raw_data%NOTFOUND;

        processcount := processcount + 1;

        DBMS_OUTPUT.PUT_LINE('');
        DBMS_OUTPUT.PUT_LINE(OSUSER || ' Owns Session ' || SID || ' STATUS ' || STATUS);
        DBMS_OUTPUT.PUT_LINE('Running ' || PROGRAM || ' Since ' || TO_CHAR(LOGIN_TIME,'MM/DD HH24:MI:SS'));

        OPEN LONG_OPERATIONS(SID);

        LOOP
            FETCH LONG_OPERATIONS INTO
                message,
                startTime,
                lastUpdateTime,
                timeRemaining;

            EXIT WHEN LONG_OPERATIONS%NOTFOUND;

            DBMS_OUTPUT.PUT_LINE('    ' || message);
            DBMS_OUTPUT.PUT_LINE('    START: ' || TO_CHAR(startTime,'DD HH24:MI:SS')  || 
                                   ' UPDATE: ' || TO_CHAR(lastUpdateTime, 'DD HH24:MI:SS') || 
                                ' REMAINING: ' || timeRemaining);
            DBMS_OUTPUT.PUT_LINE('    ');

        END LOOP;

        CLOSE LONG_OPERATIONS;

        IF estimated_rollback_megs > 0  then
            DBMS_OUTPUT.PUT_LINE('Estimated megs of rollback ' || estimated_rollback_megs);
        END IF;

        IF LOCKWAIT IS NOT NULL THEN

            SELECT SID
            INTO SIDX
            FROM V$LOCK
            WHERE ID1 = 
            (
                SELECT ID1
                FROM V$LOCK
                WHERE KADDR = LOCKWAIT
            ) AND BLOCK = 1;

            DBMS_OUTPUT.PUT_LINE('The session is waiting on a lock held by session ' || SIDX);


            select  OBJECT_TYPE || ':' || OBJECT_NAME || ':' || SUBOBJECT_NAME THINGY
            INTO LOCKED_OBJECT_NAME
            from dba_objects
            where object_id =
            (
                select object_id
                from v$locked_object
                where session_id = SIDX
            );

            DBMS_OUTPUT.PUT_LINE('The locked object is ' || LOCKED_OBJECT_NAME);

            SELECT OSUSER,  PROGRAM,  SID,  STATUS,  MACHINE,  LOGON_TIME
            INTO   OSUSERX, PROGRAMX, SIDX, STATUSX, MACHINEX, LOGON_TIMEX
            FROM V$SESSION
            WHERE SID = SIDX;

            DBMS_OUTPUT.PUT_LINE(SIDX || ': ' || OSUSER || ' Using ' || PROGRAMX || ' STATUS ' || STATUSX);
            DBMS_OUTPUT.PUT_LINE(SIDX || ': LOGGED IN ON ' || MACHINEX || ' SINCE ' || 
            TO_CHAR(LOGON_TIMEX, 'MM/DD HH24:MI:SS'));

        END IF;

        IF SUBSTR(SQL_TEXT, 1, 16) <> 'WITH SESSIONINFO' THEN

            print_sql_statement(SQL_TEXT, 132);
            DBMS_OUTPUT.PUT_LINE('');
        ELSE
            NULL;
        END IF;

    END LOOP;

    CLOSE raw_data;

    DBMS_OUTPUT.PUT_LINE(processcount || ' sessions found');

END;
person EvilTeach    schedule 03.01.2012
comment
Спасибо, но на самом деле это не решает мою проблему невозможности убить задачу. - person Matthew Presser; 04.01.2012
comment
Это действительно решает проблему ответа на вопрос: я все еще откатываюсь назад? - person EvilTeach; 04.01.2012