22.6. Tablespaces

PostgreSQL의 테이블스페이스는 데이터베이스 관리자가 데이터베이스 객체를 나타내는 파일을 저장할 수 있는 파일 시스템의 위치를 정의할 수 있게 한다. 생성된 경우 테이블스페이스는 데이터베이스 객체 생성 시 이름으로 참조가 가능하다.

테이블스페이스를 사용함으로써 관리자는 PostgreSQL 설치의 디스크 레이아웃을 제어할 수 있다. 이것은 최소 2가지 방법으로 활용할 수 있다. 첫째, 클러스터가 초기화된 파티션 또는 볼륨 공간이 소진되고 확장이 불가능한 경우, 다른 파티션에 테이블스페이스를 생성하고 시스템이 재인식될 때까지 사용할 수 있다.

두 번째, 테이블스페이스는 관리자가 성능 최적화를 위해 데이터베이스 객체의 사용 패턴에 대한 지식을 사용할 수 있게 한다. 예를 들면, 사용이 빈번한 인덱스는 고가의 SSD 같은 고속, 고가용성 디스크에 배치할 수 있다. 또한, 거의 사용되지 않거나 성능이 중요하지 않은 아카이브 데이터가 저장된 테이블은 저속, 저가의 디스크 시스템에 저장할 수 있다.

주의

PostgreSQL 주 데이터 디렉터리 외부에 배치했더라도 테이블스페이스는 데이터베이스 클러스터 내부에 속해 있기 때문에 데이터 파일 자동 수집으로 처리되어서는 된다. 테이블스페이스는 주 데이터 디렉터리에 포함된 메타데이터에 종속적이므로 서로 다른 데이터베이스 클러스터에 연결되거나 개별적으로 백업할 수 없다. 마찬가지로, 테이블스페이스를 잃어버린 경우(파일 삭제, 디스크 오류 등), 데이터베이스 클러스터를 읽지 못하게 되거나 시작하지 못하게 될 수 있다. 램 디스크 같은 임시 파일 시스템에 테이블 스페이스를 배치하면 전체 클러스터의 신뢰도가 위험할 수 있다.

테이블스페이스를 정의하려면 CREATE TABLESPACE 명령을 사용해야 한다. 예를 들면,

CREATE TABLESPACE fastspace LOCATION '/ssd1/postgresql/data';

위치는 빈 디렉터리로 존재해야 하며, PostgreSQL 운영 체제 사용자가 소유한 것이어야 한다. 이후에 테이블스페이스 내부에서 생성된 모든 객체는 이 디렉터리 아래의 파일에 저장된다. 테이블스페이스가 누락 또는 분실된 경우 클러스터 작동이 실패할 수 있으므로 위치가 이동식 또는 임시 저장소여서는 안 된다.

참고

논리적 파일 시스템 내에서 개별 파일의 위치를 사용자가 제어할 수 없기 때문에 논리적 파일 시스템당 테이블스페이스를 2개 이상 만들 수 있는 지점이 일반적으로 많지 않다. 그러나, PostgreSQL은 강제로 제한하지 않으므로, 실제로는 시스템에서 파일 시스템 경계를 직접적으로 인식하지 못한다. 단지 사용자가 사용할 것으로 지정한 디렉터리에 파일을 저장하기만 한다.

테이블스페이스 자체는 데이터베이스 수퍼유저로 생성해야 하지만, 생성한 후에는 일반 데이터베이스 사용자가 이 데이터베이스를 사용하도록 할 수 있다. 이렇게 하려면 CREATE 권한을 부여해야 한다.

테이블 및 인덱스, 전체 데이터베이스는 특정 테이블스페이스에 할당될 수 있다. 이를 위해, 주어진 테이블스페이스에 대한 CREATE 권한이 있는 사용자는 테이블스페이스 이름을 해당 명령에 대한 매개 변수로 전달해야 한다. 예를 들면, 다음은 테이블스페이스 space1에서 테이블을 생성한다.

CREATE TABLE foo(i int) TABLESPACE space1;

또는 default_tablespace 매개 변수를 사용한다.

SET default_tablespace = space1;
CREATE TABLE foo(i int);

default_tablespace가 비어 있는 string 이외의 것으로 설정되면 이것은 명시적이지 않은 CREATE TABLECREATE INDEX 명령에 대한 암시적 TABLESPACE 절을 제공한다.

임시 테이블과 인덱스, 거대(large) 데이터 세트 정렬 같은 목적으로 사용되는 임시 파일의 배치를 결정하는 temp_tablespaces 매개 변수도 있다. 이것은 하나 이상의 테이블스페이스 이름 목록일 수 있으므로 임시 객체와 관련된 로드는 다수의 테이블스페이스로 퍼질 수 있다. 목록의 임의의 멤버는 임시 객체가 생성될 때마다 선택된다.

데이터베이스와 관련된 테이블스페이스는 해당 데이터베이스의 시스템 카탈로그를 저장하는 데 사용된다. 또한 TABLESPACE 절이 없거나, default_tablespace 또는 temp_tablespaces에 의해 지정된 다른 선택이 없는 경우 이것은 데이터베이스 내에서 생성된 테이블, 인덱스 및 임시 파일에 사용되는 기본 테이블스페이스이다(적절한 경우). 테이블스페이스를 지정하지 않고 데이터베이스를 생성하면, 복사했던 템플릿 데이터베이스와 동일한 테이블스페이스를 사용한다.

데이터베이스 클러스터가 초기화되면 테이블스페이스 2개가 자동으로 생성된다. pg_global 테이블스페이스는 공유 시스템 카탈로그에 사용된다. pg_default 테이블스페이스는 template1template0 데이터베이스의 기본 테이블스페이스이다(따라서, CREATE DATABASETABLESPACE 절로 덮어쓰지 않는 한, 다른 데이터베이스의 기본 테이블스페이스가 된다).

테이블스페이스가 생성되면 요청한 사용자에게 권한이 충분한 경우에는 모든 데이터베이스에서 사용할 수 있다. 이것은 테이블스페이스를 사용하는 모든 데이터베이스에서 모든 객체를 삭제하지 않는 한 테이블스페이스를 삭제할 수 없다는 것을 의미한다.

비어 있는 테이블스페이스를 삭제하려면 DROP TABLESPACE 명령을 사용해야 한다.

기존 테이블스페이스를 확인하려면 pg_tablespace 시스템 카탈로그를 검사해야 한다. 예를 들면,

SELECT spcname FROM pg_tablespace;

psql 프로그램의 \db 메타 명령도 기존 테이블스페이스를 나열할 때 유용하다.

PostgreSQL은 심볼릭 링크를 사용하여 테이블스페이스의 구현을 간략화한다. 이것은 심볼릭 링크가 지원되는 시스템에서 테이블스페이스를 사용할 수 있다는 것을 의미한다.

디렉터리 $PGDATA/pg_tblspc에는 클러스터에 저장된 비 내장 테이블스페이스 각각을 가리키는 심볼릭 링크가 포함되어 있다. 권장 사항은 아니지만, 이 링크를 재정의하여 테이블스페이스의 레이아웃을 조정할 수도 있다. 이 작업은 어떤 경우에서든 서버 실행 중에 해야 한다. PostgreSQL 9.1 이전 버전에서는 pg_tablespace 카탈로그를 새 위치로 업그레이드해야 한다. (그렇게 하지 않으면 pg_dump가 계속해서 이전 테이블스페이스 위치를 출력한다.)