[PostgreSQL] PostgreSQL Data Directory 구조

참고

개요

  • 현재 PostgreSQL 은 docker-compose.yml 파일을 작성하여 docker compose 로 관리하고 있습니다.
version: '3.4'

services:
    postgres:
        image: postgres
        container_name: postgres
        environment:
            - POSTGRES_USER=test
            - POSTGRES_PASSWORD=system
            - POSTGRES_DB=abc
        ports:
            - '5432:5432'
        volumes:
            - D:/postgresql/data/:/var/lib/postgresql/data
  • 위 내용에서 volumes:- D:/postgresql/data/:/var/lib/postgresql/data 라고 하여 볼륨 마운트를 지정한 것을 확인할 수 있습니다.
  • var/lib/postgresql/data 디렉터리 안에는 다양한 Data 관련 디렉터리가 있는데, PostgreSQL Data Directory들이 무엇을 의미하는지 조사 진행하였습니다.

Data 디렉터리 구조

  • PostgreSQL Data 디렉터리에는 다음과 같이 다양한 폴더와 파일들이 있습니다.

  • 각 디렉터리 구조가 무엇을 의미하는지 하나씩 정리해 보았습니다.

global

  • 데이터베이스 전체의 정보를 가지고 있는 경로 입니다.
  • global 디렉터리에는 크게 4가지가 있습니다.
    • pg_interneral.init, pg_filenode.map
      • DB 내에 존재하는 객체 속성들과 실제 해당 객체 정보, 데이터를 가진 파일과의 맵핑 정보가 저장
    • pg_control
      • DB를 운영하면서 생성 및 관리가 필요한 정보들(ex. 버전, 트랜잭션, 체크포인트, 데이터블록 크기, 트랜잭션 로그 크기 등) 에 대한 모든 정보들을 가지고 있는 파일입니다. ORACLE 의 control 파일과 유사한 기능을 담당합니다.
    • 기타 숫자 파일들
      • DB 에 존재하는 모든 전역 객체 (PostgreSQL 내부에서 구성된 모든 DB 들이 공용으로 사용하는 정보) 정보를 가지고 있습니다. 전역 객체에는 테이블스페이스, 데이터베이스, DB 사용자, role 등이 있습니다.

Base

  • 데이터베이스내에 있는 테이블등의 객체 및 데이터등의 모든 자료들이 저장되는 공간입니다.
  • 저장구조는 /base/(database_oid)/(object_id) 순서로 구성됩니다.

  • 또한, 디렉터리 최 하단으로 들어가게 되면, vm, fsm 파일이 나와있는 경우가 있는데 이는 각 객체(테이블) 에 대해서 vacuum 이 끝났을 때 만들어 집니다.

  • 2개의 파일 설명은 다음과 같습니다.

    • fsm : free space map 의 약자로써, 해당 객체가 가지고 있는 빈 공간 블록을 가지고 있습니다. 차후, vacuum 및 빠른 데이터 조작을 하기 위해 DB 가 참조하는 파일입니다.
    • vm : visibility map 의 약자로써, 실제 사용하는 자료의 정보만 가지고 있습니다. 자료 조회시 사용하는 실행 계획 중 full sequence scan을 수행할 때 사용합니다.
  • 그 이외에 임시 테이블은 파일 명 앞에 t_ 접두사가 붙어서 생성되며, 사용 후에는 자동 삭제 됩니다.

pg_tblspc

  • 테이블스페이스 정보를 보관하는 공간으로써 데이터베이트 영역의 파일, 데이터들을 보관하는 공간이라는 측면세어 다른 RDBMS와 수행하는 기능이 유사합니다.
  • 단, 테이블스페이스와 객체간의 관계가 종속 관계인 ORACLE 과는 달리, PostgreSQL / PPAS 에서는 독립관계이며 (즉, 테이블스페이스에 무조건 정보들을 보관할 필요가 없다.), 주 기능은 기존 DB 의 data 영역 공간이 부족 시, 타 OS 파티션 영역을 DB 보관 공간으로 사용할 수 있도록 구성을 해 주는 것입니다.

