리오그에 대해 설명하기전에, 필요성에 대해 언급하고 넘어가자.
특정 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 |