Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Прервать выполнение конкретного запроса SQL_ID без удаления сессии / 12 сообщений из 12, страница 1 из 1
14.11.2016, 13:45
    #39346825
Sergey_Korolev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
Добрый день!

Кто знает простой и надежный способ прервать выполнение конкретного запроса SQL_ID без удаления сессии ?
...
Рейтинг: 0 / 0
14.11.2016, 15:31
    #39346924
Maxim Demenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
Sergey_Korolev,

Не знаю критериев простоты/надежности, но http://blog.tanelpoder.com/2010/02/17/how-to-cancel-a-query-running-in-another-session/ как вариант.
Я протестировал с dbms_resource_manager - запрос обрывается с ORA-00040

Regards

Maxim
...
Рейтинг: 0 / 0
14.11.2016, 15:39
    #39346936
Maxim Demenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
...
Рейтинг: 0 / 0
16.11.2016, 17:09
    #39348586
Sergey_Korolev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
Сработало вот так , 12.1.0.2.0

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
DECLARE
   l_status   v$session.status%TYPE;
BEGIN
   FOR L_c
      IN (SELECT SM.SID, SM.SESSION_SERIAL#, SM.INST_ID
            FROM gv$sql_monitor SM
           WHERE 
                SM   .SQL_ID = '7nb76awdu8hsa'
                 AND SM.STATUS = 'EXECUTING'
                 AND SM.MODULE = 'JDBC Thin Client'
                 AND SM.ELAPSED_TIME / 1000000 >= 60)
   LOOP
      BEGIN
         DBMS_SYSTEM.set_ev (l_c.SID,
                             l_c.SESSION_SERIAL#,
                             10237,
                             1,
                             '');

         LOOP
            SELECT status
              INTO l_status
              FROM v$session
             WHERE sid = l_c.SID AND serial# = l_c.SESSION_SERIAL#;

            EXIT WHEN l_status = 'INACTIVE';
         END LOOP;

         DBMS_SYSTEM.set_ev (l_c.SID,
                             l_c.SESSION_SERIAL#,
                             10237,
                             0,
                             '');
      END;
   END LOOP;
END;
...
Рейтинг: 0 / 0
17.11.2016, 02:45
    #39348764
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
Sergey_Korolev
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
         LOOP
            SELECT status
              INTO l_status
              FROM v$session
             WHERE sid = l_c.SID AND serial# = l_c.SESSION_SERIAL#;

            EXIT WHEN l_status = 'INACTIVE';
         END LOOP;

Хоть бы таймаут какой предусмотрел
...
Рейтинг: 0 / 0
17.11.2016, 07:40
    #39348786
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
Вячеслав ЛюбомудровSergey_Korolev
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
         LOOP
            SELECT status
              INTO l_status
              FROM v$session
             WHERE sid = l_c.SID AND serial# = l_c.SESSION_SERIAL#;

            EXIT WHEN l_status = 'INACTIVE';
         END LOOP;

Хоть бы таймаут какой предусмотрелнайдет sql_id этой байды и ...
...
Рейтинг: 0 / 0
18.11.2016, 16:50
    #39349978
Sergey_Korolev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
Приму все конструктивные предложения по улучшению алгоритма :)
...
Рейтинг: 0 / 0
19.11.2016, 11:19
    #39350240
Nobody1111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
Вячеслав ЛюбомудровSergey_Korolev
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
         LOOP
            SELECT status
              INTO l_status
              FROM v$session
             WHERE sid = l_c.SID AND serial# = l_c.SESSION_SERIAL#;

            EXIT WHEN l_status = 'INACTIVE';
         END LOOP;

Хоть бы таймаут какой предусмотрелЕсли с таймаутом, то cancel получат все sql-операторы, которые сессия будет пытаться выполнять в течение этого таймаута. Грубовато, тогда уж проще kill.
...
Рейтинг: 0 / 0
19.11.2016, 11:39
    #39350242
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
Да нет же
Просто, если скажем, в течении минуты-пяти состояние сессии не изменилось, просто вернуть событие взад и отрапортавать об этом.
Скорее всего, оно уже и не сработает
...
Рейтинг: 0 / 0
19.11.2016, 12:34
    #39350261
marked for cancel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
А зачем вообще этот цикл?
...
Рейтинг: 0 / 0
19.11.2016, 13:36
    #39350278
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
Подозреваю, что отсюда , но там как раз есть таймаут
...
Рейтинг: 0 / 0
01.12.2016, 13:43
    #39358457
Sergey_Korolev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прервать выполнение конкретного запроса SQL_ID без удаления сессии
Так лучше ?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
/* Cancel  concrete querys SQL_ID on ' ELAPSED_TIME> X...Y
    Run by SYS */
DECLARE
   l_status   v$session.status%TYPE;
BEGIN
   FOR L_c
      IN (
           SELECT SM.SID, SM.SESSION_SERIAL#, SM.INST_ID
            FROM gv$sql_monitor SM, v$session VS
           WHERE  (SM.SID= VS.SID AND SM.SESSION_SERIAL#= VS.SERIAL#)
               AND  VS.STATUS = 'ACTIVE'
                AND
                (
                (SM.SQL_ID IN ('7nb76awdu8hsa', '3pvsjbfq4fzvt')
                 AND SM.STATUS = 'EXECUTING'
                 AND SM.MODULE = 'JDBC Thin Client'
                 AND SYSDATE - SM.SQL_EXEC_START < 1 / 24 / 4
                 AND SM.ELAPSED_TIME / 1000000 >= 300)
                 OR
                 (SM.SQL_ID IN ('b8rz3mkq7yw07')
                 AND SM.STATUS = 'EXECUTING'
                 AND SM.MODULE = 'JDBC Thin Client'
                 AND SYSDATE - SM.SQL_EXEC_START < 1 / 24 / 4
                 AND SM.ELAPSED_TIME / 1000000 >= 120)
                 )
           )
  LOOP
      BEGIN

           begin
                   SELECT status INTO l_status
                    FROM v$session
                     WHERE sid = l_c.SID AND serial# = l_c.SESSION_SERIAL#;
                     exception
                     --  SID no longer found
                      when NO_DATA_FOUND then
                        raise_application_error(-20001, 'SID: ' || l_c.SID || ' no longer found after cancelling');
                end;

           IF l_status = 'ACTIVE' then
             DBMS_SYSTEM.set_ev (l_c.SID,l_c.SESSION_SERIAL#,10237,1,'');
           ELSE
             EXIT;
           END IF;

         FOR i IN 1..10 LOOP
              begin
                   SELECT status INTO l_status
                    FROM v$session
                     WHERE sid = l_c.SID AND serial# = l_c.SESSION_SERIAL#;
                     exception
                     --  SID no longer found
                      when NO_DATA_FOUND then
                        raise_application_error(-20001, 'SID: ' || l_c.SID || ' no longer found after cancelling');
                end;

            -- Status no longer active
            -- then set event level to 0 to avoid further cancels
            if l_status != 'ACTIVE' then
              SYS.DBMS_SYSTEM.set_ev (l_c.SID,l_c.SESSION_SERIAL#,10237,0,'');
            exit;
            end if;

         dbms_lock.sleep(0.05);
         END LOOP;

      END;
   END LOOP;
END;
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Прервать выполнение конкретного запроса SQL_ID без удаления сессии / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]