ORA-00028 your session has been killed λ?
ORA-00028 μλ¬λ νμ¬ μ¬μ© μ€μΈ Oracle μΈμ
μ΄ DBA λλ κΆν μλ μ¬μ©μμ μν΄ κ°μ λ‘ μ’
λ£λμμ λ λ°μνλ μλ¬μ
λλ€. μ¬μ©μκ° λ€μ SQL λ¬Έμ μ€ννλ €λ μκ°, Oracleμ ν΄λΉ μΈμ
μ΄ μ΄λ―Έ kill μ²λ¦¬λμμμ κ°μ§νκ³ μ΄ μλ¬λ₯Ό λ°νν©λλ€. μ£Όλ‘ μ₯μκ° μ€νλλ 쿼리, λ½(Lock) μ μ , κ³Όλν 리μμ€ μ¬μ© λ±μ μ΄μ λ‘ DBAκ° ALTER SYSTEM KILL SESSION λͺ
λ Ήμ μννμ λ μν₯λ°λ μΈμ
μΈ‘μμ κ²½ννκ² λ©λλ€.
μ£Όμ λ°μ μμΈ
1. DBAμ μν λͺ μμ μΈμ κ°μ μ’ λ£
κ°μ₯ νν μμΈμΌλ‘, DBAκ° ALTER SYSTEM KILL SESSION λλ ALTER SYSTEM DISCONNECT SESSION λͺ
λ Ήμ μ¬μ©νμ¬ νΉμ μΈμ
μ κ°μ λ‘ μ’
λ£ν κ²½μ°μ
λλ€. μ₯μκ° μ€ν μ€μΈ λ°°μΉ μΏΌλ¦¬, λΆνμν λ½ λ³΄μ μΈμ
, λλ μμ€ν
μ±λ₯μ μ
μν₯μ λ―ΈμΉλ μΈμ
μ μ κ±°νκΈ° μν΄ μ΄ μ‘°μΉκ° μ·¨ν΄μ§λ κ²μ΄ μΌλ°μ μ
λλ€. μ’
λ£ λͺ
λ Ήμ΄ λ΄λ €μ§ μ΄νμλ μΈμ
μ΄ μ¦μ μ 리λμ§ μκ³ KILLED μνλ‘ μ μ λ¨μ μλ€κ°, ν΄λΉ μΈμ
μμ λ€μ μμ²μ΄ λ€μ΄μ€λ μμ μ ORA-00028μ΄ λ°νλ©λλ€.
2. λ½(Lock) κ²½ν© λ° λ°λλ½(Deadlock)μΌλ‘ μΈν μΈμ μ’ λ£
μ¬λ¬ μΈμ μ΄ λμΌν 리μμ€λ₯Ό λμμ μ μ νλ € ν λ λ°μνλ λ½ κ²½ν©μ΄λ λ°λλ½ μν©μμ Oracle λλ DBAκ° ν΄λΉ μΈμ μ€ νλλ₯Ό κ°μ μ’ λ£νλ κ²½μ°μ λλ€. νΉν μ ν리μΌμ΄μ λ 벨μμ νΈλμμ μ μ μ ν κ΄λ¦¬νμ§ μκ³ μ»€λ°μ΄λ λ‘€λ°± μμ΄ μ₯μκ° λκΈ° μνμ λμΈ μΈμ μ DBAμ μ£Όμ μ’ λ£ λμμ΄ λ©λλ€. μ΄ κ²½μ° μ’ λ£λ μΈμ μ μ¬μ©μλ λ€μ λ°μ΄ν°λ² μ΄μ€ νΈμΆ μμ μ ORA-00028 μλ¬λ₯Ό λ§μ£Όνκ² λ©λλ€.
3. μ ν΄ μΈμ νμμμ λλ 리μμ€ νλ‘νμΌ μ ν
Oracleμ PROFILE μ€μ μμ IDLE_TIME, CONNECT_TIME λ±μ νλΌλ―Έν°κ° μ€μ λμ΄ μμ κ²½μ°, ν΄λΉ μκ°μ μ΄κ³Όν μΈμ
μ μλμΌλ‘ kill μ²λ¦¬λ μ μμ΅λλ€. λν Oracle Resource Managerλ₯Ό ν΅ν΄ νΉμ μλΉμ κ·Έλ£Ήμ CPU λλ I/O μ νμ΄ μ€μ λ κ²½μ°, μ νμ μ΄κ³Όν μΈμ
μ΄ κ°μ λ‘ μ’
λ£λ μλ μμ΅λλ€. μ΄ μμΈμ κ°λ°μ μ
μ₯μμ μμΈ‘νκΈ° μ΄λ €μ΄ κ²½μ°κ° λ§μ μ νν μμΈ νμ
μ μν΄ DBAμ νλ ₯μ΄ νμν©λλ€.
ν΄κ²° λ°©λ²
μμΈ 1: DBAμ μν λͺ μμ μΈμ κ°μ μ’ λ£
λ¨Όμ νμ¬ KILLED μνλ‘ λ¨μ μλ μΈμ
μ νμΈν©λλ€.
-- KILLED μνμ μΈμ
νμΈ
SELECT sid,
serial#,
username,
status,
osuser,
machine,
program,
sql_id,
last_call_et
FROM v$session
WHERE status = 'KILLED'
ORDER BY last_call_et DESC;
KILLED μνμ μΈμ
μ΄ μ€λ«λμ μ 리λμ§ μλλ€λ©΄ OS λ 벨μ νλ‘μΈμ€λ₯Ό νμΈνκ³ μ 리ν΄μΌ ν©λλ€.
-- μΈμ
κ³Ό μ°κ²°λ OS νλ‘μΈμ€ μ 보 μ‘°ν
SELECT s.sid,
s.serial#,
s.status,
s.username,
p.spid AS os_pid
FROM v$session s
JOIN v$process p ON s.paddr = p.addr
WHERE s.status = 'KILLED';
μ μΏΌλ¦¬λ‘ os_pidλ₯Ό νμΈν ν, Linux/Unix νκ²½μμλ λ€μκ³Ό κ°μ΄ νλ‘μΈμ€λ₯Ό μ’
λ£ν©λλ€.
-- (μ°Έκ³ μ© Shell λͺ
λ Ή - SQLμ΄ μλ OS λͺ
λ Ήμ΄)
-- kill -9 [os_pid]
-- Oracle λ 벨μμ μ¦μ μ°κ²° ν΄μ λ°©λ² (DBA κΆν νμ)
ALTER SYSTEM DISCONNECT SESSION '&sid,&serial#' IMMEDIATE;
ν΄λΌμ΄μΈνΈ μ ν리μΌμ΄μ μμλ μΈμ μ΄ killλλ©΄ λ°λμ 컀λ₯μ μ μ¬μμ±ν΄μΌ ν©λλ€. 컀λ₯μ ν νκ²½μμλ ν΄λΉ 컀λ₯μ μ νμμ μ κ±°νκ³ μλ‘μ΄ μ»€λ₯μ μΌλ‘ κ΅μ²΄νλ λ‘μ§μ΄ νμν©λλ€.
μμΈ 2: λ½ κ²½ν© λ° λ°λλ½μΌλ‘ μΈν μΈμ μ’ λ£
νμ¬ λ½μ 보μ νκ³ μλ μΈμ
κ³Ό λκΈ° μ€μΈ μΈμ
μ νμ
ν©λλ€.
-- λ½ κ²½ν© νν© μ‘°ν
SELECT l.sid,
s.serial#,
s.username,
s.status,
l.type,
l.lmode,
l.request,
o.object_name,
o.object_type
FROM v$lock l
JOIN v$session s ON l.sid = s.sid
LEFT JOIN dba_objects o ON l.id1 = o.object_id
WHERE l.request > 0
OR (l.lmode > 0 AND l.type IN ('TM', 'TX'))
ORDER BY l.sid;
λΈλ‘νΉ μΈμ
κ³Ό λκΈ° μΈμ
μ νλμ νμ
νλ €λ©΄ μλ 쿼리λ₯Ό νμ©ν©λλ€.
-- λΈλ‘νΉ μΈμ
λΆμ 쿼리
SELECT blocker.sid AS blocking_sid,
blocker.serial# AS blocking_serial,
blocker.username AS blocking_user,
blocker.status AS blocking_status,
waiter.sid AS waiting_sid,
waiter.serial# AS waiting_serial,
waiter.username AS waiting_user,
waiter.sql_id AS waiting_sql_id,
waiter.wait_class AS wait_class,
waiter.seconds_in_wait
FROM v$session blocker
JOIN v$session waiter ON blocker.sid = waiter.blocking_session
WHERE waiter.blocking_session IS NOT NULL
ORDER BY waiter.seconds_in_wait DESC;
λ½μ 보μ ν μ± μ₯μκ° λκΈ° μ€μΈ μΈμ
μ μ’
λ£ν©λλ€.
-- λ¬Έμ μΈμ
μ’
λ£ (DBA κΆν νμ)
ALTER SYSTEM KILL SESSION '&blocking_sid,&blocking_serial' IMMEDIATE;
-- νΉμ μΈμ
μμ μ€ν μ€μΈ SQL νμΈ ν μ’
λ£ κ²°μ
SELECT sql_fulltext
FROM v$sql
WHERE sql_id = '&sql_id';
μμΈ 3: μ ν΄ μΈμ νμμμ λλ 리μμ€ νλ‘νμΌ μ ν
νμ¬ μ μ©λ νλ‘νμΌ μ€μ μ νμΈν©λλ€.
-- μ¬μ©μλ³ μ μ© νλ‘νμΌ νμΈ
SELECT username,
profile
FROM dba_users
WHERE account_status = 'OPEN'
ORDER BY username;
-- νλ‘νμΌ μμΈ λ¦¬μμ€ μ ν νμΈ
SELECT profile,
resource_name,
resource_type,
limit
FROM dba_profiles
WHERE profile IN (
SELECT profile FROM dba_users WHERE username = '&target_user'
)
ORDER BY resource_type,
resource_name;
νμ μ νλ‘νμΌμ νμμμ κ°μ μ‘°μ ν©λλ€.
-- νΉμ νλ‘νμΌμ IDLE_TIME μ ν μν (λΆ λ¨μ)
ALTER PROFILE app_user_profile LIMIT
IDLE_TIME 30
CONNECT_TIME UNLIMITED;
-- DEFAULT νλ‘νμΌ νμΈ λ° μμ (μ£Όμ: λͺ¨λ μ¬μ©μμκ² μν₯)
ALTER PROFILE DEFAULT LIMIT
IDLE_TIME UNLIMITED;
-- λ³κ²½ μ¬ν μ¦μ λ°μ νμΈ
SELECT profile,
resource_name,
limit
FROM dba_profiles
WHERE profile = 'APP_USER_PROFILE'
AND resource_name IN ('IDLE_TIME', 'CONNECT_TIME');
μλ°© λ°©λ²
1. 컀λ₯μ ν λ° μ ν리μΌμ΄μ λ 벨μ μμΈ μ²λ¦¬ κ°ν
μ ν리μΌμ΄μ
μμ ORA-00028 μλ¬λ₯Ό λͺ
μμ μΌλ‘ μΊμΉνκ³ , ν΄λΉ 컀λ₯μ
μ μ¦μ νκΈ°ν λ€ μλ‘μ΄ μ»€λ₯μ
μ νλνλλ‘ μ¬μλ λ‘μ§μ ꡬνν΄μΌ ν©λλ€. 컀λ₯μ
ν(HikariCP, DBCP λ±)μ μ¬μ©νλ κ²½μ° testOnBorrow, validationQuery μ΅μ
μ μ€μ νμ¬ KILLEDλ 컀λ₯μ
μ΄ μ ν리μΌμ΄μ
μ λ°νλμ§ μλλ‘ μ€μ νκ³ , μΈμ
μ΄ killλλλΌλ μ¬μ©μ κ²½νμ μν₯μ΄ μ΅μνλλλ‘ gracefulν μλ¬ μ²λ¦¬ νλ¦μ μ€κ³ν΄μΌ ν©λλ€.
-- 컀λ₯μ
μ ν¨μ± κ²μ¦μ© 쿼리 (validationQueryλ‘ νμ©)
SELECT 1 FROM dual;
-- μΈμ
μν λͺ¨λν°λ§ μλνλ₯Ό μν λ·° μμ± μμ
CREATE OR REPLACE VIEW v_long_running_sessions AS
SELECT s.sid,
s.serial#,
s.username,
s.status,
s.last_call_et AS elapsed_seconds,
s.sql_id,
q.sql_text
FROM v$session s
LEFT JOIN v$sql q ON s.sql_id = q.sql_id
WHERE s.status = 'ACTIVE'
AND s.last_call_et > 300 -- 5λΆ μ΄μ μ€ν μ€μΈ μΈμ
AND s.username IS NOT NULL
ORDER BY s.last_call_et DESC;
2. μ κΈ°μ μΈ μΈμ λ° λ½ λͺ¨λν°λ§ μ²΄κ³ κ΅¬μΆ
μ₯κΈ° μ€ν 쿼리λ λ½ κ²½ν©μ΄ λ°μνκΈ° μ μ μ¬μ μ κ°μ§νκ³ μ‘°μΉλ₯Ό μ·¨ν μ μλ λͺ¨λν°λ§ 체κ³λ₯Ό ꡬμΆν΄μΌ ν©λλ€. Oracle Enterprise Manager(OEM) λλ 컀μ€ν
λͺ¨λν°λ§ μ€ν¬λ¦½νΈλ₯Ό ν΅ν΄ μκ³κ°(μ: μ€ν μκ° 10λΆ μ΄κ³Ό, λ½ λκΈ° 5λΆ μ΄κ³Ό)μ μ€μ νκ³ μλμ λ°μ‘νλ©΄, μΈμ
μ΄ κ°μ killλλ μν©μ μλ°©νκ±°λ λΉ λ₯΄κ² μμΈμ νμ
ν μ μμ΅λλ€. λν κ°λ°νμ SQL νλ κ°μ΄λλΌμΈμ 곡μ νκ³ μ½λ 리뷰 μ μ₯κΈ° μ€ν 쿼리λ λͺ
μμ λ½ μ¬μ©μ λν κ²ν λ₯Ό μ무ννλ κ²μ΄ μ₯κΈ°μ μΌλ‘ ν¨κ³Όμ μ
λλ€.
-- μ κΈ° λͺ¨λν°λ§ μ€ν¬λ¦½νΈ μμ: 10λΆ μ΄μ μ€ν μ€μΈ μΈμ
κ°μ§
SELECT s.sid,
s.serial#,
s.username,
s.osuser,
s.machine,
s.program,
ROUND(s.last_call_et / 60, 1) AS running_minutes,
s.sql_id,
SUBSTR(q.sql_text, 1, 100) AS sql_preview
FROM v$session s
LEFT JOIN v$sql q ON s.sql_id = q.sql_id
WHERE s.type = 'USER'
AND s.status = 'ACTIVE'
AND s.last_call_et > 600
ORDER BY s.last_call_et DESC;
κ΄λ ¨ μλ¬
-
ORA-00030:
user session ID does not existβ μ΄λ―Έ μ‘΄μ¬νμ§ μλ μΈμ IDλ₯Ό μ°Έμ‘°ν λ λ°μνλ©°, ORA-00028 μ΄ν μΈμ μ 리 κ³Όμ μμ μ°λ¬μ λνλ μ μμ΅λλ€. -
ORA-01012:
not logged onβ μΈμ μ΄ killλ μ΄ν λ‘κ·Έμμλ μνμμ μΆκ° μμ μ μλν λ λ°μνλ©°, ORA-00028κ³Ό μ μ¬ν λ§₯λ½μμ κ²½νλ©λλ€. -
ORA-03113:
end-of-file on communication channelβ λ€νΈμν¬ λ¨μ μ΄λ μλ² νλ‘μΈμ€ κ°μ μ’ λ£λ‘ μΈν΄ λ°μνλ©°, μΈμ kill μ΄ν ν΄λΌμ΄μΈνΈκ° κ°μ§νλ ν΅μ λ 벨μ μλ¬μ λλ€. -
ORA-03114:
not connected to Oracleβ μΈμ μ΄ μμ ν μ’ λ£λ μ΄ν Oracleκ³Όμ μ°κ²°μ΄ λκΈ΄ μνμμ 쿼리λ₯Ό μλν λ λ°μν©λλ€. -
ORA-00031:
session marked for killβALTER SYSTEM KILL SESSIONλͺ λ Ή μ§ν μΈμ μ΄ μ¦μ μ’ λ£λμ§ μκ³ KILLED λ§ν¬ μνλ‘ λκΈ° μ€μΌ λ λ°μνλ©°, ORA-00028μ μ λ¨κ³ μλ¬λ‘ λ³Ό μ μμ΅λλ€.












