문서유형ㅣ기술정보
분야ㅣ관리/환경설정
적용제품버전ㅣOpenSQL 3
문서번호ㅣOADT002
본 문서는 postgresql을 기반으로한 opensql 기술 문서입니다.
개요
관리자는 테이블 스페이스를 사용하여 PostgreSQL 설치의 디스크 레이웃을 제어할 수 있습니다.
- 클러스터가 초기화된 파티션이나 볼륨에 공간이 부족해 확장이 불가능한 경우, 다른 파티션에 테이블스페이스를 생성해 시스템이 재구성될 때까지 사용할 수 있습니다.
- 테이블스페이스를 통해 관리자는 고성능 디스크를 배치하여 작업이 많은 테이블이나 인덱스 등을 해당 디스크에 적용하여 성능을 높힐 수 있고, 거의 사용되지 않는 데이터는 낮은 성능의 디스크에 저장할 수도 있습니다.
본 문서에서는 OpenSQL에서 테이블 스페이스를 사용하는 방법을 안내합니다.
방법
설치
테이블스페이스를 정의하려면 CREATE TABLESPACE 커맨드를 사용합니다.
CREATE TABLESPACEtablespace_name
[ OWNER {new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER } ]
LOCATION 'directory'
[ WITH (tablespace_option =value [, ... ] ) ]
CREATE TABLESPACE fastspace LOCATION '/ssd1/postgresql/data';
파라미터
*tablespace_name*
- 생성할 테이블스페이스의 이름입니다.
이름은 pg_ 로 시작할 수 없습니다. (시스템 테이블스페이스용 예약)
*user_name*
- 테이블스페이스를 소유할 롤의 이름입니다.
- 생략하면 기본값은 명령을 실행하는 롤입니다.
- 슈퍼유저만 테이블스페이스를 생성할 수 있습니다.
슈퍼유저가 아닌 롤에게 테이블스페이스 소유권을 할당할 수 있습니다.
*directory*
- 테이블스페이스에 사용될 디렉토리입니다.
- CREATE TABLESPACE 명령어는 디렉토리를 생성하진 않습니다.
- 디렉토리는 비어 있어야하며 PostgreSQL 시스템 유저가 소유해야 합니다.
절대 경로로 지정되어야 합니다.
*tablespace_option*
- 설정하거나 재설정할 테이블스페이스 파라미터입니다.
- 현재 사용할 수 있는 파라미터는 ‘seq_page_cost’, ‘random_page_cost’,’effective_io_concurrency’,’maintenance_io_concurrency’ 입니다.
- 위와 같은 값을 설정하면 테이블에서 페이지를 읽는 비용에 대한 플래너의 일반적인 추정을 무시합니다.
- 파라미터에 설정된 값에 의해 익스큐터의 프리패치 동작이 이루어집니다.
생성 예시
Single
아래는 생성 예시입니다.
- 테이블스페이스
dbspace를 파일 시스템 경로인/data/dbs에 생성하려면,
먼저 운영 체제 기능을 사용하여 디렉토리를 생성하고 소유권을 설정합니다.
mkdir /data/dbs chown postgres:postgres /data/dbs
- 그 후, PostgreSQL 내에서 테이블스페이스 생성 명령을 실행합니다.
CREATE TABLESPACE dbspace LOCATION '/data/dbs';
다른 데이터베이스 롤이 소유할 테이블 스페이스를 생성하려면 다음과 같은 명령을 사용합니다.
CREATE TABLESPACE indexspace OWNER genevieve LOCATION '/data/indexes';
- LOCATION은 PostgreSQL 를 사용하는 OS 유저가 소유한 기존의 빈 디렉토리여야 합니다.
- 테이블스페이스 내에서 이후에 생성된 모든 오브젝트는 해당 디렉토리 아래 파일에 저장됩니다.
- 테이블스페이스에 디렉토리를 할당하고 나면 디스크 용량을 제한 없이 사용하게 됩니다.
- 테이블스페이스 생성 자체는 데이터베이스 슈퍼유저로 수행하며 이후에는 CREATE 권한을 부여해 일반 유저의 사용을 허용할 수 있습니다.
Streaming Replication
Streaming Replication 에서 생성 예시입니다.
Streaming Replication 환경은 Active 및 Standby 환경 모두 위와 같이 디스크 할당(디렉토리 구조)과 PostgreSQL 사용 OS 유저에게 권한이 부여되어야 하며, Active 서버에서 CREATE TABLESPACE 수행 시 생성할 수 있습니다.
- 테이블스페이스
dbspace를 파일 시스템 경로인/data/dbs에 생성하려면, 먼저 운영 체제 기능을 사용하여 디렉토리를 생성하고 소유권을 설정합니다. 양쪽 서버 모두 수행해주어야 합니다.
# Active 서버에서 수행 mkdir /data/dbs chown postgres:postgres /data/dbs # Standby 서버에서 수행 mkdir /data/dbs chown postgres:postgres /data/dbs
- 그 후, Active 서버 내에서 테이블스페이스 생성 명령을 실행합니다.
CREATE TABLESPACE dbspace LOCATION '/data/dbs';
- 정상적으로 테이블스페이스 생성이 완료되었는지 확인합니다.
\db+ 명령어를 통해 테이블스페이스 리스트와 용량 등을 확인할 수 있습니다.
postgres=# \\db+
테이블스페이스 목록
이름 | 소유주 | 위치 | 액세스 권한 | 옵션 | 크기
| 설명
------------+----------+--------------------+-------------+------+--------
-+------
pg_default | postgres | | | | 485 MB
|
pg_global | postgres | | | | 560 kB
|
dbspace | postgres | /data/dbs | | | 0 bytes
|
(3개 행)
아래와 같이 테이블, 인덱스 및 전체 데이터베이스를 특정 테이블스페이스에 할당할 수 있습니다.
CREATE TABLE foo(i int) TABLESPACE dbspace; CREATE DATABASE test1 TABLESPACE dbspace;
또는 default_tablespace 파라미터를 사용합니다.
SET default_tablespace = space1; CREATE TABLE foo(i int);
테이블 스페이스 전체 용량을 확인합니다. ( 위에서 수행한 \db+ 명령어로도 확인 가능)
-- psql -c "select spcname, pg_size_pretty(pg_tablespace_size(spcname)) from pg_tablespace;" [postgres@localhost:~]$ psql -c "select spcname, pg_size_pretty(pg_tablespace_size(spcname)) from pg_tablespace;" spcname | pg_size_pretty ------------+---------------- pg_default | 485 MB pg_global | 560 kB dbspace | 8777 kB (3개 행)
- 생성된 테이블스페이스는 유저에게 권한이 있다면 모든 데이터베이스에서 사용할 수 있습니다.
- 테이블스페이스를 사용하는 모든 데이터베이스의 모든 개체가 제거될 때까지 테이블스페이스를 삭제할 수 없습니다.
- 테이블스페이스는 구현을 단순화하기 위해 심볼릭 링크를 사용합니다. 즉, 심볼릭 링크를 지원하는 시스템에서만 사용할 수 있습니다.
주의
기본 PostgreSQL 데이터 디렉토리 외부에 위치하더라도 테이블스페이스는 데이터베이스 클러스터에 포함된 메타데이터에 의존하므로 다른 데이터베이스 클러스터에 연결하거나 개별적으로 백업할 수 없습니다.
마찬가지로 테이블스페이스의 파일 삭제, 디스크 오류 등이 발생하면 데이터베이스 클러스터를 읽을 수 없거나 시작이 불가능할 수 있습니다.
RAM 과 같은 임시 파일 시스템에 테이블스페이스를 배치하면 안정성이 위험해집니다.
Active 서버에서만 디렉토리를 생성하고 테이블스페이스를 생성하는 경우
Standby 서버에서는 테이블스페이스를 생성하지 못해 테이블스페이스용 디렉토리를 생성해야한다는
로그와 함께 Standby 서버는 종료됩니다.
본 문서는 postgresql을 기반으로한 opensql 기술 문서입니다.