表領域にはオーナが存在します。オーナー(ユーザ)がクラスタ全体で共通であるように表領域についてもクラスタ全体で共通です。(クラスタ内DB何れからも利用できます)またクラスタ内データベースはそれぞれデフォルト表領域を一つ持ち、対象データベースにて各オブジェクトの作成時に表領域を省略するとデフォルト表領域に作成されます。
表領域一覧出力SQL
pg_catalog.pg_tablespaceシステムカタログにて確認ができます。pg_tablespace_location()にoidを渡すことで対象フォルダを取得できます。
select t.spcname as tablespace_name ,pg_catalog.pg_get_userbyid(t.spcowner) as owner ,pg_catalog.pg_tablespace_location(t.oid) as location ,pg_catalog.pg_size_pretty(pg_catalog.pg_tablespace_size(oid)) AS Size from pg_catalog.pg_tablespace t order by t.oid;
表領域一覧出力例
tablespace_name | owner | location | size
-----------------+----------+-----------------------------+----------
pg_default | postgres | | 32 MB
pg_global | postgres | | 575 kB
tbspc_01 | sooni | /var/lib/pgsql/pgdata/spc01 | 8317 kB
tbspc_02 | udonman | /var/lib/pgsql/pgdata/spc02 | 19 bytes
(4 rows)
postgres=# show data_directory;
data_directory
------------------------
/var/lib/pgsql/13/data
(1 row)
postgres=#
pg_defaultとpg_globalテーブル空間(表領域)は初期化タイミングで作成されています
データベースクラスタが初期化されるタイミングでpg_defaultとpg_globalテーブル空間(表領域)が作成されます。pg_globalはシステムカタログ用、pg_defaultは初期化タイミングで作成されるデータベース(postgres、template0、template1)用になっています。(テンプレートデータベースのデフォルト表領域がpg_defaultになっているので、新規にデータベースを作成する際表領域の割り当てを指定しない限りpg_defaultが採用されます。以下はデータベースを作成する際表領域(tbspc_02)を割り当てる例です。
create database soodb tablespace = tbspc_02;
デフォルト表領域を指定してデータベースを作成する例
-- データベース作成前
datname | owner | pg_encoding_to_char | spcname | Location | Access privileges
-----------+----------+---------------------+------------+-----------------------------+-----------------------
template1 | postgres | UTF8 | pg_default | | =c/postgres +
| | | | | postgres=CTc/postgres
template0 | postgres | UTF8 | pg_default | | =c/postgres +
| | | | | postgres=CTc/postgres
postgres | postgres | UTF8 | pg_default | |
myposdb | sooni | UTF8 | pg_default | | =Tc/sooni +
| | | | | sooni=CTc/sooni
prdb | sooni | UTF8 | tbspc_01 | /var/lib/pgsql/pgdata/spc01 |
(5 rows)
-- 表領域を指定しデータベース作成
postgres=# create database soodb tablespace = tbspc_02;
CREATE DATABASE
-- 再度確認
postgres=# select d.datname,u.usename as owner,pg_encoding_to_char(d.encoding),s.spcname
postgres-# ,pg_tablespace_location(d.dattablespace) as "Location"
postgres-# ,pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
postgres-# from pg_database d inner join pg_user u on d.datdba = u.usesysid
postgres-# left outer join pg_tablespace s on d.dattablespace = s.oid
postgres-# order by d.oid;
datname | owner | pg_encoding_to_char | spcname | Location | Access privileges
-----------+----------+---------------------+------------+-----------------------------+-----------------------
template1 | postgres | UTF8 | pg_default | | =c/postgres +
| | | | | postgres=CTc/postgres
template0 | postgres | UTF8 | pg_default | | =c/postgres +
| | | | | postgres=CTc/postgres
postgres | postgres | UTF8 | pg_default | |
myposdb | sooni | UTF8 | pg_default | | =Tc/sooni +
| | | | | sooni=CTc/sooni
prdb | sooni | UTF8 | tbspc_01 | /var/lib/pgsql/pgdata/spc01 |
soodb | postgres | UTF8 | tbspc_02 | /var/lib/pgsql/pgdata/spc02 |
(6 rows)
postgres=#
psqlメタコマンドでの一覧
\db[+]
表領域一覧出力例
postgres=# \db[+]
List of tablespaces
Name | Owner | Location | Access privileges | Options | Size | Description
------------+----------+-----------------------------+-------------------+---------+----------+-------------
pg_default | postgres | | | | 32 MB |
pg_global | postgres | | | | 575 kB |
tbspc_01 | sooni | /var/lib/pgsql/pgdata/spc01 | | | 8317 kB |
tbspc_02 | udonman | /var/lib/pgsql/pgdata/spc02 | | | 19 bytes |