PostgreSQL, base 폴더 숫자 파일들 의미

PostgreSQL은 base라는 디렉토리에 실질적인 데이터를 저장합니다. base 디렉토리에는 또 각각의 숫자로 된 하위 디렉토리가 있는데, 그 숫자의 의미는 데이터베이스의 OID(Object ID)입니다. PostgreSQL이 데이터베이스를 구분하는 데 사용됩니다.

PostgreSQL base 디렉토리

PostgreSQL base 디렉토리에 있는 숫자 파일들은 PostgreSQL의 테이블과 인덱스를 저장하는 데이터 파일들입니다. 각 파일은 PostgreSQL 페이지라는 단위로 구성됩니다. 파일들은 확장자도 없이 숫자로만 되어 있기 때문에 처음 보면 이게 무슨 의미인가 싶을 수 있지만, 그 숫자들은 PostgreSQL가 자동으로 생성하는 객체를 식별하는 숫자일 뿐이니 사용자에게 어떤 의미가 있는 것은 아닙니다.

 

리눅스에서는 /var/lib/pgsql/12/data/base 디렉토리에 파일들이 저장됩니다. 해당 경로에서 하위 경로를 조회해보면 OID로 만들어진 디렉토리 하위로 또 다른 OID로 이름 지어진 파일들이 많이 존재하는 것을 볼 수 있습니다.

[root@localhost base]# pwd
/var/lib/pgsql/12/data/base
[root@localhost base]# ls *

 

base 디렉토리 파일들

 

PostgreSQL이 트랜잭션을 처리하면서 데이터를 읽고 쓰면 관련된 데이터 파일들에 실시간으로 I/O가 발생합니다. 예를 들어, 데이터를 조회하거나 수정하는 쿼리를 실행하면 PostgreSQL은 필요한 페이지를 디스크에서 메모리로 로드하고, 필요에 따라 페이지를 디스크로 다시 쓰게 됩니다.

 

이러한 OID는 PostgreSQL에서 쿼리를 통해 pg_class를 조회하면 확인할 수 있습니다.

SELECT oid, relname FROM pg_class;

 

oid 조회하는 쿼리

 

세부 파일 유형들

  • _fsm (Free Space Map) : 이 파일은 PostgreSQL이 테이블 내의 빈 공간을 추적하는 데 사용합니다. 데이터가 삭제되거나 업데이트될 때, 해당 데이터가 차지하던 공간은 이후의 INSERT 또는 UPDATE 연산에서 재사용될 수 있습니다. Free Space Map은 이런 빈 공간을 추적하고 관리하는 데 사용되는 정보를 담고 있습니다.
  • _vm(Visibility Map) : 이 파일은 테이블의 각 페이지에 대해 모든 트랜잭션이 해당 페이지를 볼 수 있는지에 대한 정보를 저장합니다. 이 정보는 PostgreSQL의 Vacuum 과정에서 중요한 역할을 합니다. Vacuum 과정은 시스템이 테이블 내의 사용되지 않는 데이터를 정리하는 과정입니다.
  • pg_filenode.map : 이 파일은 테이블 또는 인덱스의 파일 노드 번호와 해당 객체의 OID를 매핑합니다.
  • pg_internal.init : 이 파일은 PostgreSQL이 테이블의 각 페이지에 대한 초기화 정보를 저장하는 데 사용합니다. 여기에는 페이지 체크섬, 트랜잭션 상태 등의 정보가 포함될 수 있습니다.
  • PG_VERSION : 이 파일은 해당 데이터베이스 디렉토리의 PostgreSQL 버전을 포함합니다. 이 파일은 단순한 텍스트 파일입니다. 열어보면 PostgreSQL의 버전이 숫자로 들어가 있습니다.

 

base 파일 삭제해도 될까?

base 디렉토리에 있는 파일들은 PostgreSQL이 자동으로 관리합니다. 사용자가 직접 접근해서 수정하면 안 됩니다. 데이터베이스 파일이기 때문에 파일 손상 시 타격이 클 수 있습니다.

 

그럼에도 디스크 용량 부족으로 base 파일 정리가 필요하다면 PostgreSQL 자체에서 DELETE나 TRUNCATE 쿼리를 통해 불필요한 테이블이나 레코드를 삭제합니다. 다만 이렇게 해도 이미 base에 만들어진 데이터베이스 용량이 디스크에서 줄어드지는 않습니다. 디스크 크기까지 줄여야 할 땐 VACUUM 등을 이용해야 합니다. 이것에 대해선 다른 글에서 다뤄보도록 하겠습니다.

반응형

댓글

Designed by JB FACTORY