* 문제상황 :
- 솔루션 업그레이드를 위해 DB에 새로운 USER, TABLESPACE에 Migration 준비
- 새로운 USER 소유의 TABLE, INDEX만 만들고 데이터는 Migration 하기 전, 테이블 생성 진행 중
"ORA-01658: 테이블스페이스에 세그먼트에 대한 INITIAL 확장 영역을 작성할 수 없습니다" 에러 발생
- 테이블은 daily range partition, subpartition 등을 가진 테이블을 포함했기 때문에 Segment 개수는 많음
* 해결과정 :
테이블에 데이터가 0건인데 수십 GB를 사용하고 있는 경우 둘 중에 하나를 의심해볼 수 있다.
- TRUNCATE가 아닌 DELETE로 데이터를 삭제해 High Water Mark가 줄지 않았거나,
- INITIAL EXTENT가 크게 할당된 상황이다.
신규 테이블스페이스이므로 INITIAL EXTENT일 확률이 높아 보였다.
이 경우에도 2가지를 의심해볼 수 있다.
1) DDL의 STORAGE OPTION에 INITIAL EXTENT가 과도하게 많이 잡혔을 경우
2) 테이블스페이스가 UNIFORM 형태로 많은 INITIAL EXTENT를 할당하고 있는 경우
이 중 2) UNIFORM 10M로 테이블스페이스가 생성되어있어 지나치게 많은 초기 EXTENT를 할당하고 있었다.
* 조치 중 참고할만한 내용 :
- 10g 이상부터는 DMT가 아닌 LMT(Locally Managed Tablespace) 중 Uniform, Autoallocate를 사용한다.
- UNIFORM으로 관리되는 TABLESPACE의 경우 UNIFORM EXTENT의 용량을 바꿀 수 없다. (DROP 후 재생성만 가능)
- AUTOALLOCATE의 경우 Oracle이 자체적으로 extent를 할당하는데 initial은 64K, next는 세그먼트 용량에 따라
64K ~ 64M으로 할당하는 것으로 알려져있다. Oracle에서 명확한 공식은 공개하지 않아 버전별 차이도 있을 것으로 예상. 추가 확인은 안해봤지만 구글링 중 아래 참고자료를 비롯한 복수의 문서에서 이런 내용을 찾을 수 있었다.
IF dba_segment.bytes < 1M THEN next extent = 64K ElSIF 1M <= dba_segment.bytes < 64M THEN next extent = 1M ELSIF 64M <= dba_segment.bytes < 1G THEN next extent = 8M ELSE next extent = 64M. |
* 참고자료 :
https://docs.oracle.com/database/121/ADMIN/tspaces.htm#ADMIN011
https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:25322140091802
'데이터 사이언스 DataScience > Data Base 데이터베이스' 카테고리의 다른 글
[Oracle] LOB보다 TABLE 용량이 더 큰 이유 (0) | 2022.02.03 |
---|---|
[MySQL] DB 이중화 1) Replication (0) | 2022.01.28 |
[Oracle] rename을 통한 테이블 마이그레이션 (0) | 2022.01.19 |
[Oracle] OGG Classic 모드 테이블 변경시 가동 순서 (0) | 2022.01.19 |
[Oracle] 가상컬럼을 통한 파티션 테이블 관리 (0) | 2022.01.10 |