본문 바로가기
[DATABASE] ORACLE

[Oracle] Transaction Rollback 상태 확인

by 기미차니 2022. 11. 17.
반응형

1. 정상(DML) 비정상(KILL) 및 Crash Recovery 상황 시 Rollback 모니터링 방법

 

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
-- #######################################################
-- Rollback & Crash Recovery
--
-- 1. DML(INSERT,UDATE,DELETE)에 의한 TX Rollback 모니터링
-- 2. Kill Session에 의한 TX Rollback 모니터링
-- 3. Rollback 중인 Session Kill 한다면?
-- 4. Crash Recovery (SMON)
-- #######################################################
 
-- 1. DML(INSERT,UDATE,DELETE)에 의한 Rollback 모니터링
SELECT SID
     , SQL_ID
     , SERIAL#
     , TARGET
     , OPNAME
     , TARGET
     , SOFAR
     , TOTALWORK
     , UNITS
     , START_TIME
     , TIME_REMAINING
     , ELAPSED_SECONDS
     , LAST_UPDATE_TIME 
  FROM V$SESSION_LONGOPS
 WHERE 1=1
--   AND USERNAME='ORAKIM'
--   AND OPNAME='TRANSACTION ROLLBACK'
--   AND SID=1060
   AND TOTALWORK>SOFAR
;
 
 
-- 2. Kill Session(비정상 종료)에 의한 TX Rollback 모니터링
SELECT SYSDATE
     , S.SID
     , S.SERIAL#
     , S.USERNAME
     , SUBSTR(S.PROGRAM130AS COMMAND
     , T.USED_UBLK
     , R.NAME AS "ROLLBACK SEG"
  FROM V$SESSION S, V$TRANSACTION T, V$ROLLNAME R
 WHERE S.TADDR=T.ADDR
   AND T.XIDUSN = R.USN
   AND S.SID=9291
;
-- [완료시간 예측]
-- 2022/11/17 09:20:00 -> 200000
-- 2022/11/17 09:30:00 -> 100000
-- 10분에 100000 Block 처리 -> 10분 후 종료 예측
 
 
-- 3. Rollback 중인 Session Kill 한다면?
-- fast_start_parallel_rollback 파라미터에 의해 병렬 처리 가능 (CPU 자원에 따라 유동적)
SELECT * FROM V$FAST_START_SERVERS;
SELECT * FROM V$FAST_START_TRANSACTIONS;
SELECT * FROM V$PARAMETER WHERE NAME = 'fast_start_parallel_rollback';
 
-- 수치를 조정해 가면서 아래 예상시간 조정
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
 
-- [완료시간 예측]
SET SERVEROUTPUT ON;
DECLARE
    FLAG NUMBER     := 0;
    T VARCHAR(16)   := '070001025BFEDAB8'-- V$SESSION의 TADDR 값
    UREC_INIT NUMBER;
    UREC_NEXT NUMBER;
    TIME_INIT NUMBER;
    TIME_NEXT NUMBER;
    TIME_LEFT NUMBER;
BEGIN
    SELECT USED_UREC INTO UREC_INIT FROM V$TRANSACTION WHERE ADDR = T;
    SELECT HSECS INTO TIME_INIT FROM V$TIMER;
 
    WHILE (FLAG <= 0) LOOP
        SELECT USED_UREC INTO UREC_NEXT FROM V$TRANSACTION WHERE ADDR = T;
        SELECT HSECS INTO TIME_NEXT FROM V$TIMER;
        IF (TIME_INIT + 1000 < TIME_NEXT) THEN
            FLAG := FLAG + 1;
        END IF;
    END LOOP;
 
    TIME_LEFT := ROUND(UREC_NEXT/(UREC_INIT - UREC_NEXT)*(TIME_NEXT - TIME_INIT)/100);
    
    DBMS_OUTPUT.PUT_LINE('ESTIMATE CLEAN-UP TIME: '
                         ||TO_CHAR(TRUNC(TIME_LEFT/3600))||' HOURS '
                         ||TO_CHAR(TRUNC(MOD(TIME_LEFT,3600)/60))||' MINUTES '
                         ||TO_CHAR(TRUNC(MOD(MOD(TIME_LEFT,3600),60)))||' SECONDS');
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('CLEAN-UP COMPLETED.');
    WHEN ZERO_DIVIDE THEN
        DBMS_OUTPUT.PUT_LINE('CAN''T ESTIMATE TIME NOW. RUN LATER.');
END;
/
 
 
-- 4. Crash Recovery (SMON)
/*
a. Parallel Transaction Recovery:
   ALTER SYSTEM SET FAST_START_PARALLEL_ROLLBACK = HIGH
   OR
   ALTER SYSTEM SET FAST_START_PARALLEL_ROLLBACK = LOW
 
b. If the parallel recovery is hanging, enable serial recovery:
   ALTER SYSTEM SET FAST_START_PARALLEL_ROLLBACK = FALSE
*/
 
SELECT USN
     , INST_ID
     , STATE
     , UNDOBLOCKSTOTAL AS "TOTAL"
     , UNDOBLOCKSDONE "DONE"
     , UNDOBLOCKSTOTAL-UNDOBLOCKSDONE "TODO"
     , DECODE(CPUTIME,0,'UNKNOWN',SYSDATE+(((UNDOBLOCKSTOTAL-UNDOBLOCKSDONE) / (UNDOBLOCKSDONE / CPUTIME)) / 86400)) "ESTIMATED TIME TO COMPLETE"
  FROM GV$FAST_START_TRANSACTIONS
;
 
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') DT
     , SUM(UNDOBLOCKSDONE) DONE
     , SUM(UNDOBLOCKSTOTAL)  TOTAL
     , SUM(UNDOBLOCKSTOTAL) - SUM(UNDOBLOCKSDONE)  AS REMAIN
  FROM V$FAST_START_TRANSACTIONS
 ORDER BY 1
;
cs
반응형

댓글