Dev Note/DB 2008.03.06 17:09

오라클에서 락(lock)이 걸려있는 것을 조회하고 해당 Session을 kill하는 방법을 알아본다.

-- 락(lock)이 걸려있는 Object에 대해 조회
SELECT 
    LOCK_OBJ.OBJECT_ID, DBA_OBJ.OBJECT_NAME, DBA_OBJ.OBJECT_TYPE,
    LOCK_OBJ.SESSION_ID, DBA_OBJ.OWNER, LOCK_OBJ.XIDUSN, LOCK_OBJ.SESSION_ID,
    DECODE(LOCKED_MODE, 2, 'ROW SHARE', 3, 'ROW EXCLUSIVE',  4, 'SHARE', 5,
        'SHARE ROW EXCLUSIVE', 6, 'EXCLUSIVE', 'UNKNOWN') LOCKED_MODE
FROM
    V$LOCKED_OBJECT LOCK_OBJ, DBA_OBJECTS DBA_OBJ
WHERE
    LOCK_OBJ.OBJECT_ID = DBA_OBJ.OBJECT_ID
    -- 특정 User 내에서 조회를 원할 때 추가
    AND ORACLE_USERNAME = [user];

OBJECT_ID  OBJECT_NAME  OBJECT_TYPE  SESSION_ID  OWNER  XIDUSN  SESSION_ID  LOCKED_MODE
--------------------------------------------------------------------------------------------------------------------------------------------------------
55502             TB_CASH_INFO TABLE                 141                   BACKEND    1         141                   ROW EXCLUSIVE

-- kill 하고자 하는 Session ID, Serial NO 조회하기
SELECT
    LOCK_OBJ.SESSION_ID, SESN.SERIAL# AS SERIAL_NO, LOCK_OBJ.OS_USER_NAME,
    LOCK_OBJ.ORACLE_USERNAME, SESN.STATUS
FROM
    V$LOCKED_OBJECT LOCK_OBJ, V$SESSION SESN
WHERE
    LOCK_OBJ.SESSION_ID = SESN.SID
    -- 특정 Session ID 내에서 조회를 원할 때 추가
    AND LOCK_OBJ.SESSION_ID = [session_id]

SESSION_ID   SERIAL_NO   OS_USER_NAME   ORACLE_USERNAME   STATUS
---------------------------------------------------------------------------------------------------------------
141                    10372             손님138                     BACKEND                         ACTIVE

-- 특정 Session ID, Serial NO를 kill 하기
ALTER SYSTEM KILL SESSION ['session_id, serial_no' ]

ALTER SYSTEM KILL SESSION '141, 10372'
락이 걸려있는 session을 kill 한다.
신고

Dev Note/DB 2008.03.06 16:15

Oracle에서 실행 된 쿼리문에 대한 정보를 조회하기 위해서는 몇몇 테이블을 조인하여 Select를 하면 되며, 특정 User에 대해서도 조회가 가능하다.

SELECT
    A.SID, A.USERNAME, A.MACHINE, A.TERMINAL, C.ADDRESS, C.LAST_ACTIVE_TIME,
    C.LAST_LOAD_TIME, C.SQL_TEXT
FROM
    V$SESSION A, V$ACCESS B, V$SQL C
WHERE
    A.SERVICE_NAME = C.SERVICE AND A.SID = B.SID AND A.PREV_SQL_ID = C.SQL_ID AND C.SERVICE = A.SERVICE_NAME
    -- 특정 User에 대해 조회하기를 원할 때 추가
    AND A.USERNAME = [user]

쿼리를 실행하는 계정이 V$SESSION, V$ACCESS, V$SQL 테이블에 권한이 있어야 한다.

신고

Dev Note/DB 2008.03.03 22:48

-- Oracle 사용자 계정 생성

CREATE USER [user_name] IDENTIFIED BY [password]
DEFAULT TABLESAPCE [tablespace_name]
TEMPORARY TABLESPACE [tablespace_name]

* 옵션 설명 *
USER : 생성 할 사용자 계정 이름을 설정한다.
IDENTIFIED BY : 사용자가 사용할 비밀번호를 설정한다.
DEFAULT TABLESPACE : 사용자가 기본으로 사용 할 tablespace를 지정한다.
TEMPORARY TABLESPACE : 사용자가 기본으로 사용할 temporary tablespace를 지정한다.

-- 등록 된 계정 목록 보기
SELECT username, user_id FROM dba_users;

-- 사용자 삭제
DROP USER [user_name];

-- 사용자 권한 설정
GRANT [role, ...] TO [user_name]
신고