나의 잡다한 노트 및 메모

PostgreSQL tablespace 본문

DB/PostgreSQL

PostgreSQL tablespace

peanutwalnut 2025. 8. 22. 15:04

PostgreSQL에서 tablespace는 간단히 말하면 데이터 파일이 저장될 실제 물리적 위치(디스크 경로)를 논리적으로 이름 붙인 것

 

기본 개념

  • PostgreSQL은 모든 데이터(테이블, 인덱스, 시스템 카탈로그)를 파일로 디스크에 저장합니다.
  • 이때 그 파일들이 놓이는 디렉터리 경로를 추상화한 것이 tablespace입니다.
  • 따라서 tablespace는 "이 데이터는 어떤 디스크/경로에 저장해야 한다"를 PostgreSQL에게 알려주는 장치입니다.

 

기본 제공 tablespace

PostgreSQL을 설치하면 두 개의 tablespace가 기본 제공됩니다:

  1. pg_default
    • 일반적인 테이블/인덱스가 저장되는 기본 tablespace
    • 실제 경로는 PostgreSQL 데이터 디렉터리($PGDATA/base)입니다.
  2. pg_global
    • 클러스터 전체(global)에 공유되는 시스템 카탈로그 테이블이 저장되는 공간
    • 경로는 $PGDATA/global입니다.

 

사용하는 이유

  • 성능 최적화: 자주 쓰이는 테이블/인덱스를 빠른 SSD tablespace에, 덜 쓰이는 아카이브성 데이터는 느린 HDD tablespace에 저장.
  • 스토리지 관리: 특정 디스크의 공간이 부족하면 다른 디스크에 새로운 tablespace를 만들어 분산.
  • 운영 편의: 데이터베이스 크기가 커졌을 때, 테이블 단위로 디스크를 분리할 수 있음.

 

제약/주의사항

  • tablespace는 반드시 Postgres 서버 프로세스가 접근할 수 있는 로컬 디렉터리여야 합니다.
    (NFS 같은 네트워크 스토리지는 성능 문제/안정성 문제를 일으킬 수 있음.)
  • 데이터 파일 이동은 tablespace 간 이동 명령으로 해야 하며, 그냥 OS mv로 옮기면 안 됩니다.
  • replication/백업할 때 tablespace 경로도 함께 고려해야 합니다.

tablespace를 활용하면, 하나의 데이터베이스 안에서 데이터를 서로 다른 디스크(예: ssd1, ssd2)에 나눠 저장하고, 논리적으로는 하나의 DB처럼 접근할 수 있습니다.

 

  • database는 기본적으로 하나의 tablespace(pg_default)에 올라갑니다.
  • 하지만 테이블이나 인덱스 단위로 다른 tablespace를 지정할 수 있어요.

 

-- SSD1에 tablespace 생성
CREATE TABLESPACE fast1 LOCATION '/mnt/ssd1/pgdata';

-- SSD2에 tablespace 생성
CREATE TABLESPACE fast2 LOCATION '/mnt/ssd2/pgdata';

-- DB 생성 시 기본 tablespace는 fast1으로
CREATE DATABASE appdb TABLESPACE fast1;

\c appdb;

-- 특정 큰 테이블만 fast2에 저장
CREATE TABLE big_table (
    id serial, data text
) TABLESPACE fast2;

-- 나머지는 기본 fast1에 저장
CREATE TABLE normal_table (
    id serial, name text
);

 

 

이렇게 하면:

  • normal_table → fast1(=ssd1)에 저장
  • big_table → fast2(=ssd2)에 저장
  • 하지만 애플리케이션 입장에서는 둘 다 그냥 appdb 내의 테이블로 접근

주의할 점

  1. 자동 분산 아님
    • PostgreSQL이 알아서 "데이터를 ssd1/ssd2에 분산 저장"하지 않습니다.
    • DBA가 테이블/인덱스 생성할 때 직접 어떤 tablespace를 쓸지 지정해야 합니다.
  2. 데이터베이스 단위 vs 오브젝트 단위
    • CREATE DATABASE ... TABLESPACE fast1; → DB 기본 tablespace 지정
    • 하지만 일부 오브젝트를 다른 tablespace에 지정 가능 → 결과적으로 DB 오브젝트들이 여러 디스크에 걸쳐 저장될 수 있음
  3. 성능/운영 관리
    • 특정 테이블만 SSD로 보내고 나머지는 HDD에 두는 식의 스토리지 티어링 전략에 적합
    • 다만 파티셔닝이나 인덱스 배치를 병행해야 성능효과가 큼
  4. 백업/복구 시 tablespace 경로 고려 필요
    • tablespace는 PostgreSQL 클러스터 외부 경로를 가리킬 수 있으므로, 백업 도구(pg_basebackup 등) 사용 시 tablespace까지 같이 처리해야 합니다.

'DB > PostgreSQL' 카테고리의 다른 글

PostgreSQL 관리자(DBA)가 자주 쓰는 주요 테이블/뷰  (0) 2025.08.23
PostgreSQL Vacuum  (3) 2025.08.22
PostgreSQL Subscription  (0) 2025.08.20
PostgreSQL Replication slot  (0) 2025.08.20
PG의 2PC(2-Phase-Commit)  (4) 2025.08.11