Как я могу убить все сеансы, соединяющиеся с моей базой данных оракула? - PullRequest
29 голосов
/ 11 сентября 2008

Мне нужно быстро (и принудительно) завершить все внешние сеансы, подключающиеся к моей базе данных Oracle, без присмотра администратора.

Я не хочу просто блокировать базу данных и позволить пользователям корректно завершать работу.

Как бы я это написал?

Ответы [ 10 ]

44 голосов
/ 11 сентября 2008

Этот ответ находится под сильным влиянием разговора здесь: http://www.tek -tips.com / viewthread.cfm? Qid = 1395151 & page = 3

ALTER SYSTEM ENABLE RESTRICTED SESSION;

begin     
    for x in (  
            select Sid, Serial#, machine, program  
            from v$session  
            where  
                machine <> 'MyDatabaseServerName'  
        ) loop  
        execute immediate 'Alter System Kill Session '''|| x.Sid  
                     || ',' || x.Serial# || ''' IMMEDIATE';  
    end loop;  
end;

Я пропускаю сеансы уничтожения, происходящие на сервере базы данных, чтобы избежать прерывания соединений Oracle с самим собой.

11 голосов
/ 29 сентября 2010

Как SYS:

startup force;

Брутальный, но элегантный.

7 голосов
/ 14 сентября 2008

Перед тем как убить сессию, если возможно, сделайте

ALTER SYSTEM ENABLE RESTRICTED SESSION;

, чтобы остановить подключение новых сеансов.

4 голосов
/ 18 октября 2011

Некоторое время я использовал что-то подобное, чтобы убить мои сеансы на общем сервере. Первая строка 'where' может быть удалена, чтобы убить все сеансы не 'sys':

BEGIN
  FOR c IN (
      SELECT s.sid, s.serial#
      FROM v$session s
      WHERE (s.Osuser = 'MyUser' or s.MACHINE = 'MyNtDomain\MyMachineName')
      AND s.USERNAME <> 'SYS'
      AND s.STATUS <> 'KILLED'
  )
  LOOP
      EXECUTE IMMEDIATE 'alter system kill session ''' || c.sid || ',' || c.serial# || '''';
  END LOOP;
END;
2 голосов
/ 02 февраля 2012

Дополнительная информация

Важные изменения в Oracle 11g для изменения сеанса уничтожения сеанса

Автор Oracle Младен Гогала отмечает, что теперь знак @ требуется для завершить сеанс при использовании столбца inst_id:

alter system kill session '130,620,@1';

http://www.dba -oracle.com / tips_killing_oracle_sessions.htm

2 голосов
/ 24 октября 2008

Если вы хотите запретить новым пользователям подключаться, но разрешить текущим сеансам продолжаться до тех пор, пока они не будут неактивны, вы можете перевести базу данных в режим QUIESCE:

ALTER SYSTEM QUIESCE RESTRICTED;

Из Руководства администратора базы данных Oracle :

Продолжение активных сеансов без DBA пока они не станут неактивными. Активный сеанс тот, который в настоящее время внутри транзакции, запроса, выборка или инструкция PL / SQL; или сеанс, который в настоящее время проводит какие-либо общие ресурсы (например, ставит в очередь). Неактивные сеансы разрешено становиться активным ... Раз все сеансы не DBA становятся неактивными, ЗАПРЕЩАЕТСЯ СБРОС ALTER SYSTEM заявление завершается, и база данных находится в состоянии покоя

1 голос
/ 25 мая 2011

Чтобы ответить на заданный вопрос, вот самый точный SQL для выполнения работы, Вы можете комбинировать его с циклом PL / SQL, чтобы фактически выполнять операторы kill:

select ses.USERNAME,
    substr(MACHINE,1,10) as MACHINE, 
    substr(module,1,25) as module,
    status, 
    'alter system kill session '''||SID||','||ses.SERIAL#||''';' as kill
from v$session ses LEFT OUTER JOIN v$process p ON (ses.paddr=p.addr)
where schemaname <> 'SYS'
    and not exists
    (select 1 
        from DBA_ROLE_PRIVS 
        where GRANTED_ROLE='DBA' 
            and schemaname=grantee)
    and machine!='yourlocalhostname' 
order by LAST_CALL_ET desc;
1 голос
/ 12 сентября 2008

Попробуйте триггер при входе в систему

Если вы пытаетесь отключить пользователей, вы не должны позволять им подключаться.

Есть и пример такого триггера.

CREATE OR REPLACE TRIGGER rds_logon_trigger
AFTER LOGON ON DATABASE
BEGIN
  IF SYS_CONTEXT('USERENV','IP_ADDRESS') not in ('192.168.2.121','192.168.2.123','192.168.2.233') THEN
    RAISE_APPLICATION_ERROR(-20003,'You are not allowed to connect to the database');
  END IF;

  IF (to_number(to_char(sysdate,'HH24'))< 6) and (to_number(to_char(sysdate,'HH24')) >18) THEN
    RAISE_APPLICATION_ERROR(-20005,'Logon only allowed during business hours');
  END IF;

END;
0 голосов
/ 30 марта 2016

Если Oracle работает в Unix / Linux, тогда мы можем выполнить grep для всех клиентских подключений и уничтожить его

клиентский процесс grep all:

ps -ef | grep LOCAL = NO | grep -v grep | awk '{print $ 2}' | wc -l

Убить весь процесс клиента oracle:

убить -9 ps -ef | grep LOCAL=NO | grep -v grep | awk '{print $2}'

...