늘 언제나 방심하고 있으면 나타나는 오류들...
이번엔 TabeleSpace
TableSpace에러는 Log
를 쌓는 테이블에 있던 일이라
이번에도 그려려니 하고 있었지만 처음 발생하는 에러로 보였다
내가 알고 있는 에러의 종류
ORA-01653: USERNAME.테이블명 테이블 스페이스를 확장할 수 없습니다.
이번에 발생한 에러의 종류
ORA-01691: USERNAME.SYS_LOB4314013????? 테이블 스페이스를 확장할 수 없습니다.
어떤 테이블에서 공간이 부족한지 보여주지만, 이번에는 만든적도 없는 테이블에서 공간이 부족하다고 하니 왜 저런 문제가 발생했는지 궁금해졌다
원인을 정확히 알기 위해서는 TableSpace부터 무엇인지 알아보자
저도 깊게 이해한게 아니니 짧고 간략하게 설명하고, 정확한 설명은 글 아래 출처에서 보시는게 좋습니다.
Database를 데이터 구조는 아래와 같이 되어있습니다.
Database > TableSpace > Segments > Extents > Blocks
Blocks은 데이터를 저장하는 가장 작은 단위
Extents는 여러 Blocks이 모여 만들어진 저장 단위 (연속된 공간으로 만들어진 공간이 아니라 여러 블록 구조가 합쳐진 개념)
Segments는 여러Extents가 모여진 단위 + 인덱스 세그먼스 + 임시 세그먼트
TableSpace는 Segments + (SYSTEM + UNDO + TEMP) Space 에 대한 정보
TableSpace는 위와 같이 가지고 있고, 데이터를 실제 물리적인 경로에 저장을 하고 있다. (dbf 확장자)
SELECT * FROM dba_data_files;
위 쿼리를 조회해 보면 FILE NAME
에 Table Space가 저장된 경로가 보이고, 나머지 컬럼을 통해 필요한 정보를 얻을 수 있다.
SELECT * FROM dba_segments WHERE SEGMENT_NAME = '테이블명';
위 쿼리는 테이블에 대한 Segments 정보를 조회할 수 있다.
현재 몇개의 Extents, Blocks가 할당되었는지, 어떤 TableSpace 파일(물리 경로)을 보고 있는지도 확인이 가능합니다.
로그를 찾아보니 A테이블에 INSERT 할 때 문제가 발생하고 있었다.
그렇지만 A테이블 공간은 충분한 걸로 보이는데??
LOB
데이터는 테이블에 같이 저장되는 것이 아니라 SYS_LOB123136531?????
로 dba_segments
테이블에 따로 관리가 되고 있었다.
문제가 발생한 테이블이 아닌 CLOB
을 따로 관리하고 있는곳에서 공간이 부족하다고 에러가 발생한 것
SELECT * FROM dba_lobs WHERE TABLE_NAME = '테이블명';
조회 시 테이블에 사용되는 LOB
의 Segments를 알 수 있다.
테이블스페이스 공간이 부족하니 dbf 파일을 생성해 문제는 해결했지만
문제 있는 Table은 예전에 만든 dbf파일 경로를 보고 있는데....?
CLOB 컬럼은 다른 테이블에서도 사용하고 있는데 왜 해당 테이블만???
dba_segments
테이블을 조회하니 예전에 생성한 dbf을 보고있었다
해당 파일은 이미 용량이 꽉 찼는데, 문제는 왜 해결된걸까
SELECT * FROM DBA_EXTENTS WHERE SEGMENT_NAME = '테이블명';
Segments는 여러 Extents가 모여진 단위라고 했다.
저장할 공간이 부족하면 새로운 Segments를 할당받는게 아닌 새로운 Extents를 할당받는 것
위 쿼리를 조회해보면 Extents가 저장되고 있는 dbf
파일을 알 수 있었다.
새롭게 생성한 파일의 경로가 생겨난걸 확인할 수 있었다.
CLOB
컬럼은 테이블 별로 Segments가 생겨난다고 한다
다른 테이블은 이미 할당 받는 Extents 공간에 여유가 있어서 문제가 발행하지 않았지만 새롭게 할당을 받을려면 동일한 문제가 발생했을 것 같다.
데이터 블록 출처
테이블 스페이스 출처
논리적/물리적 구조의 이해
테이블 컬럼 설명