Каков самый быстрый способ убить все сеансы указанного пользователя в 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;
/