오라클 데이터베이스에 연결된 모든 세션을 종료하려면 어떻게 해야 합니까?
및 관리자의 감독 없이 오라클 데이터베이스에 연결된 모든 외부 세션을 신속하고 강제로 종료해야 합니다.
데이터베이스를 잠그고 사용자가 정상적으로 종료되도록 하고 싶지 않습니다.
어떻게 대본을 작성해야 할까요?
이 대답은 여기서의 대화에 크게 영향을 받습니다. 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;
새 세션 연결을 중지합니다.
공유 서버에서 세션을 종료하기 위해 한동안 이와 같은 것을 사용했습니다.'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;
새 사용자의 연결을 중지하고 현재 세션이 비활성화될 때까지 계속되도록 하려면 데이터베이스를 STOPECE 모드로 전환할 수 있습니다.
ALTER SYSTEM QUIESCE RESTRICTED;
Oracle Database Administrator's Guide에서 다음을 확인할 수 있습니다.
비 DBA 활성 세션은 비활성화될 때까지 계속됩니다.활성 세션은 현재 트랜잭션, 쿼리, 가져오기 또는 PL/SQL 문 내부에 있거나 공유 리소스(예: 대기열)를 현재 보유하고 있는 세션입니다.비활성 세션은 활성화할 수 없습니다...모든 비 DBA 세션이 비활성화되면 ALTER SYSTEM STUEPCE RESTRICTED 문이 완료되고 데이터베이스가 중지 상태가 됩니다.
추가 정보
세션 종료 세션을 변경하기 위한 Oracle 11g의 중요한 변경 사항
Oracle 작성자인 Mladen 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은 다음과 같습니다. 이 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;
Oracle이 Unix/Linux에서 실행 중인 경우 모든 클라이언트 연결을 grep하여 제거할 수 있습니다.
grep all 오라클 클라이언트 프로세스:
ps -ef | grep LOCAL=NO | grep -vgrep | awk '{print $2}' | wc -l
모든 오라클 클라이언트 프로세스 종료:
-9 킬 -9ps -ef | grep LOCAL=NO | grep -v grep | awk '{print $2}'
언급URL : https://stackoverflow.com/questions/55342/how-can-i-kill-all-sessions-connecting-to-my-oracle-database
'programing' 카테고리의 다른 글
HeidiSql의 트리거에서 정보가 삽입되지 않는 이유는 무엇입니까? (0) | 2023.06.07 |
---|---|
정의/정의되지 않은 값을 기준으로 #ifdef 블록을 제거하는 C 프리프로세서가 있습니까? (0) | 2023.06.07 |
Angular에서 백분율로 스타일을 적용하는 방법은 무엇입니까? (0) | 2023.06.07 |
ADB Android 장치 승인되지 않음 (0) | 2023.06.07 |
매트플롯립에게 플롯이 끝났다는 것을 어떻게 알립니까? (0) | 2023.06.07 |