PostgreSQLスキルアップノート(自己啓発のための個人サイト)
テーブル空間(テーブルスペース)
【一覧に戻る】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■■■ PostgreSQL スキルアップノート
■■■■
■◆■■ テーブル空間(テーブルスペース)
■■■■
■■■■
■■■■ 2012/11/25
■■■■ 使用環境:PostgreSQL9.1.4 (CentOS6.2)
(C) 2012 ohdb
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
★自己都合により実機確認は9.1、マニュアルへのリンクは9.2としています。ご了承下さい。
【マニュアル】
・データベース管理−テーブル空間→●[マニュアル]
・CREATE TABLESPACE→●[マニュアル]
・システムカタログ−pg_tablespace→●[マニュアル]
・CREATE DATABASE→●[マニュアル]
・createdb→●[マニュアル]
・CREATE TABLE→●[マニュアル]
・ALTERE TABLE→●[マニュアル]
・GRANT→●[マニュアル]
【参考記事】
なし
■1■ ポイント
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
・テーブル空間はDBに依存しない。DBクラスタ内のどのDBからも使える。
・1つの論理ファイルシステムに1つのテーブル空間が原則。
領域のサイズなどを管理したりするわけではないので、
同じディスクに複数作成することは可能であるがあまりメリットはない。
・テーブル空間の作成はデータベーススーパーユーザで。
・作成したテーブル空間の中に一般ユーザがテーブルをcreateするためには「テーブル空間に対するcreate権限」が必要。
・クラスタ作成時に2つのテーブル空間が自動的に作成。
pg_global・・・・共有システムカタログ用。
pg_default ・・・template1とtemplate0データベースのデフォルトテーブル空間
・pg_から始まる名は使用禁止(システムのテーブル空間用)
・この機能はシンボリックリンクをサポートしているOSのみ。
デフォルトテーブル空間の負荷は高いので異なるディスクにテーブル空間を作成し、
そこに業務のテーブルなどを置くように物理設計をする。
■2■ テーブル空間(テーブルスペース)の作り方
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1.準備
──────────────────────────────
・あらかじめ空のディレクトリを作成する。
・ownerはpostgres (PostgreSQLオペレーティングシステムユーザ)
2.テーブル空間作成
──────────────────────────────
【□】 psql
【□】 CREATE TABLESPACE tablespace02 LOCATION '/db2/pgsql/data';
3. テーブル空間にテーブル作成
──────────────────────────────
【□】 psql -d test1
【□】 CREATE TABLE t1(c1 varchar(20)) TABLESPACE tablespace02;
【□】 \d t1
Table "public.t1"
Column | Type | Modifiers
--------+-----------------------+-----------
c1 | character varying(20) |
Tablespace: "tablespace02" ★
4.権限付与・一般ユーザにCREATEを許す場合のみ
──────────────────────────────
GRANT→●[マニュアル]
権限を与える前
【□】 create table t16 (c1 varchar(10)) tablespace tablespace02;
database01=> create table t16 (c1 varchar(10)) tablespace tablespace02;
ERROR: permission denied for tablespace tablespace02
権限付与
【□】 grant create ON tablespace tablespace02 to user01;
権限付与後
【□】 create table t16 (c1 varchar(10)) tablespace tablespace02;
database01=# create table t16 (c1 varchar(10)) tablespace tablespace02;
CREATE TABLE
■3■ テーブル空間の確認方法
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
→●[マニュアル]
デフォルトで用意されている2個
pg_global・・・・共有システムカタログ用(ユーザは使えない)
pg_default ・・・template1とtemplate0データベースのデフォルトテーブル空間
1.システムカタログpg_tablespaceを使う。
──────────────────────────────
テーブルスペースと権限をpg_tablespaceで確認する。
【□】 select * from pg_tablespace;
postgres=# select * from pg_tablespace;
spcname | spcowner | spclocation※ | spcacl | spcoptions
--------------+----------+---(9.2で廃止)---+-----------------------------------------+------------
pg_default | 10 | | |
pg_global | 10 | | |
tablespace01 | 10 | /db1/pgsql/data | {postgres=C/postgres,user01=C/postgres} |
tablespace02 | 10 | /db2/pgsql/data | {postgres=C/postgres,user01=C/postgres} |
【注意】spclocationは9.2で廃止
9.2からはspclocationは廃止されたため、代わりに専用の関数を使用して取得する必要がある。
select oid,spcname,pg_tablespace_location(oid) from pg_tablespace;
【補足】with grant optionで作成した場合はspcaclの表記に*がつく。
2.psqlプログラムの\dbメタコマンドを使う
──────────────────────────────
【□】 \db+
名前 | 所有者 | 場所 | アクセス権 | 説明
--------------+----------+-----------------+---------------------+------
pg_default | postgres | | |
pg_global | postgres | | |
tablespace01 | postgres | /db1/pgsql/data | postgres=C/postgres+|
| | | user01=C/postgres |
tablespace02 | postgres | /db2/pgsql/data | postgres=C/postgres+|
| | | user01=C/postgres |
3.シンボリックリンクを確認
──────────────────────────────
$PGDATA/pg_tblspcディレクトリには作成したテーブル空間へのシンボリックリンクあり。
ここからもテーブル空間の確認が可能。
【□】 ls -l $PGDATA/pg_tblspc
lrwxrwxrwx 1 postgres postgres 15 1月 24 22:09 2013 16387 -> /db1/pgsql/data
lrwxrwxrwx 1 postgres postgres 15 2月 25 04:32 2013 18254 -> /db2/pgsql/data
■4■ その他
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1.default_tablespaceパラメータ
──────────────────────────────
例
SET default_tablespace = tablespace02;
この状態でcreate tableのときテーブル空間を指定しなければ指定したデフォルトの場所に作成される。
2.temp_tablespacesパラメータ
──────────────────────────────
一時テーブル、一時ファイルの場所。
負荷分散が目的なので、普通は1個作成するのではなく複数をリストにして作成する。
一時的なオブジェクトはこの中から無作為に選ばれて使用される。
Q)テーブル空間を削除するには
──────────────────────────────
空のテーブル空間に限り以下により削除可能
【□】 DROP TABLESPACE tablespace02;
以上