티스토리 뷰

ORACLE/ADMIN

Oracle undo 언두 관리

공부하는알파카 2020. 7. 21. 21:15

UNDO 관리

SQL> show parameter undo

 

 

undo_management : AUTO

  • UNDO SEGMENT의 개수와 사이즈를 오라클이 알아서 정하겠다.

  • DBA가 할 일은 언두 전용 테이블스페이스(UNDO_TABLESPACE) 만들기만 하면 된다(사이즈 설정을 어떻게 할 것인지가 중요).

 

undo_tablespace : UNDOTBS1

  • undo_tablespace 파라미터가 가리키는 값이 지정된 언두 테이블스페이스이다.

  • 언두 테이블스페이스는 추가로 더 생성 가능하지만, 사용하는 테이블스페이스는 한개이다.

*그럼 왜 추가로 더 만드는 거지?

크기, 성능이 더 좋은 새로운 (언두) 테이블스페이스로 옮기고(switch) 싶어서.

→ switch 할 때 사용중이던 테이블스페이스에서 하던 작업들은 계속 진행됨(아직 완료되지 않은 트랜잭션 계속 진행)

→ 완료되면 자동 삭제됨 

 

 

 

undo_retention : 900(초)

  • commit 후 언두를 보존하는 시간

  • flashback query를 위해 지켜져야 한다.

  • undo_retention이 크면 undo도 커져야 한다. → 보존해야 하는 undo의 양이 늘어나기 때문에.

  • status : ACTIVE → UNEXPIRED → EXPIRED

  • 공간이 부족하면 undo_retention은 지켜지지 않는다.

*하지만 undo_retention이 반드시 지켜지는 경우가 있다.

① Undo datafile이 autoextend on 상태일 때

② 언두 테이블스페이스의 RETENTION이 GUARANTEE 상태일 때

select tablespace_name, allocation_type, segment_space_management, contents, retention
from dba_tablespaces
where contents='UNDO';

 

 

UNDO RETENTION은 다음 명령어로 변경할 수 있다.

alter tablespace undotbs1 retention guarantee;

 

 

 

 

UNDO의 용도

① rollback - 트랜잭션 실행 중 rollback 하면 변경 전 데이터를 가져오기 위해서 언두가 필요하다.

② 읽기 일관성 지원

③ 실패한 트랜잭션의 recovery - 서버 프로세스가 죽었을 때 PMON이 복구(rollback)할 경우, instance recovery의 rollforward 후 rollback 할 경우.

④ flashback - 과거의 특정 시점으로 돌아가기 위해 언두가 필요하다.

 



 

 

트랜잭션과 언두 데이터(undo segment)

• undo extent 최소 2개로 시작한다.

• undo extent를 계속 돌려쓴다.

*새로운 extent를 할당하려면 사용 안한지 제일 오래된 extent로 가서,

- 거기에 존재하는 트랜잭션이 모두 commit 되어 EXPIRED 상태면 재사용(OVERWRITE) 한다.

- 하지만 ACTIVE 상태가 하나라도 있으면 재사용 못하고 새로운 extent를 할당한다.

 

• 각 트랜잭션은 하나의 언두 세그먼트에만 할당된다

• 하나의 언두 세그먼트는 한 번에 여러 개의 트랜잭션 처리가 가능하다.

 

• 언두 세그먼트와 익스텐트의 관계

select segment_name, sum(bytes)/1024 k, count(extent_id) -- count(extent_id) = extent 개수
from dba_undo_extents
group by segment_name;

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함