ORA-00021 session attached to some other process λ?
ORA-00021 μλ¬λ Oracle λ°μ΄ν°λ² μ΄μ€μμ νΉμ μΈμ μ΄ μ΄λ―Έ λ€λ₯Έ νλ‘μΈμ€μ μ°κ²°(attach)λμ΄ μμ λ λ°μνλ μλ¬μ λλ€. μ£Όλ‘ MTS(Multi-Threaded Server, νμ¬λ Shared ServerλΌκ³ λ λΆλ¦Ό) νκ²½μ΄λ Oracle Connection Manager, λλ νΉμν μΈμ μ ν μμ μ€μ νλμ μΈμ μ λ κ°μ νλ‘μΈμ€κ° λμμ μ¬μ©νλ € ν λ λνλ©λλ€. μ€λ¬΄μμλ μλͺ»λ μΈμ κ΄λ¦¬, λΉμ μμ μΈ νλ‘μΈμ€ μ’ λ£ ν μΈμ μ΄ μ 리λμ§ μμ μν©, λλ Oracle λ΄λΆμ μΈ μΈμ -νλ‘μΈμ€ λ§€ν λΆμΌμΉκ° μμΈμ΄ λλ κ²½μ°κ° λ§μ΅λλ€.
μ£Όμ λ°μ μμΈ
1. Shared Server(MTS) νκ²½μμμ μΈμ -νλ‘μΈμ€ μΆ©λ
Oracle Shared Server ꡬμ±μμλ μ¬λ¬ ν΄λΌμ΄μΈνΈ μΈμ μ΄ μμμ μλ² νλ‘μΈμ€λ₯Ό 곡μ ν©λλ€. λμ€ν¨μ²(Dispatcher)κ° μΈμ μ νΉμ 곡μ μλ² νλ‘μΈμ€μ ν λΉνλ κ³Όμ μμ μ΄μ μμ μ΄ μμ ν μ’ λ£λμ§ μμ μ± λ€λ₯Έ νλ‘μΈμ€κ° λμΌ μΈμ μ μ κ·Όμ μλνλ©΄ ORA-00021μ΄ λ°μν©λλ€. νΉν λ€νΈμν¬ λΆμμ μ΄λ ν΄λΌμ΄μΈνΈ λΉμ μ μ’ λ£ μ΄ν μΈμ μνκ° μ λ§€νκ² λ¨μ μμ λ μ΄ λ¬Έμ κ° λΉλ²νκ² λνλ©λλ€.
2. λΉμ μμ μΈ νλ‘μΈμ€ μ’ λ£ μ΄ν μΈμ μμ‘΄
OS λ 벨μμ μλ² νλ‘μΈμ€(μ: oracle νλ‘μΈμ€)κ° κ°μ λ‘ killλκ±°λ λΉμ μ μ’
λ£λ κ²½μ°, ν΄λΉ νλ‘μΈμ€μ μ°κ²°λμ΄ μλ μΈμ
μ λ³΄κ° Oracle SGA(System Global Area) λ΄μ μ¬μ ν "attached" μνλ‘ λ¨μ μμ μ μμ΅λλ€. μ΄ μνμμ μλ‘μ΄ νλ‘μΈμ€κ° λμΌ μΈμ
μ¬λ‘―μ μ¬μ¬μ©νλ € νκ±°λ, DBAκ° ν΄λΉ μΈμ
μ μ 리νλ € ν λ ORA-00021μ΄ λ°μν©λλ€. V$SESSIONκ³Ό V$PROCESSμ λ§€νμ΄ λΆμΌμΉνλ μν©μ΄ λνμ μΈ μ§νμ
λλ€.
3. μλͺ»λ DBMS_SESSION λλ μΈμ
μ ν λ‘μ§ μ¬μ©
DBMS_SESSION.ATTACH λλ Oracle Advanced Queuing, XA νΈλμμ
λ±μμ μΈμ
μ λͺ
μμ μΌλ‘ detach/attach νλ λ‘μ§μ μ€λ₯κ° μμ κ²½μ° λ°μν©λλ€. μλ₯Ό λ€μ΄, XA νΈλμμ
μ²λ¦¬ μ€ κΈλ‘λ² νΈλμμ
λΈλμΉκ° μ΄λ―Έ λ€λ₯Έ νλ‘μΈμ€μμ μ²λ¦¬ μ€μΈλ° μΆκ° μμ²μ΄ λ€μ΄μ€λ©΄ μΈμ
μΆ©λμ΄ μκΉλλ€. μ ν리μΌμ΄μ
μ½λμμ 컀λ₯μ
ν κ΄λ¦¬ λ‘μ§μ΄ μλͺ» ꡬνλμ΄ μμ λλ λμΌν λ¬Έμ κ° λ°μν μ μμ΅λλ€.
ν΄κ²° λ°©λ²
μμΈ 1: Shared Server νκ²½μμμ μΆ©λ ν΄κ²°
λ¨Όμ νμ¬ μΈμ
κ³Ό νλ‘μΈμ€ μνλ₯Ό μ‘°ννμ¬ λ¬Έμ κ° λλ μΈμ
μ μλ³ν©λλ€.
-- μΈμ
κ³Ό νλ‘μΈμ€ λ§€ν νν© μ‘°ν
SELECT s.sid,
s.serial#,
s.username,
s.status,
s.server,
s.program,
s.machine,
p.spid AS os_pid,
s.logon_time,
s.last_call_et AS idle_seconds
FROM v$session s
LEFT JOIN v$process p ON s.paddr = p.addr
WHERE s.type = 'USER'
ORDER BY s.last_call_et DESC;
-- Shared Server νκ²½μμ λμ€ν¨μ² μν νμΈ
SELECT name,
status,
messages,
bytes,
breaks,
accept
FROM v$dispatcher;
-- λ¬Έμ κ° λλ μΈμ
κ°μ μ’
λ£ (DBA κΆν νμ)
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
-- μμ: SID=125, SERIAL#=3467μΈ μΈμ
μ’
λ£
ALTER SYSTEM KILL SESSION '125,3467' IMMEDIATE;
μΈμ κ°μ μ’ λ£ νμλ STATUSκ° 'KILLED'λ‘ λ¨μμλ€λ©΄ OS λ 벨μμ μΆκ° μ‘°μΉκ° νμν©λλ€.
μμΈ 2: λΉμ μ μ’ λ£λ νλ‘μΈμ€ μ΄ν μμ‘΄ μΈμ μ 리
-- STATUSκ° KILLEDμ΄κ±°λ μ€λ«λμ INACTIVE μνμΈ μΈμ
μ‘°ν
SELECT s.sid,
s.serial#,
s.username,
s.status,
s.osuser,
s.machine,
p.spid AS os_process_id,
s.last_call_et AS idle_time_sec
FROM v$session s
LEFT JOIN v$process p ON s.paddr = p.addr
WHERE s.status IN ('KILLED', 'INACTIVE')
AND s.username IS NOT NULL
AND s.last_call_et > 3600 -- 1μκ° μ΄μ μ ν΄ μν
ORDER BY s.last_call_et DESC;
-- PADDRμ΄ μμ§λ§ μ€μ OS νλ‘μΈμ€κ° μλ κ³ μ μΈμ
μλ³
-- (μ΄ μΏΌλ¦¬λ paddrμ΄ v$processμ μλ μΈμ
μ μ°Ύμ)
SELECT s.sid,
s.serial#,
s.username,
s.status,
s.paddr
FROM v$session s
WHERE s.paddr NOT IN (SELECT addr FROM v$process)
AND s.username IS NOT NULL;
-- OS λ 벨μμ νλ‘μΈμ€ νμΈ ν μ 리 (Linux/Unix κΈ°μ€)
-- SQL*Plusμμ spidλ₯Ό νμΈ ν OSμμ μ§μ kill
-- 1λ¨κ³: Oracleμμ μΈμ
μ’
λ£ μλ
ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' POST_TRANSACTION;
-- 2λ¨κ³: μ λͺ
λ Ήμ΄ ν¨κ³Ό μμΌλ©΄ IMMEDIATE μ΅μ
μ¬μ©
ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' IMMEDIATE;
OS λ 벨μμ μ§μ νλ‘μΈμ€λ₯Ό νμΈνκ³ μ’
λ£ν λλ μλ μ μ°¨λ₯Ό λ°λ¦
λλ€.
-- spid νμΈ
SELECT p.spid, s.sid, s.serial#, s.username
FROM v$process p
JOIN v$session s ON p.addr = s.paddr
WHERE s.sid = &target_sid;
μ μΏΌλ¦¬λ‘ μ»μ spid κ°μ OSμμ kill -9 <spid> λͺ
λ ΉμΌλ‘ μ κ±°ν ν, SMON λ°±κ·ΈλΌμ΄λ νλ‘μΈμ€κ° μλμΌλ‘ μμ¬ μΈμ
μ μ 리ν λκΉμ§ λκΈ°ν©λλ€.
μμΈ 3: XA νΈλμμ λλ μΈμ μ ν λ‘μ§ λ¬Έμ
-- νμ¬ μ§ν μ€μΈ XA/λΆμ° νΈλμμ
νμΈ
SELECT local_tran_id,
global_tran_id,
state,
mixed,
advice,
tran_comment
FROM dba_2pc_pending;
-- μ€λλ μΈ-λλΈνΈ(in-doubt) νΈλμμ
κ°μ μ»€λ° λλ λ‘€λ°±
-- μ£Όμ: λ°λμ μ ν리μΌμ΄μ
νκ³Ό νμ ν μ€νν κ²
-- κ°μ 컀λ°
COMMIT FORCE 'local_tran_id';
-- κ°μ λ‘€λ°±
ROLLBACK FORCE 'local_tran_id';
-- μμ
ROLLBACK FORCE '1.23.456';
-- μΈμ
μ ν κ΄λ ¨ DBMS_SESSION μ¬μ© μμ (μ¬λ°λ₯Έ ν¨ν΄)
-- Attach μ λ°λμ νμ¬ μΈμ
μν νμΈ
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_count
FROM v$session
WHERE audsid = SYS_CONTEXT('USERENV','SESSIONID')
AND status = 'ACTIVE';
IF v_count > 0 THEN
-- μμ νκ² μΈμ
μμ
μν
DBMS_OUTPUT.PUT_LINE('μΈμ
μ μ μν νμΈλ¨');
ELSE
DBMS_OUTPUT.PUT_LINE('μΈμ
μν μ΄μ - κ΄λ¦¬μ νμΈ νμ');
END IF;
END;
/
μλ°© λ°©λ²
1. μΈμ νμμμ λ° μ ν΄ μΈμ μλ μ 리 μ μ± μ립
Oracle Profileμ νμ©νμ¬ μ ν΄ μΈμ
μ΄ μΌμ μκ° μ΄μ μ§μλ κ²½μ° μλμΌλ‘ μ’
λ£λλλ‘ μ€μ ν©λλ€. μ΄λ₯Ό ν΅ν΄ λΉμ μ μ’
λ£λ ν΄λΌμ΄μΈνΈλ‘ μΈν μ’λΉ μΈμ
μ΄ μμ€ν
μ λμ λλ κ²μ λ°©μ§ν μ μμ΅λλ€.
-- μ ν΄ μΈμ
μλ μ’
λ£ Profile μμ±
CREATE PROFILE limited_session_profile LIMIT
IDLE_TIME 30 -- 30λΆ μ ν΄ μ μΈμ
μ’
λ£
CONNECT_TIME 480 -- μ΅λ 8μκ° μ°κ²° μ μ§
SESSIONS_PER_USER 10 -- μ¬μ©μλΉ μ΅λ 10κ° μΈμ
FAILED_LOGIN_ATTEMPTS 5;
-- ν΄λΉ Profileμ μ¬μ©μμκ² μ μ©
ALTER USER app_user PROFILE limited_session_profile;
-- νμ¬ Profile μ€μ νμΈ
SELECT username, profile
FROM dba_users
WHERE username = 'APP_USER';
-- Profile μμΈ μ€μ νμΈ
SELECT resource_name, limit
FROM dba_profiles
WHERE profile = 'LIMITED_SESSION_PROFILE'
AND resource_type = 'KERNEL';
2. μ κΈ°μ μΈ μΈμ λ° νλ‘μΈμ€ λͺ¨λν°λ§ μλν
Shared Server νκ²½μ΄λ 컀λ₯μ
νμ μ¬μ©νλ νκ²½μμλ μ£ΌκΈ°μ μΌλ‘ μΈμ
κ³Ό νλ‘μΈμ€ λ§€ν μνλ₯Ό μ κ²νλ λͺ¨λν°λ§ μ€ν¬λ¦½νΈλ₯Ό μ€μΌμ€λ§νμ¬ μ€νν©λλ€. μ΄μ μ§νλ₯Ό μ‘°κΈ°μ λ°κ²¬νλ©΄ ORA-00021κ³Ό κ°μ μλ¬κ° μλΉμ€ μ₯μ λ‘ μ΄μ΄μ§κΈ° μ μ μ μ μ μΌλ‘ λμν μ μμ΅λλ€.
-- λͺ¨λν°λ§μ© λ·° μμ± (DBAκ° μ£ΌκΈ°μ μΌλ‘ μ‘°ν)
CREATE OR REPLACE VIEW v_session_health AS
SELECT s.sid,
s.serial#,
s.username,
s.status,
s.server,
s.machine,
s.program,
p.spid AS os_pid,
s.last_call_et AS idle_sec,
s.logon_time,
CASE
WHEN p.spid IS NULL AND s.paddr != '00' THEN 'ORPHAN_SESSION'
WHEN s.status = 'KILLED' THEN 'KILLED_SESSION'
WHEN s.last_call_et > 7200 THEN 'LONG_IDLE'
ELSE 'NORMAL'
END AS health_status
FROM v$session s
LEFT JOIN v$process p ON s.paddr = p.addr
WHERE s.type = 'USER';
-- λΉμ μ μΈμ
λ§ νν°λ§νμ¬ μ‘°ν
SELECT * FROM v_session_health
WHERE health_status != 'NORMAL'
ORDER BY idle_sec DESC;
κ΄λ ¨ μλ¬
| μλ¬ μ½λ | μ€λͺ |
|---|---|
| ORA-00020 |
maximum number of processes exceeded - μ΅λ νλ‘μΈμ€ μ μ΄κ³Ό. ORA-00021κ³Ό λ§μ°¬κ°μ§λ‘ νλ‘μΈμ€/μΈμ
κ΄λ¦¬ λ¬Έμ μμ ν¨κ» λ°μνλ κ²½μ°κ° λ§μ |
| ORA-00031 |
session marked for kill - μΈμ
μ΄ μ’
λ£ λμμΌλ‘ νμλμμΌλ μμ§ μμ ν μ’
λ£λμ§ μμ μν. ORA-00021 ν΄κ²° μλ μ€ λνλ μ μμ |
| ORA-03113 |
end-of-file on communication channel - μλ² νλ‘μΈμ€κ° μκΈ°μΉ μκ² μ’
λ£λ λ λ°μ. λΉμ μ νλ‘μΈμ€ μ’
λ£λ‘ μΈν ORA-00021μ μ ν μλ¬κ° λκΈ°λ ν¨ |
| ORA-03114 |
not connected to ORACLE - μ°κ²°μ΄ λμ΄μ§ μνμμ μμ
μλ μ λ°μ. μΈμ
-νλ‘μΈμ€ μ°κ²° μ΄μκ³Ό κ΄λ ¨λ¨ |
| ORA-12537 |
TNS: connection closed - λ€νΈμν¬ λ 벨μμ μ°κ²°μ΄ λ«ν κ²½μ°λ‘, Shared Server νκ²½μμ ORA-00021κ³Ό μ°κ³λμ΄ λνλ μ μμ |
μ€λ¬΄ ν: ORA-00021μ΄ λ°λ³΅μ μΌλ‘ λ°μνλ€λ©΄ λ¨μν μΈμ μ’ λ£λ‘ ν΄κ²°νλ € νμ§ λ§κ³ ,
alert.logμtraceνμΌμ ν¨κ» λΆμνμ¬ κ·Όλ³Έ μμΈμ νμ νλ κ²μ΄ μ€μν©λλ€.$ORACLE_BASE/diag/rdbms/<db_name>/<instance_name>/trace/κ²½λ‘μμ κ΄λ ¨ νΈλ μ΄μ€ νμΌμ νμΈνμΈμ.











