FAQ
LOCK TIMEOUT 발생 시 조치 방법 | |||||
분류 | 운영/관리 | 등록일 | 2013-07-09 | 조회수 | 5896 |
SQL 실행 도중 다음과 같이 오류가 나서 원하는 작업을 못할 때가 있습니다. The transaction exceeds lock timeout specified by user $ altierr -w "lock timeout" 0x11075 ( 69749) smERR_ABORT_smcExceedLockTimeWait The transaction exceeds lock timeout specified by user. # *Cause: The transaction failed to lock the object. # *Action: Please abort the transaction. 위의 오류코드 내용과 같이 해당 객체 - 테이블이나 뷰, 저장 프로시져 등 - 에 대해 lock을 잡을 수가 없다는 오류입니다. 테이블에 접근하는 모든 세션은 해당 테이블에 락을 잡고 접근하게 됩니다. 그러니까 그 테이블에 SELECT/INSERT/UPDATE 등의 DML을 수행하거나 ALTER TABLE 등의 DDL을 수행하는 등의 작업을 누군가 하고 있을 때 DROP TABLE을 수행하면 이전 작업이 commit/rollback할 때 까지 기다리게 됩니다. 이 경우, 사용자가 없는지 확인하고 이전 작업이 commit할 때가지 기다리거나, 세션을 강제로 끊을 수 있습니다. 하단의 예와 같이 alter database 문을 사용하면 세션을 강제로 끊을 수 있습니다. alter database 명령어로 session을 종료해도 해당 세션외의 다른 부분에는 영향을 미치지 않습니다. 그러나 서비스 중인 시스템에서 session id를 잘못 알고 session을 종료했을 경우, 문제가 될 수 있습니다. 운영을 위한 참고사항으로, 서비스 중인 시스템일 경우, 접속된 세션을 끊어도 또 다른 application이 접속하여 해당 테이블에 접근하면 lock이 추가될 수 있으므로 이부분에 대한 고려도 필요합니다. 가능하다면 작업중에는 해당 application이 실행되지 않도록 하는 것이 좋습니다. ========================================================= [ lock 정보 확인 ] select T.table_name, X.lock_desc from system_.sys_tables_ T, v$lock X where T.table_oid = X.table_oid and T.table_name = 'T1'; ========================================================= [ 세션 강제 종료 방법 ] [1] SESSION ID 찾기 iSQL> select 'alter database mydb session close '||ses_id||'; ' from ( select T.table_name, SES.id ses_id, X.lock_desc, X.lock_cnt, x.TRANS_ID, SES.client_pid pid, SES.COMM_NAME, STM.query qry from v$session SES, v$statement STM, v$lock X, system_.sys_tables_ T where SES.id = STM.session_id and STM.tx_id = X.trans_id and X.table_oid= T.table_oid -- and T.table_name like 'TEST1%' -- 원하는 테이블을 명시하십시오. ) group by ss_id ; 'alter database mydb session close '||SS -- 이렇게 결과가 나옵니다. ------------------------------------------------------------ alter database mydb session close 159; alter database mydb session close 160; alter database mydb session close 161; alter database mydb session close 162; 4 rows selected. [2] 세션 종료시키기 $ isql -sysdba -u sys -p manager iSQL(sysdba)> alter database mydb session close 159; alter database mydb session close 160; alter database mydb session close 161; alter database mydb session close 162; -- 위의 SQL 결과를 copy/paste 해서 실행합니다. |