Назад | Перейти на главную страницу

Каков самый быстрый способ убить все сеансы указанного пользователя в Oracle?

Каков самый быстрый способ убить все сеансы указанного пользователя в Oracle?

Вы должны уметь делать это в PL/SQL петля. Обязательно протестируйте его, просто зарегистрировав параметры, прежде чем фактически вызывать kill session.

BEGIN
  FOR c IN (
    SELECT s.sid,
           s.serial#
    FROM   v$session s
    WHERE  s.username = 'your_user_name'
  )
  LOOP
    EXECUTE IMMEDIATE 'alter system kill session ''' || 
                      c.sid || ',' || c.serial# || '''';
  END LOOP;
END;

Увидеть аналогичные вопрос по Asktom.

Другой подход, который может работать быстрее в целом, - это генерировать команды orakill и выполнять их в окне DOS:

SELECT 'orakill '||d.name||' '||spid
  FROM v$session s JOIN v$process p ON addr=paddr
                   JOIN v$database d ON (1=1)
WHERE s.username = 'THE_USER';

Orakill не ждет завершения транзакций сеанса, поэтому уничтожение происходит очень быстро.

Каким бы ни было ваше решение, будьте осторожны!

Следует помнить, что завершение сеанса в Oracle не обязательно останавливает сеанс пользователя (и связанные с ним процессы) от потребления ресурсов. Таким образом, неконтролируемый запрос может продолжать убегать, потребляя ресурсы, такие как ЦП и ввод-вывод, и удерживая блокировки, пока он не вернется обратно с помощью процесса / потока монитора процессов (pmon) Oracle.

Предполагая, что Oracle работает в системе Unix в режиме «выделенного соединения», можно присоединиться к v $ session и v $ process на v $ session.paddr = v $ process.addr, чтобы найти все сеансы и процессы для подключений данного пользователя, и используйте UNIX kill команда с SIGKILL чтобы убить базовые серверные процессы для пользовательских сеансов. Затем pmon очистит сбойный сеанс, откатывая все транзакции и снимая блокировки.

Это определенно серьезный подход, когда подход, о котором говорил ранее Питер Ланг, не убивает сеансы пользователя достаточно агрессивно.

изменить контрольную точку системы;
выключение прервать
ограничение запуска
немедленное отключение

:)

Вот очень легкое улучшение ответа Питера Ланга, которое мне легче использовать. Он интерактивен и запрашивает имя пользователя:

PROMPT Entrer the username to kill;
DEFINE username = &1
BEGIN
  FOR c IN (
    SELECT s.sid,
           s.serial#
    FROM   v$session s
    WHERE  s.username = '&&username'
  )
  LOOP
    EXECUTE IMMEDIATE 'alter system kill session ''' || 
                      c.sid || ',' || c.serial# || '''';
  END LOOP;
END;
/