오랫동안 수행했던 DML 세션을 Kill 취소 했을 경우 사용한 Undo 릴리즈 하는 남은 시간 확인 하는 방법
수행 시간이 긴 트랜잭션을 kill 했을 경우 SMON이 복구하는 과정에서
wait for a undo record 이벤트와 PX Deq: Txn Recovery Start 이벤트가 동시에 대량으로 발생합니다.
1 ) update 하던 세션이 너무 오래 걸려서 아래와 같이 세션 kill 을 수행했습니다.
1 |
alter system kill session 'sid,seiral#' immediate; |
이렇게 하면 SMON 은 여러개의 서버 프로세스를 이용해서 트랜잭션을 rollback 처리합니다.
상당히 많은 량의 wait for a undo record 이벤트와 PX Deq: Txn Recovery Start가 감지가 된 것을 볼 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
=========================================================================================== Session Information =========================================================================================== SID-SERIAL HashValue Spid Machine-Program COMMAND LOGON_TIME Call(s) EVENT -------------- ------------ ---------- -------------------------- ------ ---------- ---------- ------------------------- [9874,46615] 0 7472078 orcl@db01 (P000) n/a 0620.20:12 000.000 db file sequential read [245,61609] 0 61670314 orcl@db01 (P059) n/a 0620.20:12 000.000 wait for a undo record [5681,17633] 0 35717294 orcl@db01 (P035) n/a 0620.20:12 000.000 row cache lock [5480,33199] 0 24707536 orcl@db01 (P007) n/a 0620.20:12 000.000 wait for a undo record [5238,20611] 0 20578538 orcl@db01 (P036) n/a 0620.20:12 000.000 wait for a undo record ... ================================================================================ Session Information ================================================================================ SID-SERIAL HashValue Spid Machine-Program COMMAND LOGON_TIME Call(s) EVENT -------------- ------------ ---------- -------------------------- ------- ----------- ---------- --------------------------- [9867,18343] 0 7472078 orcl@db01 (P000) n/a 0620.20:24 000.000 wait for a undo record [5238,20743] 0 20578538 orcl@db01 (P036) n/a 0620.20:24 000.000 PX Deq: Txn Recovery Start [3256,43759] 791757000 52822524 orcl@db01 (P029) select 0620.20:24 000.000 PX Deq: Txn Recovery Start [8495,57391] 0 12518128 orcl@db01 (P056) n/a 0620.20:24 000.000 PX Deq: Txn Recovery Start ... |
이것을 Fast Start Parallel Rollback 이라고 합니다.
초기화 파라메터 FAST_START_PARALLEL_ROLLBACK 의 값에 따라서 복구할 때 의 parallel degree 가 결정이 됩니다.
FALSE 일 경우는 Parallel Rollback을 수행하지 않는 것이며,
LOW (default) 일 경우는 CPU_COUNT * 2 까지 병렬로 롤백을 진행합니다.
HIGH 일 경우는 CPU_COUNT * 4 까지 병렬로 롤백을 수행합니다.
parallel rollback 이 항상 좋은 것만은 아닙니다.
변경이 많은 서비스의 경우에는 이로 인해서 undo segment 부족 현상으로 아래와 같은 에러 메시지로 장애상황이 될 수 도 있습니다.
1 |
ORA-30036: unable to extend segment by 8 in undo tablespace "UNDO TABLESPACE NAME" |
Parallel rollback 처리중에 V$FAST_START_SERVERS 로 상태를 조회할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 |
select state, count(*) from V$FAST_START_SERVERS group by state; STATE COUNT(*) ----------- ---------- RECOVERING 60 / STATE COUNT(*) ----------- ---------- IDLE 59 RECOVERING 1 |
그리고, 언제쯤 끝날지도 V$FAST_START_TRANSACTIONS 뷰로 예측해볼 수 있습니다.
1 2 3 4 5 6 7 8 9 10 |
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 ---------- ---------------- ---------- ---------- ---------- ------------------- 1109 RECOVERING 2269489 31317 2238172 2019/08/08 00:06:03 |
다음과 같이 예측해볼 수도 있습니다 |
1 2 3 4 5 6 7 8 |
select ktuxeusn, to_char(sysdate,'YYYY/MM/DD HH24:MI:SS') "Time", ktuxesiz, ktuxesta from x$ktuxe where ktuxecfl = 'DEAD'; KTUXEUSN Time KTUXESIZ KTUXESTA ---------- ------------------- ---------- -------------- 1109 2019/07/20 23:07:22 1800231 ACTIVE |
1 2 3 4 5 6 7 8 9 10 11 |
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 ---------- ---------------- ---------- ---------- ---------- ------------------- 1109 RECOVERING 2269489 31317 2238172 2019/07/21 00:06:03 |
다음과 같이 예측해볼 수도 있습니다. |
1 2 3 4 5 6 7 |
select ktuxeusn, to_char(sysdate,'YYYY/MM/DD HH24:MI:SS') "Time", ktuxesiz, ktuxesta from x$ktuxewhere ktuxecfl = 'DEAD'; KTUXEUSN Time KTUXESIZ KTUXESTA ---------- ------------------- ---------- -------------- 1109 2019/07/20 23:07:22 1800231 ACTIVE |
완료가 되면 이렇게 조회가 됩니다.
1 2 3 4 5 6 7 8 9 10 |
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 ---------- ---------------- ---------- ---------- ---------- ------------------- 1109 RECOVERED 32874 32874 0 2019/07/21 00:24:21 |
Hiya, I am really glad I have found this information. Nowadays bloggers publish just about gossips and web and this is really irritating. A good blog with interesting content, that’s what I need. Thank you for keeping this website, I will be visiting it. Do you do newsletters? Can not find it.