2008-09-10 1 views
28

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

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

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

ответ

42

Этот ответ сильно зависит от разговора здесь: 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 к себе.

+0

Я получаю ORA-06550. ALTER SYSTEM, кажется, не допускается в начале работы – 2011-09-28 07:04:36

+0

Я скорректировал код. – BIBD 2011-09-28 16:18:35

1

Try триггер на входе

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

Существует и пример такого триггера.

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

Это действительно сработает, если моя цель - ограничить доступ к определенным диапазонам IP или времени. Моя цель состояла в том, чтобы отключить всех моих пользователей в базе данных, а не для входа в систему. Спасибо, однако, я буду помнить об этом. – BIBD 2008-09-15 14:22:34

7

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

ALTER SYSTEM ENABLE RESTRICTED SESSION; 

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

+0

Да, действительно, это делает мое решение более полным. – BIBD 2008-09-15 14:23:21

2

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

ALTER SYSTEM QUIESCE RESTRICTED; 

От Oracle Database Administrator's Guide:

Активные сеансы не-DBA продолжатся , пока они не станут неактивными. Активный сеанс - это тот, который находится в настоящее время внутри транзакции, запрос, выборка или оператор PL/SQL; или сеанс , который в настоящее время содержит любые общие ресурсы ( ). Нет неактивных сеансов не позволили стать активным ... После того, как все без DBA сеансов становятся неактивными, то ALTER SYSTEM QUIESCE СЛУЖЕБНОГО оператор завершает, а база данных находится в стабилизированном состоянии

1

Я нашел ниже фрагмент полезен. Взято из: 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>' 
; 

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

11

Как SYS:

startup force; 

Brutal, но элегантный.

1

Чтобы ответить на поставленный вопрос, здесь является наиболее точным 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; 
4

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

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

Важных изменения 11g Oracle изменить сессии убить сессию

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

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

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

0

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

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

пс -ef | grep LOCAL = NO | grep -v grep | awk '{print $ 2}' | туалет -l

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

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