트랜잭션을 킬하면 트랜잭션이 처리했던 데이터들을 롤백하게 됩니다.
롤백이 끝날때까지 해당 테이블에 트랜잭션을 수행할 수 없어 무한정 기다리게 되는데
이 롤백을 좀더 빨리 하고 완료시간을 예상해볼 수 있는 쿼리를 공유드리겠습니다.
-1. 트랜잭션 & 프로세스 킬
alter system kill session 'sid,seiral#' immediate;
SELECT s.sid, s.serial#, p.spid FROM v$process p, v$session s WHERE p.addr = s.paddr AND s.status='KILLED' -OS- kill -9 pid
=> DB상에서 트랜잭션 정리 후 spid를 찾아 OS상에서도 프로세스를 정리해줌
-2. Fast Start Parallel Rollback 유도
SID-SERIAL HashValue Spid Machine-Program COMMAND LOGON_TIME Call(s) EVENT -------------- ------------ ---------- -------------------------- ------ ---------- ---------- ------------------------- [9874,46615] 0 7472078 db01-oracle@db01 (P000) n/a 0620.20:12 000.000 db file sequential read [245,61609] 0 61670314 db01-oracle@db01 (P059) n/a 0620.20:12 000.000 wait for a undo record [5681,17633] 0 35717294 db01-oracle@db01 (P035) n/a 0620.20:12 000.000 row cache lock [5480,33199] 0 24707536 db01-oracle@db01 (P007) n/a 0620.20:12 000.000 wait for a undo record [5238,20611] 0 20578538 db01-oracle@db01 (P036) n/a 0620.20:12 000.000 wait for a undo record [5061,59825] 0 25493528 db01-oracle@db01 (P034) n/a 0620.20:12 000.000 wait for a undo record [5044,17947] 0 57540908 db01-oracle@db01 (P057) n/a 0620.20:12 000.000 wait for a undo record . . .
=> db상에서 세션을 킬했을 때의 롤백은 프로세스 하나로 처리되기 때문에 롤백속도가 매우 느림
이렇게 롤백 중인 세션마저 킬했을 경우에는 오라클은 비정상종료로 인식하고 빠른 정상화를 위해
SMON을 병렬로 활용하여 트랜잭션을 롤백함
이것을 Fast Start Parallel Rollback 라고 함
-3. 롤백 상태 모니터링 쿼리
SQL> show parameter fast_start_parallel_rollback; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ fast_start_parallel_rollback string LOW
=> 위 파라미터 값에 따라 롤백 시 사용 될 parallel degree가 정해짐
FALSE : 사용안함 LOW : CPU_COUNT*2 HIGH : CPU_COUNT*4
* ALTER SYSTEM SET FAST_START_PARALLEL_ROLLBACK=HIGH;
커맨드로 동적으로 변경가능
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS'; SELECT usn, state, undoblockstotal "Total", undoblocksdone "Done", undoblockstotal-undoblocksdone "ToDo", DECODE(cputime,0,'unknown',SYSDATE+(((undoblockstotal-undoblocksdone) / (undoblocksdone / cputime)) / 86400)) "Finish at" FROM v$fast_start_transactions; USN STATE Total Done ToDo Finish at 1074 RECOVERING 2756639 55180 2701459 2019/05/08 02:08:06
=> 롤백이 언제 끝날지 유추할 수 있는 쿼리
* 병렬로 롤백처리 하면 기존방식 보다 훨씬 빠르다는 장점도 있지만
프로세스가 병렬로 대량 수행되고 서버 리소스를 많이 사용하게 되어 서버에 의도치 않은 부하를 줄 수 있으니
수행하기 전 검토가 필요합니다.