pg_wal

  • PostgreSQL / PPAS 10 버전 이전에는 pg_xlog wlog 지만, 그 이후 버전에서는 pg_wal 로 변경되었습니다.
  • 타 RDBMS 에서 사용하는 Redo 로그 파일의 개념인 WAL 파일들을 보관하는 공간입니다.
  • DB가 비정상 종료되어 기록중이던 데이터들을 디스크에 쓰지 못했을 때, 복구하는 용도로 쓰는것이 1순위 기능이며 PostgreSQL / PPAS 에서는 이를 사용하여 replication 을 겁니다.
  • 보통 생각하는 ORACLE Redo 로그 파일 순환과 다른 점이 있는데 PostgreSQL / PPAS 에서는 pg_wal 파일을 지속적으로 만들어서 쌓아 두다가 변경 데이터들을 메모리에서 디스크에 써내리는 checkpoint 가 일어나면 해당 시점 이전의 파일들을 삭제합니다.
  • 그래서 이러한 삭제 파일들도 보관하여 나중에 필요 시 복구 때 쓸수 있도록 설정하는 것이 archive 입니다.
  • ORACLE 과 동일하게 archive 는 기본 설정이 OFF 이므로, 운영 서버에서는 필수로 설정을 해줘야 합니다.

pg_log

  • 데이터베이스 운영중에 발생하는 특이사항들을 모두 기록하는 파일들을 보관하는 영역입니다.
  • 단, 이 영역은 archive 와 같이 기본 구성이 아니라서 디렉터리 생성 및 conf 파일에서 on 설정을 해줘야 합니다.

status directories(트랜잭션 상태 보관 디렉터리)

  • 해당 디렉터리들은 운영중인 DB 에서 트랜잭션들의 진행 상태 및 commit 여부 등의 정보를 보관하는 공간입니다.
  • 대표적인 디텍러리들은 다음과 같습니다.
    • pg_xact : 2비트 단위로 트랜잭션이 커밋중인지, 아직 트랜잭션 진행중인지에 대한 상태값을 2비트로 보관하는 공강빈다. 파일 한 개당 약 100만개의 보관이 가능하며 최대 트랜잭션 보관 상한은 autovacuum_freeze_max_age 파라미터 값에 따릅니다.
    • pg_multixact : DB lock 중 shared row lock 처리를 위해서 이 lock 에 연관되는 트랜잭션들의 상태값을 보관합니다.
    • pg_serial : DB 격리 level 중 serializable 과 연관되는 트랜잭션들의 상태값을 보관합니다.
    • pg_subtrans : DB 처리 중, begin -> commit 혹은 rollback 을 사용하는 트랜잭션들의 상태값을 보관합니다.
    • pg_twophase : PostgreSQL / PPAS 는 ORACLE 과 다르게 shared pool 과 같은 공용 SQL 실행 계획을 보관하는 공간이 없어서 각 세션별로 실행 계획을 세워야 합니다. 이는 자주 수행되는 트랜 잭션들도 매번 실행 계획을 세워야 하는 건데 이건 매우 비 효율 적입니다. 그래서 PREPARE 명령어로 특정 트랜잭션들의 실행 계획을 보관 할 수가 있는데, 이 때 해당 디렉터리로 해당 PREPARE 된 트랜잭션들의 실행계획을 보관하는 공간입니다.
    • pg_snaphots : Database 에서는 격리성이나 특정 lock 등의 이유로 데이터가 변경되기 이전의 상태값을 보관해서 데이터를 변경중인 클라이언트 이외에 데이터를 조회해야 하는 클라이언트가 변경 전의 데이터 상태 값을 볼 수 있도록 해주는 것이 중요합니다. 이때 데이터의 특정 상태값을 snapshot 으로 보관하게 되는데, 이 때 이 snapshot 들을 보관하는 디렉터리입니다.

configuration files (설정 파일)

  • DB의 설정값들을 변경하기 위해 사용하는 파일들입니다.
  • 대표적인 파일은 전역 파라미터 설정 파일인 postgresql.conf, 유저 및 서버별 접근 허용 파일인 pg_hba.conf 가 있습니다.

postmaster info files

  • DB 기동 시, 같이 기동되는 PostgreSQL / PPAS 의 핵심 프로세스인 postmaster 프로세스 정보를 가지고 있는 파일입니다. (postmaster.opts, postmaster.pid)
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY