Подтвердить что ты не робот

Как я могу убить все сеансы, подключающиеся к моей базе данных оракула?

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

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

Как бы это сделать script?

4b9b3361

Ответ 1

На этот ответ в значительной степени влияет разговор: 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 с самим собой.

Ответ 2

Как SYS:

startup force;

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

Ответ 3

Прежде чем убивать сеансы, если возможно,

ALTER SYSTEM ENABLE RESTRICTED SESSION;

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

Ответ 4

Я использую что-то вроде этого некоторое время, чтобы убить мои сеансы на общем сервере. Первая строка "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;

Ответ 5

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

ALTER SYSTEM QUIESCE RESTRICTED;

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

Активные сеансы не-DBA будут продолжены пока они не станут неактивными. Активный сеанс - это тот, который в настоящее время внутри транзакции, запроса, fetch или оператор PL/SQL; или сессии, которая в настоящее время общие ресурсы (например, ставит в очередь). Неактивные сеансы позволили стать активными... Как только все сеансы не-DBA становятся неактивными, ALTER SYSTEM QUIESCE RESTRICTED завершение инструкции, а база данных находится в состоянии покоя

Ответ 6

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

Важные изменения Oracle 11g для изменения сеанса сеанса kill

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

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

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

Ответ 7

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

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

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

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;

Ответ 8

Я нашел полезный сниппет. Взято из: http://jeromeblog-jerome.blogspot.com/2007/10/how-to-unlock-record-on-oracle.html

select
owner||'.'||object_name obj ,
oracle_username||' ('||s.status||')' oruser ,
os_user_name osuser ,
machine computer ,
l.process unix ,
s.sid||','||s.serial# ss ,
r.name rs ,
to_char(s.logon_time,'yyyy/mm/dd hh24:mi:ss') time
from v$locked_object l ,
dba_objects o ,
v$session s ,
v$transaction t ,
v$rollname r
where l.object_id = o.object_id
and s.sid=l.session_id
and s.taddr=t.addr
and t.xidusn=r.usn
order by osuser, ss, obj
;

Затем выполнил:

Alter System Kill Session '<value from ss above>'
;

Чтобы убить отдельные сеансы.

Ответ 9

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

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;

Ответ 10

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

grep весь клиентский процесс oracle:

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

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

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