[왜 TableSpaces 를 나눌까?]

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


[PostgreSQL 에서 테이블스페이스를 사용함으로써 'Disk Layout' 을 제어할 수 있게 된다.]

- 1. 클러스터가 초기화된 파티션 또는 볼륨 공간이 고갈되어 확장이 불가능한 경우, 다른 파티션에 테이블스페이스를 생성하고 시스템이 재인식될 때까지 사용할 수 있어진다.

 

- 2. 관리자가 성능 최적화를 위해 데이터베이스 객체의 사용 패턴에 대한 지식을 사용가능하게 한다.
ex. 사용이 빈번한 Index는 SSD 같은 속도가 빠르고 고가용성인 디스크에 할당할 수 있으며, 거의 사용되지 않거나 성능이 중요하지 않은 데이터가 저장된(되는) 테이블은 HDD에 할당할 수 있게 된다.



[pg_tblespc 의 역할]

 

테이블스페이스 생성을 위해 특정 폴더(디렉토리)를 만들고(지정하고) 테이블스페이스를 생성하게 되면, Data/pg_tblspc/[oid] 에 Sybolic Link가 걸리게 되며 해당 링크를 통해 디렉토리의 파일들을 조회할 수 있게 된다.

아래 그림을 보면 /opt/PostgreSQL/9.4/Data/base 디렉토리에 16628(oid) 라는 테이블스페이스가 Symbolic Link 가 걸리게 되는데, 실제 해당 링크는 /PostgreSQL/tblspace/ 이다.


ex)
[pg_tblspc]
C:\database\Postgresql\pgsql\Data\pg_tblspc\


테이블스페이스를 2개 생성하여 사용 중이며, 각각 밸런싱하여 데이터를 적재시키고 있다.
C:\onTune\database\Postgresql\pgsql\Data\pg_tblspc\456573\PG_15_202209061\16384


[실제 tablespace 경로]
C:\ontunedata1\PG_15_202209061\16384
C:\ontunedata2\PG_15_202209061\16384



[DB에 대한 OID 확인]

ontune=# select oid,datname from pg_database;
  oid  |  datname
-------+-----------
     5 | postgres
     1 | template1
     4 | template0
 16384 | ontune
(4개 행)


ontune=# \db
          테이블스페이스 목록
    이름     | 소유주 |      위치
-------------+--------+----------------
 ontunedata1 | ontune | C:\ontunedata1
 ontunedata2 | ontune | C:\ontunedata2
 pg_default  | ontune |
 pg_global   | ontune |
(4개 행)


ontune=# \list
                                       데이터베이스 목록
   이름    | 소유주 | 인코딩 | Collate | Ctype | ICU 로케일 | 로케일 제공자 |    액세스 권한
-----------+--------+--------+---------+-------+------------+---------------+-------------------
 ontune    | ontune | UTF8   | C       | C     |            | libc          | =Tc/ontune       +
           |        |        |         |       |            |               | ontune=CTc/ontune+
           |        |        |         |       |            |               | itsmusr=c/ontune
 postgres  | ontune | UTF8   | C       | C     |            | libc          |
 template0 | ontune | UTF8   | C       | C     |            | libc          | =c/ontune        +
           |        |        |         |       |            |               | ontune=CTc/ontune
 template1 | ontune | UTF8   | C       | C     |            | libc          | =c/ontune        +
           |        |        |         |       |            |               | ontune=CTc/ontune
(4개 행)

 




[테이블스페이스 생성 방법]

1. 디렉토리 생성
Windows : 테이블스페이스로 사용하길 원하는 디스크의 경로에 생성

Linux : 테이블스페이스로 사용하길 원하는 파일시스템에 생성
ㄴ mkdir -p /tablespace

2. 디렉토리 권한 부여

Linux : chown postgres /tablespace

3. 테이블스페이스 생성
LOCATION - 테이블스페이스 생성 경로를 지정
OWNER - 해당 테이블스페이스를 소유하는 DB 유저를 지정 (생략할 경우, 쿼리를 작성하는;현재 접속중인 계정의 소유물
로 된다. pg의 슈퍼유저만 테이블스페이스를 생성할 수 있지만, 권한을 부여받은 USER도 생성이 가능함)

여기서 생성이 안되면 해당 테이블스페이스의 디렉토리에 대한 권한이 없는 것임

CREATE TABLESPACE [테이블스페이스명] OWNER [DB사용자명] LOCATION '/tablespace';

 

[테이블스페이스 변경 방법]

1. 이름 변경

ALTER TABLESPACE [테이블스페이스명] RENAME TO [새로운 테이블스페이스명];

 

2. 소유자 변경 

ALTER TABLESPACE [테이블스페이스명] OWNER TO [새로운 사용자명];

 


[테이블스페이스 삭제 방법]

주의
* TABLESPACE 를 삭제해도, OS 내에 생성한 테이블스페이스 디렉토리는 없어지지 않음

* DB 객체가 있을 경우, 삭제되지 않음

DROP TABLESPACE [테이블스페이스명];

 

계속 까먹네;