-- ORA-28000: the account is locked 오류시
-- 여러 차례 로그인 실패시 또는 30일동안(Default) 해당 계정으로 로그인을 하지 않았을 경우 lock 걸림
1) Unix 시스템
# sqlplus "/as sysdba" 로 접속
2) Windows 시스템
C:\>sqlplus system/비밀번호@접속DB명 as sysdba
-- 또는 --
C:\>sqlplus /nolog
SQL> conn system/비밀번호@접속DB명 as sysdba
-- 비밀번호는 아무거나 입력해도 통과됨.
연결되었습니다.
세션이 변경되었습니다.
SQL> show user
USER은 "SYS"입니다
SQL>
-- lock 걸린 User 찾기
SELECT username, account_status, to_char(lock_date,'yy/mm/dd hh24:mi') lock_date, profile
FROM dba_users;
-- Lock 풀기 (유저가 system 일 경우)
ALTER USER SYSTEM account unlock;
-- 패스워드 변경
ALTER USER SYSTEM IDENTIFIED BY manager;
# 아래 내용 출처
http://blog.naver.com/steel_cat?Redirect=Log&logNo=40101605344
1. 먼저 lock 확인을 한다.
-- lock 걸린 SERIAL_NO,SESSION_ID, OBJECT
SELECT DISTINCT t1.session_id AS session_id
,t2.serial# AS serial_no
,t1.os_user_name AS os_user_name
,t1.oracle_username AS oracle_username
,t2.status AS status
,t3.object_name
,DECODE( locked_mode
,2, 'ROW SHARE'
,3, 'ROW EXCLUSIVE'
,4, 'SHARE'
,5, 'SHARE ROW EXCLUSIVE'
,6, 'EXCLUSIVE'
,'UNKNOWN'
) lock_mode
FROM v$locked_object t1, v$session t2, dba_objects t3
WHERE t1.session_id = t2.SID
AND t1.object_id = t3.object_id;
2. 위 쿼리에서 확인한 session_id를 *SESSION_ID*에 넣으면 어떤 sql을 사용해서 lock이 걸렸는지 확인 할 수있다.
-- lock 걸린 sql
SELECT b.username username
,c.SID AS session_id
,c.owner object_owner
,c.OBJECT OBJECT
,b.lockwait
,a.sql_text SQL
,piece
FROM v$sqltext a, v$session b, v$access c
WHERE a.address = b.sql_address
AND a.hash_value = b.sql_hash_value
AND b.SID = c.SID
AND c.owner != 'SYS'
and c.SID = '*SESSION_ID*'
ORDER BY b.username, c.SID, c.owner, c.OBJECT, piece;
3. 아래 쿼리 *SESSION_ID*,*SERIAL_NO* 부분에 위 1번 쿼리에서 확인한 session_id,serial_no을 사용하여 lock 걸린 session을 kill 한다.
-- lock 걸린 SESSION kill
alter system kill session 'SESSION_ID ,SERIAL_NO' ;
4. 3번의 alter system kill session을 사용하여도 죽지 않는 경우 아래 쿼리를 사용하여 PROCESS ID를 확인하여 unix에서 직접 PROCESS를 kill한다.
* 주의!!! 실수하기 쉽고 위험한 방법으로 lock걸린 내용을 정확히 알지 못할 경우 kill하지 말것!!!
-- lock 걸린 PROCESS ID 찾기
SELECT DISTINCT s.username "ORACLE USER"
,p.pid "PROCESS ID"
,s.SID "SESSION ID"
,s.serial#
,osuser "OS USER"
,p.spid "PROC SPID"
,s.process "SESS SPID"
,s.lockwait "LOCK WAIT"
FROM v$process p, v$session s, v$access a
WHERE a.SID = s.SID
AND p.addr = s.paddr
AND s.username != 'SYS'
-- unix에 로그인 하여 process kill
kill -9 프로세스아이디
'데이터베이스 (DB)' 카테고리의 다른 글
mysql log - 에러로그 (0) | 2016.03.04 |
---|---|
CUBRID_HA_GUIDE (0) | 2015.12.25 |
데이터 가져오기/내보내기 (csv 파일) / sqlgate 2010 (0) | 2015.12.24 |
데이터 가져오기/내보내기 (txt 파일) / sqlgate 2010 (0) | 2015.12.24 |
데이터 가져오기/내보내기 (xlsx 파일) / sqlgate 2010 (0) | 2015.12.24 |