postgresqlにおける表領域管理
3765 ワード
表領域はデータベースオブジェクトとして格納場所であり、データベースにとって論理概念であり、ファイルシステムの1つのディレクトリの下の複数のデータファイルからなる.ディレクトリはPGDATAの下に保存することはできないが、clusterの一部として、バックアップに必要な場合は一緒にバックアップする.
表領域の作成
pg_global–システム辞書表は に保存されています. pg_default–template 0、template 1のデフォルト表領域であるため、create databaseでtablespaceパラメータを持たずに作成されたデータベースは、この表領域 を使用します.
//END
表領域の作成
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つの表領域が作成されます
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
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つの表領域が作成されます
[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
Database cluster初期化時にデフォルトで2つの表領域が作成されます
//END