我需要快速(强制)杀死了所有外部的会议连接到我的oracle数据库没有监督和管理员。

我不想只是锁定的数据库,并让用户退出正常。

我怎么会这个脚本?

有帮助吗?

解决方案

这答案是严重影响,通过对话在这里: 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连接的本身。

其他提示

作为SYS:

startup force;

残酷的,而优雅。

杀害前的会议,如果可能的话做

ALTER SYSTEM ENABLE RESTRICTED SESSION;

停止新的会议连接。

我一直采用这样的事情一段时间来杀了我的会议上共用服务器。第一行的"哪里",可以删除,杀死所有非'系'会议:

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;

如果你想要停止新的用户连接,但允许当前的届会继续,直到他们都是无效的,你可以把该数据库在静止模式:

ALTER SYSTEM QUIESCE RESTRICTED;

Oracle数据库管理员的指南:

非DBA活动的届会将会继续 直到他们变得不活跃的。一个活跃 会议是一个是目前 内部事务的查询, 获取,或PL/SQL statement;或 会议的目前持有任何 共同资源(例如, 入队).没有不活跃的会议 允许成为活跃的...一旦所有 非DBA会议变得不活跃, 改变系统停止限制 声明完成,并且该数据库 是在一个静止状态

额外的信息

重要的Oracle11g变化改变届会杀届会议

Oracle作者姆拉登*Gogala注意到,@的迹象是,现在需要 杀死一届会议时使用的inst_id柱:

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

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

试图扳机上登录

而不是试图断用户,你不应该允许它们进行连接。

还有和这样的触发器。

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;

我发现了以下的片段很有帮助。采取自: 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>'
;

杀了单独的会议。

要回答这个问题问道, 这里是最准确的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;

如果Oracle运行在Unix/Linux然后我们可以查询所有客户的连接,并杀了它

查询所有的oracle客户的过程:

ps-ef|查询地方=不|查询-v查询|awk'{print$2}'|wc-l

杀死所有的oracle客户的过程:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top