행위

Fast start parallel rollback

DB CAFE

thumb_up 추천메뉴 바로가기


1 빠르게 롤백 하는 방법[편집]

  • SMON parallell 로 트랜잭션 롤백하기
  1. 트랜잭션을 킬하면 트랜잭션이 처리했던 데이터들을 롤백
  2. 롤백이 끝날때까지 해당 테이블에 트랜잭션을 수행할 수 없어 무한정 기다림

1.1 트랜잭션 & 프로세스 킬[편집]

  • db
-- session kill 
alter system kill session 'sid,seiral#' immediate; 

-- killed seasion 확인
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상에서도 프로세스를 정리해줌

1.2 Fast Start Parallel Rollback 처리[편집]

  1. db상에서 세션을 킬했을 때의 롤백은 프로세스 하나로 처리되기 때문에 롤백속도가 매우 느림
  2. 롤백 중인 세션마저 킬했을 경우에는 오라클은 비정상종료로 인식하고 빠른 정상화를 위해 SMON을 병렬로 활용하여 트랜잭션을 롤백함
  3. 이것을 Fast Start Parallel Rollback 라고 함

1.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

1.4 커맨드로 동적으로 변경[편집]

ALTER SYSTEM SET FAST_START_PARALLEL_ROLLBACK=HIGH;

1.5 롤백이 언제 끝날지 유추 하는 쿼리[편집]

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
  • 병렬로 롤백처리 하면 기존방식 보다 훨씬 빠르다는 장점도 있지만 프로세스가 병렬로 대량 수행되고 서버 리소스를 많이 사용하게 되어 서버에 의도치 않은 부하를 줄 수 있으니

수행하기 전 검토 필요