ORA-00054 resource busy and acquire with NOWAIT specified λ?
ORA-00054 μλ¬λ νΉμ ν
μ΄λΈμ΄λ 리μμ€μ λν΄ μ κΈ(Lock)μ νλνλ € ν λ, ν΄λΉ 리μμ€κ° μ΄λ―Έ λ€λ₯Έ μΈμ
μ μν΄ μ μ λ μνμμ NOWAIT μ΅μ
μ΄ μ§μ λ κ²½μ° μ¦μ λ°μνλ μλ¬μ
λλ€. μΌλ°μ μΌλ‘ ALTER TABLE, DROP TABLE, TRUNCATE, LOCK TABLE ... NOWAIT, λλ DDL μμ
μν μ λ€λ₯Έ νΈλμμ
μ΄ ν΄λΉ κ°μ²΄λ₯Ό μ¬μ© μ€μ΄λΌλ©΄ Oracleμ λκΈ°νμ§ μκ³ κ³§λ°λ‘ μ΄ μλ¬λ₯Ό λ°νν©λλ€. μ€λ¬΄μμλ λ°°μΉ μμ
μ΄λ ν
μ΄λΈ ꡬ쑰 λ³κ²½ μμ
μ€ νμ± μΈμ
μ΄ ν΄λΉ ν
μ΄λΈμ DMLμ μν μ€μΌ λ λΉλ²νκ² λ°μνλ―λ‘, μ΄μ νκ²½μμ νΉν μ£Όμκ° νμν©λλ€.
μ£Όμ λ°μ μμΈ
1. DDL μμ μ€ νμ± DML νΈλμμ μΆ©λ
ALTER TABLE, TRUNCATE TABLE, DROP TABLE λ± DDL λ¬Έμ λ΄λΆμ μΌλ‘ ν΄λΉ ν
μ΄λΈμ λν λ°°νμ μ κΈ(Exclusive Lock)μ μꡬν©λλ€. λ€λ₯Έ μΈμ
μ΄ ν΄λΉ ν
μ΄λΈμ INSERT, UPDATE, DELETE λ±μ DML μμ
μ μννκ³ μμ§ μ»€λ° λλ λ‘€λ°±νμ§ μμ μνλΌλ©΄, DDL μμ
μ μ κΈμ νλνμ§ λͺ»νκ³ ORA-00054λ₯Ό λ°νν©λλ€. νΉν μ₯μκ° μνλλ λ°°μΉ νλ‘κ·Έλ¨μ΄ ν
μ΄λΈμ μ μ νκ³ μμ λ μ΄μμκ° κΈ΄κΈ DDL μμ
μ μλνλ μν©μμ μμ£Ό λͺ©κ²©λ©λλ€.
2. NOWAIT λλ μ§§μ WAIT μ΅μ μ΄ μ€μ λ λ½ μμ²
μ ν리μΌμ΄μ
λ 벨μμ SELECT ... FOR UPDATE NOWAIT λλ LOCK TABLE ... IN EXCLUSIVE MODE NOWAITμ κ°μ΄ λͺ
μμ μΌλ‘ NOWAITλ₯Ό μ§μ ν κ²½μ°, μ κΈμ μ¦μ νλνμ§ λͺ»νλ©΄ λ°λ‘ μλ¬κ° λ°μν©λλ€. μ΄λ κ΅μ°© μνλ₯Ό λ°©μ§νκΈ° μν μλμ μΈ μ€κ³μΌ μ μμΌλ, νΈλν½μ΄ μ§μ€λλ μκ°λμ κ²½ν©μ΄ μ¦μ ν
μ΄λΈμ λν΄μλ λΆνμν μλ¬λ₯Ό μ λ°ν μ μμ΅λλ€. μ ν리μΌμ΄μ
μ½λ 리뷰 μμ΄ λ¬΄μ‘°κ±΄ NOWAITλ₯Ό μ¬μ©νλ κ΄νμ΄ λ¬Έμ μ κ·Όμμ΄ λκΈ°λ ν©λλ€.
3. μ₯κΈ° λ―Έμλ£ νΈλμμ (Long-running Transaction) λλ λ½ μ’λΉ μΈμ
λ€νΈμν¬ λ¨μ , μ ν리μΌμ΄μ λΉμ μ μ’ λ£ λ±μΌλ‘ μΈν΄ 컀λ°/λ‘€λ°± μμ΄ νΈλμμ μ΄ μ΄λ¦° μ±λ‘ λ°©μΉλ μΈμ μ΄ μ‘΄μ¬ν κ²½μ°, ν΄λΉ μΈμ μ΄ μ κΈμ κ³μ 보μ νκ² λ©λλ€. μ΄λ° μ’λΉ μΈμ μ λ€λ₯Έ μ μμ μΈ μμ λ€μ λͺ¨λ μ°¨λ¨νλ©°, μ₯μκ° λ°©μΉλ κ²½μ° μ°μμ μΈ λ½ λκΈ° νμμ μΌμΌμΌ μ 체 μλΉμ€ μ₯μ λ‘ μ΄μ΄μ§ μ μμ΅λλ€. μ€λ¬΄μμλ μ κΈ°μ μΈ μΈμ λͺ¨λν°λ§κ³Ό μκ³μΉ κΈ°λ° μλ¦Ό μμ€ν μ΄ λ°λμ νμν©λλ€.
ν΄κ²° λ°©λ²
μμΈ 1 ν΄κ²°: λ½μ 보μ ν μΈμ μλ³ λ° μ²λ¦¬
λ¨Όμ μ΄λ€ μΈμ
μ΄ ν΄λΉ κ°μ²΄μ λ½μ 보μ νκ³ μλμ§ νμΈν©λλ€.
-- νμ¬ λ½μ 보μ μ€μΈ μΈμ
κ³Ό λκΈ° μ€μΈ μΈμ
μ‘°ν
SELECT
l.sid,
l.serial#,
l.username,
l.status,
l.osuser,
l.machine,
l.program,
l.logon_time,
o.object_name,
o.object_type,
l2.type AS lock_type,
l2.lmode AS lock_mode,
l2.request AS request_mode
FROM
v$session l,
v$lock l2,
dba_objects o
WHERE
l.sid = l2.sid
AND l2.id1 = o.object_id
AND l2.type = 'TM'
ORDER BY
l2.lmode DESC;
-- νΉμ ν
μ΄λΈμ κ±Έλ¦° λ½μ 보μ ν μΈμ
μ SQL νμΈ
SELECT
s.sid,
s.serial#,
s.username,
s.status,
s.sql_id,
q.sql_text,
s.last_call_et AS elapsed_seconds
FROM
v$session s,
v$sqlarea q,
v$lock l,
dba_objects o
WHERE
s.sql_id = q.sql_id(+)
AND s.sid = l.sid
AND l.id1 = o.object_id
AND l.type = 'TM'
AND o.object_name = UPPER('&ν
μ΄λΈλͺ
')
AND l.lmode > 0;
λ½μ 보μ ν μΈμ
μ νμΈν ν, μ
무 μν₯λλ₯Ό νλ¨νμ¬ κ°μ μ’
λ£ν©λλ€.
-- μΈμ
κ°μ μ’
λ£ (SID, SERIAL# λ μ μ‘°ν κ²°κ³Ό μ°Έμ‘°)
ALTER SYSTEM KILL SESSION '1234,56789' IMMEDIATE;
-- RAC νκ²½μμλ INST_ID ν¬ν¨
ALTER SYSTEM KILL SESSION '1234,56789,@1' IMMEDIATE;
μμΈ 2 ν΄κ²°: NOWAIT λμ WAIT μ μ¬μ©
NOWAIT λμ μ μ ν λκΈ° μκ°μ μ€μ νμ¬ μΌμμ μΈ κ²½ν© μν©μ μμ°μ€λ½κ² ν΄μν©λλ€.
-- NOWAIT λμ WAIT N μ΄ μ§μ (μ΅λ Nμ΄κ° λκΈ° ν νλ μ€ν¨ μ μλ¬)
SELECT *
FROM orders
WHERE order_id = 1001
FOR UPDATE WAIT 10; -- 10μ΄ λκΈ°
-- LOCK TABLEμ WAIT μ μ μ©
LOCK TABLE orders IN EXCLUSIVE MODE WAIT 30; -- 30μ΄ λκΈ°
DDL μμ
μ Oracle 11g μ΄μμμλ DDL_LOCK_TIMEOUT νλΌλ―Έν° νμ©μ΄ κ°λ₯ν©λλ€.
-- μΈμ
λ 벨μμ DDL λ½ λκΈ° μκ° μ€μ (μ΄ λ¨μ)
ALTER SESSION SET DDL_LOCK_TIMEOUT = 60;
-- μ΄ν DDL μν μ μ΅λ 60μ΄ λκΈ° ν μ€ν
ALTER TABLE orders ADD (memo VARCHAR2(200));
-- μμ€ν
λ 벨 μ€μ (μꡬ μ μ©)
ALTER SYSTEM SET DDL_LOCK_TIMEOUT = 30 SCOPE = BOTH;
-- νμ¬ μ€μ νμΈ
SHOW PARAMETER DDL_LOCK_TIMEOUT;
μμΈ 3 ν΄κ²°: μ₯κΈ° λ―Έμλ£ νΈλμμ κ°μ§ λ° μ 리
-- μ€λλ λ―Έμλ£ νΈλμμ
μΈμ
μ‘°ν (30λΆ μ΄μ κ²½κ³Ό)
SELECT
s.sid,
s.serial#,
s.username,
s.status,
s.machine,
s.program,
ROUND((SYSDATE - l.start_time) * 24 * 60, 2) AS elapsed_min,
l.used_ublk,
l.used_urec
FROM
v$session s,
v$transaction l
WHERE
s.taddr = l.addr
AND (SYSDATE - l.start_time) * 24 * 60 > 30
ORDER BY
elapsed_min DESC;
-- λ½ μ²΄μΈ(Lock Chain) μ 체 ꡬ쑰 νμ
: λΈλ‘컀μ μ¨μ΄ν° νλμ νμΈ
SELECT
DECODE(l.block, 0, 'λκΈ°μ€', 1, 'λ½λ³΄μ (λΈλ‘컀)', 'κΈ°ν') AS lock_status,
s.sid,
s.serial#,
s.username,
s.status,
s.last_call_et,
o.object_name
FROM
v$lock l,
v$session s,
dba_objects o
WHERE
l.sid = s.sid
AND l.id1 = o.object_id(+)
AND l.type = 'TM'
ORDER BY
l.block DESC, l.id1;
μλ°© λ°©λ²
1. DDL μμ μ μ¬μ μ κ² λ° μ μ§λ³΄μ μλμ° νμ©
μ΄μ νκ²½μμ DDL μμ
μ λ°λμ μλΉμ€ νΈλν½μ΄ μ΅μνλ μ μ§λ³΄μ μλμ°(Maintenance Window) μκ°λμ μνν΄μΌ ν©λλ€. μμ
μ μλ μλ μ€ν¬λ¦½νΈλ‘ ν΄λΉ ν
μ΄λΈμ νμ± μΈμ
μ΄ μλμ§ λ°λμ νμΈνκ³ , DDL_LOCK_TIMEOUT νλΌλ―Έν°λ₯Ό μ μ ν μ€μ νμ¬ μΌμμ μΈ κ²½ν©μ μ μ°νκ² λμ²νλ κ²μ΄ Best Practiceμ
λλ€.
-- DDL μμ
μ νμ± μΈμ
μ¬μ μ κ² μ€ν¬λ¦½νΈ
SELECT
s.sid,
s.serial#,
s.username,
s.status,
s.sql_id,
s.last_call_et AS elapsed_sec,
t.start_time AS tx_start
FROM
v$session s,
v$transaction t
WHERE
s.taddr = t.addr(+)
AND s.username IS NOT NULL
AND s.status = 'ACTIVE'
ORDER BY
elapsed_sec DESC;
2. μ κΈ°μ μΈ λ½ λͺ¨λν°λ§ λ° μλ μλ¦Ό μ²΄κ³ κ΅¬μΆ
μ₯κΈ° λ½ μΈμ
μ μ€μκ°μΌλ‘ νμ§ν μ μλ λͺ¨λν°λ§ μ‘μ ꡬμ±νκ³ , μκ³μΉ μ΄κ³Ό μ DBAμκ² μλ¦Όμ΄ λ°μ‘λλλ‘ μλνν΄μΌ ν©λλ€. Oracle Enterprise Manager(OEM) λλ 컀μ€ν
DBMS_SCHEDULER μ‘μ νμ©νμ¬ 5λΆ λ¨μλ‘ μ₯κΈ° λ½ μΈμ
μ μ κ²νκ³ λ‘κ·Έλ₯Ό λ¨κΈ°λ©΄, λ¬Έμ λ°μ μ μ μν μμΈ λΆμμ΄ κ°λ₯ν©λλ€.
-- DBMS_SCHEDULERλ₯Ό μ΄μ©ν μ κΈ° λ½ λͺ¨λν°λ§ μ‘ μμ± μμ
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'JOB_LOCK_MONITOR',
job_type => 'PLSQL_BLOCK',
job_action => '
BEGIN
-- 10λΆ μ΄μ λ½ λ³΄μ μΈμ
κ°μ§ μ λ‘κ·Έ ν
μ΄λΈμ κΈ°λ‘
INSERT INTO dba_lock_log (sid, serial#, username, elapsed_min, log_time)
SELECT s.sid, s.serial#, s.username,
ROUND((SYSDATE - t.start_time)*24*60, 2),
SYSDATE
FROM v$session s, v$transaction t
WHERE s.taddr = t.addr
AND (SYSDATE - t.start_time)*24*60 > 10;
COMMIT;
END;
',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=MINUTELY; INTERVAL=5',
enabled => TRUE,
comments => 'μ₯κΈ° λ½ μΈμ
5λΆ μ£ΌκΈ° λͺ¨λν°λ§'
);
END;
/
κ΄λ ¨ μλ¬
-
ORA-00055:
maximum number of DML locks exceededβ DML λ½μ μ΅λ νμ© κ°μλ₯Ό μ΄κ³Όν κ²½μ° λ°μνλ©°,DML_LOCKSνλΌλ―Έν° μ‘°μ μ΄ νμν©λλ€. -
ORA-00060:
deadlock detected while waiting for resourceβ λ μΈμ μ΄ μλ‘ μλλ°©μ λ½μ κΈ°λ€λ¦¬λ©° κ΅μ°© μνμ λΉ μ§ κ²½μ° λ°μν©λλ€. Oracleμ μλμΌλ‘ νλμ μΈμ μ λ‘€λ°±νμ¬ ν΄μν©λλ€. -
ORA-04021:
timeout occurred while waiting to lock objectβ λ°μ΄ν° λμ λ리 κ°μ²΄μ λν μ κΈ νλ νμμμ μ λ°μνλ©°, μ£Όλ‘ DDL μμ μ€ κ²½ν© μ λνλ©λλ€. -
ORA-01013:
user requested cancel of current operationβ λ½ λκΈ° μ€ μ¬μ©μ μ·¨μ μμ²μ΄ λ°μνμ λ λνλ©λλ€.












