29

管理者の監督なしで、Oracle データベースに接続しているすべての外部セッションを迅速に (そして強制的に) 強制終了する必要があります。

データベースをロックして、ユーザーが正常に終了できるようにしたくありません。

これをどのようにスクリプト化しますか?

4

10 に答える 10

44

この回答は、次の会話の影響を大きく受けています: 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 からそれ自体への接続を強制終了しないように、データベース サーバーで開始されたセッションの強制終了をスキップします。

于 2008-09-10T21:27:44.500 に答える
11

SYS として:

startup force;

野蛮でありながらエレガント。

于 2010-09-29T19:45:24.943 に答える
7

セッションを強制終了する前に、可能であれば

ALTER SYSTEM ENABLE RESTRICTED SESSION;

新しいセッションの接続を停止します。

于 2008-09-13T20:00:36.743 に答える
5

私は共有サーバー上のセッションを強制終了するために、このようなものをしばらく使用しています。'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;
于 2011-10-18T10:55:32.377 に答える
2

新しいユーザーの接続を停止するが、非アクティブになるまで現在のセッションを続行できるようにする場合は、データベースを QUIESCE モードにすることができます。

ALTER SYSTEM QUIESCE RESTRICTED;

Oracle Database管理者ガイド』から:

DBA 以外のアクティブなセッションは、非アクティブになるまで続行されます。アクティブなセッションとは、現在トランザクション、クエリ、フェッチ、または PL/SQL ステートメント内にあるセッションです。または、現在共有リソースを保持しているセッション (エンキューなど)。非アクティブなセッションをアクティブにすることはできません...すべての非 DBA セッションが非アクティブになると、ALTER SYSTEM QUIESCE RESTRICTED ステートメントが完了し、データベースは静止状態になります

于 2008-10-24T16:10:07.413 に答える
2

追加情報

セッション キル セッションを変更するための Oracle 11g の重要な変更

Oracle の著者である Mladen Gogala は、inst_id 列を使用する場合、セッションを強制終了するには @ 記号が必要になったと述べています。

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

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

于 2012-02-02T18:14:21.713 に答える
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>'
;

個々のセッションを強制終了します。

于 2009-06-02T14:05:04.610 に答える
1

ログオン時にトリガーを試す

ユーザーの切断を試みるのではなく、ユーザーに接続を許可しないでください。

そのようなトリガーの例があります。

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;
于 2008-09-12T17:34:05.543 に答える
1

尋ねられた質問に答えるために、ジョブを達成するための最も正確な 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;
于 2011-05-25T09:57:44.677 に答える