데이터베이스 연구실.log

테이블스페이스와 데이터파일

영구, UNDO, 임시 테이블스페이스와 데이터 파일, 빅파일과 스몰파일 및 기본 영구 테이블스페이스 설정

TABLESPACEDATAFILEBIGFILESMALLFILEDEFAULT TABLESPACEORA-32771ORA-00959

#핵심 요약

테이블스페이스는 스키마 객체를 담는 공간의 할당 단위임
영구, 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

#현재 컨테이너와 테이블스페이스, 데이터 파일 확인

SQL*Plus (SYSDBA)조회만 함
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로 나왔음

#영구 테이블스페이스 생성과 사용

SQL*Plus (SYSDBA, 대상 PDB)객체 또는 설정을 변경함
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;

결과 해석:

#빅파일 생성과 데이터 파일 추가 실패

SQL*Plus (SYSDBA, 대상 PDB)객체 또는 설정을 변경함
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';
SQL*Plus (SYSDBA, 대상 PDB)객체 또는 설정을 변경함
ALTER TABLESPACE big_tbs
  ADD DATAFILE '<DATAFILE_DIR>/big02.dbf' SIZE 10M;

결과 해석:

실습에서는 위 명령이 ORA-32771: cannot add file to bigfile tablespace로 실패하는 것이 정상이라고 적었음
첫 조회의 AUTOEXTENSIBLE은 YES로 나온다고 적었음

#스몰파일에서 세그먼트가 여러 파일에 놓이는지 확인

SQL*Plus (SYSDBA, 대상 PDB)객체 또는 설정을 변경함
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;
/
SQL*Plus (SYSDBA, 대상 PDB)조회만 함
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가 되는데, 실습에서는 소유자를 샘플 계정으로 조회함
실행 계정은 기재 없음

SQL*Plus (SYSDBA, 대상 PDB)데이터 또는 파일을 삭제함, 되돌릴 수 없음
DROP TABLESPACE big_tbs   INCLUDING CONTENTS AND DATAFILES;
DROP TABLESPACE small_tbs INCLUDING CONTENTS AND DATAFILES;

결과 해석: 개별 실행 출력은 기재 없음

#기본 영구 테이블스페이스 확인과 변경

SQL*Plus (SYSDBA, 대상 PDB)조회만 함
SELECT property_name, property_value
  FROM database_properties
 WHERE property_name LIKE 'DEFAULT_%TABLE%';

결과 해석:

실습 기록: DEFAULT_PERMANENT_TABLESPACE는 USERS, DEFAULT_TEMP_TABLESPACE는 TEMP였음

SQL*Plus (SYSDBA, 대상 PDB)객체 또는 설정을 변경함
CREATE TABLESPACE default_test
  DATAFILE '<DATAFILE_DIR>/default_test01.dbf' SIZE 5M;

ALTER PLUGGABLE DATABASE DEFAULT TABLESPACE default_test;

결과 해석:

실습 기록: 변경 뒤 DEFAULT_PERMANENT_TABLESPACE가 DEFAULT_TEST로 바뀌었음
아래로 되돌리고 정리했음

SQL*Plus (SYSDBA, 대상 PDB)데이터 또는 파일을 삭제함, 되돌릴 수 없음
ALTER PLUGGABLE DATABASE DEFAULT TABLESPACE users;
DROP TABLESPACE default_test INCLUDING CONTENTS AND DATAFILES;

결과 해석: 개별 실행 출력은 기재 없음

#사용 조건과 주의사항

기본 테이블스페이스로 지정된 것과 그곳에 공간을 쓸 권리(Quota)는 별개임
Quota와 ORA-01536은 Quota와 공간 사용 권한에 있음

UNDO 테이블스페이스 생성과 전환은 UNDO 공간과 보존, 임시 테이블스페이스는 TEMP 테이블스페이스, 상태 변경과 삭제는 테이블스페이스 운영에서 다룸

실습의 PDB 이름 표기가 실습마다 다름

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기