리오그에 대해 설명하기전에, 필요성에 대해 언급하고 넘어가자.


특정 Tablespace가 Full이 차서, 테이블 데이터 일부를 지웠다고 가정해보자.

 

과연 아래경우 TBS 용량은 얼마가 될까?

 

1) 60%

2) 100%

 

 

 

 

 

 

 

 

 

 

※ HWM ( High Water Mark ) : 지금까지 점유되었던 공간의 최고점

 

 

1) 60%

2) 100%

 

100% 이다. 기존의 할당된 영역은 그대로고, 사이에 데이터만 지워졌기 때문이다.

 

이런 경우 실제 데이터 양과는 상관없이,

TBS와 HWM이 동일하기 때문에 아래 문제가 예상된다.

- 신규 데이터 Insert 불가
- Full Table scan시에 HWM까지 탐색하므로, 불필요한 작업 발생

 

Truncate 하면 ( 테이블 구조만 남기고, 데이터는 모두 삭제 )

TBS 확보 및 HWM 위치를 조절할 수 있으나

 

일부 데이터만 삭제하려는 위의 케이스에는 맞지않다.

 

해당 케이스에는 비워진 공간만큼 재구성하는 리오그 ( Reorganization ) 작업이 필요한 것이다.

 


Reorg 방법

 

1) ALTER TABLE MOVE

 

- 속도가 빠르다

- 데이터 용량만큼의 TBS 공간 추가로 필요

- TBS 오프라인 필요

 

1) 임시 테이블 스페이스 생성
CREATE TABLESPACE '임시TBS명' DATAFILE 'DB파일_PATH' SIZE 1G;

2) 속도를 위해 해당 테이블 Nologging 모드
ALTER TABLE 테이블이름 NOLOGGING;

3) 데이터 삭제후, 대상 테이블 임시 테이블스페이스로 이동
ALTER TABLE '테이블명' MOVE TABLESPACE '임시TBS명';

4) 기존 테이블스페이스로 원복
ALTER TABLE '테이블명' MOVE TABLESPACE '기존TBS명';

5) 인덱스 상태 확인
SELECT TABLE_NAME, INDEX_NAME, STATUS FROM DBA_INDEXES WHERE TABLE_NAME = '테이블명';
-> 지워진 인덱스의 경우, 실제 delete가 아닌 Unusable 마킹만 되어있다.
    계속 두면 segment가 실 데이터양보다 커질 수 있으니, rebulid 명령어로 정리해주자. 

ALTER INDEX (INDEX_NAME) REBUILD;

 

[참조]

https://positivemh.tistory.com/350

 


2) Shrink

 

- 온라인작업

- 오라클 10g 이상

- Undo TBS 확보 必

- 이동하는 Row에 대해 순간 Lock ( Enqueue ) 가 걸릴 수 있음

 

1) 각 row들 빈공간으로 이동 가능하게 설정
alter table 'Table명' enable row movement;

2) Row 이동
alter table 'Table명' shrink space cascade compact;
=> 실 데이터만 이동하고 HWM은 유지됌

3) HWM 이동 및 TBS 반환
alter table 'Table명' shrink space cascade ;

4) row 이동 X
alter table GSBN.TCOMCR_PRODUCT_VARIANT disable row movement;

 

'DB > Oracle' 카테고리의 다른 글

마이그레이션 (2) DB Link  (1) 2021.07.06
마이그레이션 (1) expdp/impdp  (0) 2021.07.06

+ Recent posts