ORA-00057λ?
ORA-00057μ Oracle λ°μ΄ν°λ² μ΄μ€μμ μμ ν μ΄λΈ(Temporary Table)μ λν μ κΈ(Lock) μκ° μμ€ν μμ νμ©νλ μ΅λ μκ³μΉλ₯Ό μ΄κ³Όνμ λ λ°μνλ μλ¬μ λλ€. μ΄ μλ¬λ μ£Όλ‘ λ€μμ μΈμ μ΄ λμμ μ μ μμ ν μ΄λΈ(Global Temporary Table, GTT)μ μ§μ€μ μΌλ‘ μ¬μ©νκ±°λ, λ¨μΌ μΈμ μ΄ κ³Όλνκ² λ§μ μμ ν μ΄λΈ μ κΈμ 보μ νκ³ μμ λ λνλ©λλ€. μ΄μ νκ²½μμ κ°μμ€λ½κ² λ°μνλ©΄ νΈλμμ μ²λ¦¬κ° μ€λ¨λκ³ μ ν리μΌμ΄μ μ₯μ λ‘ μ΄μ΄μ§ μ μμΌλ―λ‘ μ μν μμΈ νμ κ³Ό λμμ΄ νμμ μ λλ€.
μ£Όμ λ°μ μμΈ
1. κ³Όλν λμ μΈμ μ μ μ μμ ν μ΄λΈ μ¬μ©
Oracleμ μ μ μμ ν μ΄λΈ(GTT)μ μΈμ νΉμ νΈλμμ λ¨μλ‘ λ°μ΄ν°λ₯Ό 격리νμ¬ μ μ₯νλ ꡬ쑰μ λλ€. μλ°± κ° μ΄μμ μΈμ μ΄ λμμ λμΌν GTTμ μ κ·Όνκ±°λ, κ° μΈμ μ΄ μ¬λ¬ GTTλ₯Ό λμμ μ¬μ©ν κ²½μ° λ΄λΆμ μΌλ‘ κ΄λ¦¬λλ μμ ν μ΄λΈ μ κΈ μΉ΄μ΄ν°κ° νκ³μ λλ¬νμ¬ ORA-00057μ΄ λ°μν©λλ€. νΉν 컀λ₯μ ν(Connection Pool) νκ²½μμ μΈμ μκ° κΈμ¦νλ λ°°μΉ μ²λ¦¬ μκ°λλ νΈλν½ νΌν¬ νμμ μ§μ€μ μΌλ‘ λνλλ ν¨ν΄μ 보μ λλ€.
2. νΈλμμ λ―Έμ’ λ£λ‘ μΈν μ κΈ λμ
μ ν리μΌμ΄μ μ½λμμ COMMIT λλ ROLLBACK μμ΄ νΈλμμ μ΄ μ₯μκ° μ΄λ¦° μνλ‘ μ μ§λλ©΄, ν΄λΉ μΈμ μ΄ λ³΄μ ν μμ ν μ΄λΈ μ κΈμ΄ ν΄μ λμ§ μκ³ κ³μ λμ λ©λλ€. νΉν μμΈ μ²λ¦¬ λ‘μ§μ΄ λ―Έν‘ν μ ν리μΌμ΄μ μμ μ€λ₯ λ°μ ν μΈμ μ΄ μ’λΉ μν(zombie session)λ‘ λ¨μμλ κ²½μ°, μ κΈμ΄ 무νμ μ μ§λμ΄ μ 체 μμ€ν μ μμ ν μ΄λΈ μ κΈ κ°μ© μλ₯Ό λͺ¨λ μμ§μν€λ μμΈμ΄ λ©λλ€.
3. μλͺ»λ GTT μ€κ³ λ° λ¨μ©
νλμ μ 무 λ‘μ§ μμμ νμ μ΄μμΌλ‘ λ§μ μ μ μμ ν μ΄λΈμ μμ±νκ±°λ, μꡬ ν μ΄λΈ(Permanent Table)λ‘ μ²λ¦¬ν΄μΌ ν λμ©λ λ°μ΄ν°λ₯Ό 무λΆλ³νκ² GTTμ μ μ¬νλ μ€κ³ λ¬Έμ λ μ£Όμ μμΈμ λλ€. GTTλ νΈλ¦¬νμ§λ§ μ κΈ μμμ μλΉνλ κ°μ²΄μ΄λ―λ‘, μ€κ³ λ¨κ³μμ μ¬μ© μμ μ©λλ₯Ό λͺ νν μ ννμ§ μμΌλ©΄ μ΄μ μ€ μκΈ°μΉ μκ² ORA-00057 μλ¬λ₯Ό μ λ°ν μ μμ΅λλ€.
ν΄κ²° λ°©λ²
μμΈ 1 ν΄κ²° - νμ¬ μμ ν μ΄λΈ μ κΈ νν© νμ λ° μΈμ μ 리
λ¨Όμ νμ¬ μ΄λ€ μΈμ
μ΄ μΌλ§λ λ§μ μμ ν
μ΄λΈ μ κΈμ 보μ νκ³ μλμ§ νμΈν©λλ€.
-- νμ¬ μμ ν
μ΄λΈ μ κΈμ 보μ ν μΈμ
μ‘°ν
SELECT
s.sid,
s.serial#,
s.username,
s.status,
s.machine,
s.program,
s.logon_time,
COUNT(l.id1) AS temp_lock_count
FROM
v$session s
JOIN v$lock l ON s.sid = l.sid
WHERE
l.type = 'TT' -- TT: Temporary Table Lock
GROUP BY
s.sid, s.serial#, s.username, s.status,
s.machine, s.program, s.logon_time
ORDER BY
temp_lock_count DESC;
-- μ 체 μμ ν
μ΄λΈ μ κΈ μ νμΈ
SELECT
COUNT(*) AS total_temp_locks,
COUNT(DISTINCT sid) AS affected_sessions
FROM
v$lock
WHERE
type = 'TT';
κ³Όλν μ κΈμ 보μ ν νΉμ μΈμ
μ κ°μ μ’
λ£ν΄μΌ ν κ²½μ° μλ 쿼리λ₯Ό μ¬μ©ν©λλ€.
-- λ¬Έμ μΈμ
κ°μ μ’
λ£ (DBA κΆν νμ)
-- λ¨Όμ SIDμ SERIAL# νμΈ ν μ€ν
ALTER SYSTEM KILL SESSION '1234,5678' IMMEDIATE;
-- μ¬λ¬ μ’λΉ μΈμ
μ μΌκ΄ μ²λ¦¬νλ μ€ν¬λ¦½νΈ μμ±
SELECT
'ALTER SYSTEM KILL SESSION ''' || sid || ',' || serial# || ''' IMMEDIATE;'
AS kill_statement
FROM
v$session
WHERE
status = 'INACTIVE'
AND last_call_et > 3600 -- 1μκ° μ΄μ λΉνμ± μΈμ
AND username IS NOT NULL;
μμΈ 2 ν΄κ²° - λ―Έμ’ λ£ νΈλμμ νμ§ λ° μ 리
μ€λ«λμ μ΄λ € μλ νΈλμμ
μ μ°Ύμλ΄μ΄ μ‘°μΉν©λλ€.
-- μ₯μκ° μ΄λ¦° νΈλμμ
μ‘°ν (1μκ° μ΄μ)
SELECT
s.sid,
s.serial#,
s.username,
s.machine,
s.program,
t.start_time,
ROUND((SYSDATE - TO_DATE(t.start_time, 'MM/DD/YY HH24:MI:SS')) * 24, 2)
AS elapsed_hours,
t.used_ublk AS undo_blocks_used,
t.log_io,
t.phy_io
FROM
v$transaction t
JOIN v$session s ON t.addr = s.taddr
WHERE
(SYSDATE - TO_DATE(t.start_time, 'MM/DD/YY HH24:MI:SS')) * 24 > 1
ORDER BY
elapsed_hours DESC;
-- GTT μ¬μ© νν©κ³Ό νΈλμμ
μνλ₯Ό ν¨κ» μ‘°ν
SELECT
s.sid,
s.serial#,
s.username,
s.status,
NVL(t.start_time, 'NO ACTIVE TXN') AS txn_start_time,
l.type AS lock_type,
COUNT(l.id1) OVER (PARTITION BY s.sid) AS lock_count
FROM
v$session s
LEFT JOIN v$transaction t ON s.taddr = t.addr
LEFT JOIN v$lock l ON s.sid = l.sid AND l.type = 'TT'
WHERE
l.type IS NOT NULL
ORDER BY
s.sid;
μμΈ 3 ν΄κ²° - GTT μ¬μ© νν© κ°μ¬ λ° μ¬μ€κ³
νμ¬ λ°μ΄ν°λ² μ΄μ€μ μ‘΄μ¬νλ GTT μ 체 λͺ©λ‘κ³Ό μ¬μ© λΉλλ₯Ό νμΈν©λλ€.
-- νμ¬ μ€ν€λ§μ μ μ μμ ν
μ΄λΈ λͺ©λ‘ μ‘°ν
SELECT
owner,
table_name,
duration,
num_rows,
last_analyzed
FROM
dba_tables
WHERE
temporary = 'Y'
ORDER BY
owner, table_name;
-- GTTλ₯Ό νμ¬ μ¬μ© μ€μΈ μΈμ
νμΈ
SELECT
s.sid,
s.username,
s.status,
o.object_name AS temp_table_name,
o.object_type
FROM
v$session s
JOIN v$open_cursor oc ON s.sid = oc.sid
JOIN dba_objects o ON UPPER(oc.sql_text) LIKE '%' || o.object_name || '%'
WHERE
o.temporary = 'Y'
AND o.object_type = 'TABLE';
-- λΆνμν GTTκ° μλ€λ©΄ μμ μ λ°μ΄ν° μ 리 ν DROP
-- STEP 1: μΈμ
λ°μ΄ν° νμΈ
SELECT COUNT(*) FROM my_temp_table; -- ν΄λΉ μΈμ
λ°μ΄ν° νμΈ
-- STEP 2: GTT μμ
DROP TABLE my_unnecessary_temp_table;
-- STEP 3: νμνλ€λ©΄ λ ν¨μ¨μ μΈ κ΅¬μ‘°λ‘ μ¬μμ±
CREATE GLOBAL TEMPORARY TABLE new_temp_table (
id NUMBER,
data VARCHAR2(200),
created_dt DATE DEFAULT SYSDATE
)
ON COMMIT DELETE ROWS; -- νΈλμμ
μ’
λ£ μ μλ λ°μ΄ν° μμ (μ κΈ ν΄μ μ λ)
μλ°© λ°©λ²
1. μΈμ λ° μ κΈ λͺ¨λν°λ§ μλν
μ΄μ νκ²½μμ μ£ΌκΈ°μ μΌλ‘ μμ ν
μ΄λΈ μ κΈ μλ₯Ό λͺ¨λν°λ§νλ μλν μ€ν¬λ¦½νΈλ Oracle Enterprise Manager(OEM) μλ¦Όμ ꡬμ±νμ¬ μκ³μΉ λλ¬ μ μ μ μ λμν μ μλ 체κ³λ₯Ό κ°μΆμ΄μΌ ν©λλ€. μλμ κ°μ λͺ¨λν°λ§ 쿼리λ₯Ό 5~10λΆ μ£ΌκΈ°λ‘ μ€μΌμ€λ§νμ¬ μΌμ μμΉ μ΄μμ΄λ©΄ DBAμκ² μλμ λ°μ‘νλλ‘ κ΅¬μ±νλ κ²μ΄ μ€λ¬΄μμ ν¨κ³Όμ μ
λλ€.
-- λͺ¨λν°λ§μ© μκ³μΉ νμΈ μΏΌλ¦¬ (μμ ν
μ΄λΈ μ κΈμ΄ 100 μ΄μμ΄λ©΄ κ²½κ³ )
SELECT
CASE
WHEN COUNT(*) >= 100 THEN 'WARNING: Temp Lock μ μκ³μΉ μ΄κ³Ό - ' || COUNT(*) || 'κ°'
WHEN COUNT(*) >= 50 THEN 'CAUTION: Temp Lock μ μ£Όμ μμ€ - ' || COUNT(*) || 'κ°'
ELSE 'NORMAL: Temp Lock μ μ μ - ' || COUNT(*) || 'κ°'
END AS lock_status,
COUNT(*) AS current_temp_locks
FROM
v$lock
WHERE
type = 'TT';
2. μ ν리μΌμ΄μ λ 벨μ νΈλμμ κ΄λ¦¬ κ°ν
GTTλ₯Ό μ¬μ©νλ λͺ¨λ μ ν리μΌμ΄μ
μ½λμμ λ°λμ μμΈ μ²λ¦¬ λΈλ‘ μμ COMMIT λλ ROLLBACKμ λͺ
μμ μΌλ‘ νΈμΆνλλ‘ μ½λ© νμ€μ μ립νκ³ μ½λ 리뷰 νλ‘μΈμ€λ₯Ό ν΅ν΄ κ΄λ¦¬ν΄μΌ ν©λλ€. νΉν 컀λ₯μ
ν νκ²½μμλ 컀λ₯μ
λ°ν μ νΈλμμ
μνλ₯Ό μ΄κΈ°ννλ λ‘μ§μ λ°λμ ν¬ν¨μμΌμΌ νλ©°, ON COMMIT DELETE ROWS μ΅μ
μ κ°μ§ GTTλ₯Ό μ°μ μ¬μ©νμ¬ νΈλμμ
μ’
λ£ μ μ κΈμ΄ μλ ν΄μ λλλ‘ μ€κ³νλ κ²μ΄ μ€μν©λλ€.
κ΄λ ¨ μλ¬
| μλ¬ μ½λ | μ€λͺ |
|---|---|
| ORA-00054 |
resource busy and acquire with NOWAIT specified - μ κΈ κ²½ν©μ΄ μ¬ν λ NOWAIT μ΅μ
μ¬μ© μ λ°μνλ©° ORA-00057κ³Ό ν¨κ» λνλ μ μμ |
| ORA-00060 |
deadlock detected while waiting for resource - μ¬λ¬ μΈμ
κ° μ κΈ μν λκΈ°λ‘ λ°μνλ κ΅μ°© μνλ‘, GTT κ³Όλ€ μ¬μ© νκ²½μμ λλ° λ°μ κ°λ₯ |
| ORA-01555 |
snapshot too old - GTT μ¬μ© μ€ UNDO κ³΅κ° λΆμ‘±μΌλ‘ λ°μνλ©° μ₯μκ° λ―Έμ’
λ£ νΈλμμ
μν©μμ ORA-00057κ³Ό ν¨κ» λνλκΈ°λ ν¨ |
| ORA-04031 |
unable to allocate shared memory - SGA λ©λͺ¨λ¦¬ λΆμ‘± μλ¬λ‘, λκ·λͺ¨ GTT μ΄μ© νκ²½μμ κ°μ μ μΌλ‘ μ°κ΄λ¨ |












