테이블스페이스와 데이터파일
영구, UNDO, 임시 테이블스페이스와 데이터 파일, 빅파일과 스몰파일 및 기본 영구 테이블스페이스 설정
#핵심 요약
테이블스페이스는 스키마 객체를 담는 공간의 할당 단위임
영구, UNDO, 임시 세 종류가 있음
영구 테이블스페이스는 데이터 파일에 저장됨
UNDO 테이블스페이스는 영구 테이블스페이스의 한 종류임
임시 테이블스페이스는 데이터 파일이 아니라 임시 파일(temp file)에 저장됨
스몰파일(기본값)은 데이터 파일을 여러 개 가질 수 있음
빅파일은 데이터 파일 하나만 가지는 대신 그 파일이 매우 커질 수 있음
8K 블록이면 32TB, 32K 블록이면 128TB까지임
세그먼트는 같은 테이블스페이스 안에서 여러 데이터 파일에 걸칠 수 있지만, 테이블스페이스를 넘지는 못함
기본 영구 테이블스페이스는 컨테이너마다 따로 정함
CDB 루트에서 ALTER DATABASE로 바꿔도 PDB에는 영향이 없음
#개념과 동작 원리
#세 종류의 테이블스페이스
| 종류 | 저장 파일 | 담는 것 | CDB에서 만드는 곳 |
|---|---|---|---|
| 영구(PERMANENT) | 데이터 파일 | 계속 유지되는 스키마 객체 | 사용자 데이터는 PDB 루트에 만들면 PDB 사용자가 쓰지 못함 |
| UNDO | 데이터 파일 | 자동 UNDO 관리 모드의 UNDO 데이터 | LOCAL_UNDO_ENABLED가 TRUE면 PDB, FALSE면 루트 것을 공유 |
| 임시(TEMPORARY) | 임시 파일 | 세션 동안만 필요한 객체 | PDB 컨테이너별로 독립 |
테이블스페이스를 만들려면 데이터베이스가 열려 있어야 하고 CREATE TABLESPACE 시스템 권한이 필요함
SYSAUX 테이블스페이스를 만들 때는 SYSDBA 권한이 필요함
#계층 구조
블록, 익스텐트, 세그먼트에서 단위별 정의를 다룸
실습 그림 설명: 테이블스페이스 하나가 데이터 파일 두 개로 이루어지고, 160KB 세그먼트 하나가 80KB 익스텐트 두 개로 나뉘어 두 데이터 파일에 걸쳐 있음
80KB 익스텐트 하나는 8KB 블록 10개가 연속으로 모인 것임
#빅파일과 스몰파일
| 구분 | 스몰파일 | 빅파일 |
|---|---|---|
| 데이터 파일 수 | 여러 개 | 하나(최대 약 40억 블록) |
| 최대 파일 크기 | 상대적으로 제한됨 | 8K 블록 32TB, 32K 블록 128TB |
| 기본값 | 기본값 | CREATE BIGFILE TABLESPACE로 지정 |
| 공간을 늘리는 방법 | 파일 추가, 크기 조정 | 그 파일 하나의 크기 조정 또는 자동 확장 |
공식 문서: 데이터베이스 전체의 데이터 파일 수는 보통 64K개로 제한되므로, 빅파일은 저장 용량을 크게 늘리고 데이터 파일 수를 줄임
공식 문서: 데이터베이스 생성 때 기본 유형을 BIGFILE로 정했다면 CREATE SMALLFILE TABLESPACE로 스몰파일을 만듦
실습 해설은 스몰파일 테이블스페이스의 데이터 파일이 최대 1,022개라고 적었음
공식 문서(Oracle Database Reference 19c E96196-45, Physical Database Limits)는 운영체제에 따라 다르며 보통 1023개, 파일 하나는 약 4백만(2^22) 블록까지라고 적음
실습의 파일 구성 판단: 대용량 데이터 웨어하우스처럼 테이블스페이스 하나에 많은 데이터를 담고 파일 수를 줄이고 싶으면 빅파일, 여러 파일에 공간을 나누는 일반적인 경우에는 스몰파일(기본값)을 씀
#기본 영구 테이블스페이스
기본 테이블스페이스는 데이터베이스 자체의 속성임
CDB 루트의 기본 테이블스페이스는 루트에 접속해 ALTER DATABASE로 바꿈
PDB의 기본 영구 테이블스페이스에는 영향이 없음
PDB의 기본 테이블스페이스는 그 PDB에 접속해 ALTER PLUGGABLE DATABASE로 바꿈
PDB 안에서는 ALTER DATABASE도 같게 동작하며, 이는 non-CDB와의 하위 호환 때문임
설명: SYS 사용자로 테이블을 만들면 SYSTEM 테이블스페이스에 저장됨
이 실습 결과는 기재 없음
#필수 명령어 또는 SQL
#현재 컨테이너와 테이블스페이스, 데이터 파일 확인
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') AS con_name FROM dual;
SELECT tablespace_name, contents FROM dba_tablespaces;
SELECT tablespace_name, file_name FROM dba_data_files;결과 해석:
CONTENTS 열은 PERMANENT, UNDO, TEMPORARY로 종류를 보여 줌
실습 기록에는 SYSTEM, SYSAUX, USERS가 PERMANENT, UNDOTBS1이 UNDO, TEMP가 TEMPORARY로 나왔음
#영구 테이블스페이스 생성과 사용
ALTER SESSION SET CONTAINER = <PDB_NAME>;
CREATE TABLESPACE baesong
DATAFILE '<DATAFILE_DIR>/baesong01.dbf' SIZE 20M;
CREATE TABLE bs_tb1
( bae_id NUMBER(10),
bae_address VARCHAR2(100),
bae_date DATE,
bae_gisa_id NUMBER(10),
cust_id NUMBER(10) )
TABLESPACE baesong;결과 해석:
#빅파일 생성과 데이터 파일 추가 실패
CREATE BIGFILE TABLESPACE big_tbs
DATAFILE '<DATAFILE_DIR>/big01.dbf' SIZE 10M
AUTOEXTEND ON NEXT 10M MAXSIZE 100M;
SELECT file_name, autoextensible, maxbytes/1024/1024 AS max_mb
FROM dba_data_files
WHERE tablespace_name = 'BIG_TBS';ALTER TABLESPACE big_tbs
ADD DATAFILE '<DATAFILE_DIR>/big02.dbf' SIZE 10M;결과 해석:
실습에서는 위 명령이 ORA-32771: cannot add file to bigfile tablespace로 실패하는 것이 정상이라고 적었음
첫 조회의 AUTOEXTENSIBLE은 YES로 나온다고 적었음
#스몰파일에서 세그먼트가 여러 파일에 놓이는지 확인
CREATE TABLESPACE small_tbs
DATAFILE '<DATAFILE_DIR>/small01.dbf' SIZE 5M;
ALTER TABLESPACE small_tbs
ADD DATAFILE '<DATAFILE_DIR>/small02.dbf' SIZE 5M;
CREATE TABLE t_span (id NUMBER, pad CHAR(1000)) TABLESPACE small_tbs;
BEGIN
FOR i IN 1..1000 LOOP
INSERT INTO t_span VALUES (i, 'x');
END LOOP;
COMMIT;
END;
/SELECT file_id, COUNT(*) AS extent_cnt
FROM dba_extents
WHERE owner = '<USERNAME>' AND segment_name = 'T_SPAN'
GROUP BY file_id;결과 해석:
실습에서는 5MB 첫 파일을 넘도록 데이터를 넣고 FILE_ID가 몇 줄 나오는지 확인하라고만 적었음
결과는 기재 없음
바꿀 입력값: <USERNAME>
위 블록은 SYS로 실행하므로 테이블 소유자가 SYS가 되는데, 실습에서는 소유자를 샘플 계정으로 조회함
실행 계정은 기재 없음
DROP TABLESPACE big_tbs INCLUDING CONTENTS AND DATAFILES;
DROP TABLESPACE small_tbs INCLUDING CONTENTS AND DATAFILES;결과 해석: 개별 실행 출력은 기재 없음
#기본 영구 테이블스페이스 확인과 변경
SELECT property_name, property_value
FROM database_properties
WHERE property_name LIKE 'DEFAULT_%TABLE%';결과 해석:
실습 기록: DEFAULT_PERMANENT_TABLESPACE는 USERS, DEFAULT_TEMP_TABLESPACE는 TEMP였음
CREATE TABLESPACE default_test
DATAFILE '<DATAFILE_DIR>/default_test01.dbf' SIZE 5M;
ALTER PLUGGABLE DATABASE DEFAULT TABLESPACE default_test;결과 해석:
실습 기록: 변경 뒤 DEFAULT_PERMANENT_TABLESPACE가 DEFAULT_TEST로 바뀌었음
아래로 되돌리고 정리했음
ALTER PLUGGABLE DATABASE DEFAULT TABLESPACE users;
DROP TABLESPACE default_test INCLUDING CONTENTS AND DATAFILES;결과 해석: 개별 실행 출력은 기재 없음
#사용 조건과 주의사항
기본 테이블스페이스로 지정된 것과 그곳에 공간을 쓸 권리(Quota)는 별개임
Quota와 ORA-01536은 Quota와 공간 사용 권한에 있음
UNDO 테이블스페이스 생성과 전환은 UNDO 공간과 보존, 임시 테이블스페이스는 TEMP 테이블스페이스, 상태 변경과 삭제는 테이블스페이스 운영에서 다룸
실습의 PDB 이름 표기가 실습마다 다름