postgresqlにおける表領域管理


表領域はデータベースオブジェクトとして格納場所であり、データベースにとって論理概念であり、ファイルシステムの1つのディレクトリの下の複数のデータファイルからなる.ディレクトリはPGDATAの下に保存することはできないが、clusterの一部として、バックアップに必要な場合は一緒にバックアップする.

表領域の作成


superuserのみを使用して表領域を作成できます
postgres=# create tablespace ts01 location '/var/lib/pgsql/tsdata';
ERROR:  directory "/var/lib/pgsql/tsdata" does not exist
postgres=# \! mkdir -p /var/lib/pgsql/tsdata -- 
postgres=# create tablespace ts01 location '/var/lib/pgsql/tsdata';
CREATE TABLESPACE
postgres=# create tablespace ts02 owner hippo location '/var/lib/pgsql/tsdata'; -- 
ERROR:  directory "/var/lib/pgsql/tsdata/PG_9.4_201409291" already in use as a tablespace
postgres=# \! mkdir /var/lib/pgsql/tsdata02
postgres=# create tablespace ts02 owner hippo location '/var/lib/pgsql/tsdata02'; -- 
CREATE TABLESPACE

2つの方法で表示
postgres=# select * from pg_tablespace;
  spcname   | spcowner | spcacl | spcoptions 
------------+----------+--------+------------
 pg_default |       10 |        | 
 pg_global  |       10 |        | 
 ts01       |       10 |        | 
 ts02       |    16384 |        | 
(4 rows)

postgres=# \db
               List of tablespaces
    Name    |  Owner   |        Location         
------------+----------+-------------------------
 pg_default | postgres | 
 pg_global  | postgres | 
 ts01       | postgres | /var/lib/pgsql/tsdata
 ts02       | hippo    | /var/lib/pgsql/tsdata02
(4 rows)

表領域の使用

postgres=# \c database2 user2;
You are now connected to database "database2" as user "user2".
database2=> create table t1(id text);
CREATE TABLE

デフォルトはts 01に権限がありません
database2=> create table t2(id text) tablespace ts01;
ERROR:  permission denied for tablespace ts01
database2=> \c - postgres
You are now connected to database "database2" as user "postgres".
database2=# alter database database2 set tablespace ts01; -- 
ERROR:  cannot change the tablespace of the currently open database
database2=# \c postgres postgres
You are now connected to database "postgres" as user "postgres".

ts 01がdatabase 2のデフォルト表領域となる
postgres=# alter database database2 set tablespace ts01;
ALTER DATABASE
postgres=# \c database2 user2
You are now connected to database "database2" as user "user2".
database2=> create table t2(id text) tablespace ts01;
CREATE TABLE

ユーザーへの表領域権限の付与
postgres=# \c database2 user2;
You are now connected to database "database2" as user "user2".
database2=> create table t3(id text) tablespace ts02; -- ts02 
ERROR:  permission denied for tablespace ts02
database2=> \c postgres postgres
You are now connected to database "postgres" as user "postgres".
postgres=# grant create on tablespace ts02 to user2; -- 
GRANT
postgres=# \c database2 user2;
You are now connected to database "database2" as user "user2".
database2=> create table t3(id text) tablespace ts02;
CREATE TABLE

表領域対応ファイルシステム


PGDATA下のpg_tblspcディレクトリに格納されているのは表領域のリンクです
[postgres@fnddb pg_tblspc]$ pwd
/var/lib/pgsql/data/pg_tblspc
[postgres@fnddb pg_tblspc]$ ll
total 0
lrwxrwxrwx. 1 postgres postgres 21 Feb  6 22:52 16423 -> /var/lib/pgsql/tsdata
lrwxrwxrwx. 1 postgres postgres 23 Feb  6 23:04 16425 -> /var/lib/pgsql/tsdata02

clusterの初期化時にデフォルトの表領域の説明


Database cluster初期化時にデフォルトで2つの表領域が作成されます
  • pg_global–システム辞書表は
  • に保存されています.
  • pg_default–template 0、template 1のデフォルト表領域であるため、create databaseでtablespaceパラメータを持たずに作成されたデータベースは、この表領域
  • を使用します.
    //END