오라클 데이터베이스 관리자 기초- (9)Undo(실행 취소) 데이터 관리

2020. 1. 13. 15:16카테고리 없음

* undo 데이터 관리

undo data 관리

- 자동 undo 관리

- 수동 undo 관리(사실상 사용하지 않음) 

- Undo와 rollback은 같은 의미이다.

- 행단위로 독점 락을 건다.

- 원래 데이터 값을 undo segment에 저장. 

- 그림상의 segment는 4개의 extent를 가지고 있다.

 

* undo segmet의 목적

트랜잭션 롤백

- 트랜잭션이 테이블에서 행을 수정할때 수정 하기 전의 데이터를 undo segment에 저장했다가 rollback 될 경우 undo segment 저장된 값을 가져와서 복원한다.

 

트랜잭션 recovery(복구)

-  데이터베이스가 다시 열릴때 데이터 파일에 commit되지 않은 데이터를 삭제하고 undo segment에 저장된 값을 가져와서 원래 값으로 복구한다. 

 

Read consistency(읽기 일관성)

- select 명령을 출력할때까지 누군가가 데이터를 수정하고 commit 명령까지 완료한 경우에도 select 명령이 입력 됐을 경우의 데이터를 불러와야 하는데 이때 undo segment에 저장된 값을 불러온다.

 

* Undo 세그먼트 유형

system

-system 테이블 스페이스의 객체에 사용

비system

- 기타 테이블 스페이스의 객체에 사용

- 자동 모드 : undo 테이블 스페이스가 필요하다. undo 테이블 스페이스를 생성하면 undo 세그먼트가 자동으로 생성.

 

[실습]undo 관련 설정 및 상태 확인

SELECT SEGMENT_NAME, TABLESPACE_NAME, STATUS
FROM DBA_ROLLBACK_SEGS;

- Undo segment의 상태를 조회한다. (open 상태일때)

 
SELECT N.USN, N.NAME, S.STATUS
FROM V$ROLLNAME N, V$ROLLSTAT S
WHERE N.USN=S.USN;
- 현재 사용 중이거나 사용 가능한 undo segment를 조회.(mount 상태일때. 그러나 mount 상태일때 undo를 사용할 일이 없기때문에 의미는 없다.)

SHOW PARAMETER undo; 
// undo 관련 parameter 설정 확인. undo용 tablespace가 하나밖에 없는 경우 parameter에 지정되지 않아도 되지만 여러개 존재하는 경우 반드시 사용될 undo tablespace의 이름을 지정해야 한다. 

SELECT tablespace_name, bytes, file_name FROM dba_data_files;
// 생성된 tablespace 설정과 datafile 확인

SELECT segment_name, tablespace_name, status
FROM dba_rollback_segs;
// 현재 시스템에 존재하는 undo segment 목록 확인

 

 

[실습]Undo tablespace 생성과 current undo tablespace 변경

CREATE UNDO TABLESPACE <tablespace명>
DATAFILE '' SIZE <크기>;
- Undo TABLESPACE를 생성한다.
- Locally management가 default이다.
- Segment space management를 AUTO로 지정된다.

SHOW PARAMETER undo_tablespace;
// undo 테이블스페이스 확인.

DROP TABLESPACE undotbs1;
// undotbs1은 현재 사용중이기때문에 삭제가 안된다

CREATE UNDO TABLESPACE undo
DATAFILE '/app/ora12c/oradata/disk3/undo01.dbf' SIZE 50M;
// undo 테이블 스페이스 생성

SELECT segment_name, tablespace_name, status
FROM dba_rollback_segs;
// undo segment 목록을 확인해보면 새로 생성된 undo segment는 사용되지 않고 있다.

ALTER SYSTEM SET undo_tablespace = undo;
//current undo tablespace를 undo로 변경

SHOW PARAMETER undo
// undo 관련 parameter 설정을 확인해보면 사용되고 있는 undo 테이블 스페이스가 undotbs1에서 undo로 변경된 것을 확인.

SELECT segment_name, tablespace_name, status
FROM dba_rollback_segs;
// open 상태일때 undo segment의 상태 조회

DROP TABLESPACE undotbs1;
// 기존의 undo 스페이스인 undotbs1 삭제. 만약 undo 테이블 스페이스 변경 이전부터 수행중인 트랜잭션이 활성화 상태라면 drop 명령이 먹히지 않는다.

!ls /app/ora12c/oradata/disk3/
// 데이터 파일을 확인해보면 사용하지 않는 undotbs01.dbf가 삭제되지 않고 남아있다.

!rm /app/ora12c/oradata/disk3/undotbs01.dbf
//  더 이상 사용하지 않는 파일은 반드시 삭제.