오랫동안 수행했던 DML 세션을 Kill 취소 했을 경우 사용한 Undo 릴리즈 하는 남은 시간 확인 하는 방법
수행 시간이 긴 트랜잭션을 kill 했을 경우 SMON이 복구 하는 과정에서
wait for a undo record 이벤트와 PX Deq: Txn Recovery Start 이벤트가 동시에 대량으로 발생합니다.
1 ) update 하던 세션이 너무 오래 걸려서 아래와 같이 세션 kill 을 수행했습니다.
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 부족 현상으로 아래와 같은 에러 메시지로 장애상황이 될 수 도 있습니다.
ORA - 30036 : unable to extend segment by 8 in undo tablespace "UNDO TABLESPACE NAME"
Parallel rollback 처리중에 V$FAST_START_SERVERS 로 상태를 조회할 수 있습니다.
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 뷰로 예측해볼 수 있습니다.
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
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
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
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
완료가 되면 이렇게 조회가 됩니다.
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.