2. プロセスとメモリー
3.2 テーブル空間
3.2.2 オブジェクトとファイルの関係
PostgreSQLではデータベースやテーブル等のオブジェクトはオペレーティング・システ
ムのディレクトリやファイルと対応しています。
postgres=> SHOW default_tablespace ; default_tablespace
---
ts_bad ← postgresql.conf に存在しないテーブル空間名を指定 (1 row)
postgres=> CREATE TABLE data1 (c1 NUMERIC, c2 VARCHAR(10)) ; CREATE TABLE
Table "public.data6"
Column | Type | Modifiers ---+---+--- c1 | numeric |
c2 | character varying(10) |
← デフォルトのテーブル空間名が使用 postgres=> SET default_tablespace = ts_bad2 ; SET default_tablespace = ts_bad2 ;
ERROR: invalid value for parameter "default_tablespace": "ts_bad2"
DETAIL: Tablespace "ts_bad2" does not exist.
↑ SET 文によるパラメータ default_tablespace 変更時はチェックが行われる。
□ テーブル空間(TABLESPACE)の特定
pg_default テーブル空間はデータベース・クラスタ内の base ディレクトリと対応しま
す。外部のテーブル空間を作成すると、{PGDATA}/pg_tblspcディレクトリにシンボリック・
リンクが作成されます。
シンボリック・リンクのファイル名は、pg_tablespaceカタログのoid列に対応する名前 です。
図 6 ディレクトリとテーブル空間
例 27 テーブル空間の対応
postgres=# CREATE TABLESPACE tbl2 LOCATION '/opt/PostgreSQL/9.4/tbl2' ; CREATE TABLESPACE
postgres=# SELECT oid, spcname FROM pg_tablespace ; oid | spcname
---+--- 1663 | pg_default 1664 | pg_global 32788 | tbl2 (3 rows)
$ ls –l /opt/PostgreSQL/9.4/data/pg_tblspace total 0
lrwxrwxrwx 1 postgres postgres 26 Jun 23 11:15 32788 -> /opt/PostgreSQL/9.4/tbl2
$
データベース・クラスタ /opt/PostgreSQL/9.4/data
外部テーブル空間
/opt/PostgreSQL/9.4/tbl2
テ ー ブ ル 空 間 oid
テーブル filenode テーブル filenode
base
データベース oid
pg_tblspc PG_9.4_201409291
データベース oid
テーブル空間を作成すると、ディレクトリ内には「PG_{VERSION}_{YYYYMMDDN}」
という名前のサブ・ディレクトリが作成されます。YYYYMMDD部分はテーブル空間作成 日付ではなく、フォーマット用の日付だと思われます。
例 28 テーブル空間の内部
□ データベースの特定
データベースにはデータベース・クラスタ全体で一意のID(oid)が付与されます。この
oid は pg_database カタログの oid 疑似列として確認することができます(または
pg_stat_databaseビューのdatid列)。テーブル空間内にデータベースのoidと同じ名前の
ディレクトリが作成されます。oidの確認は、ユーティリティoid2nameでも確認できます。
$ ls –l /opt/PostgreSQL/9.4/tbl2 total 4
drwx--- 3 postgres postgres 4096 Jun 23 11:16 PG_9.4_201409291
$
例 29 データベースの対応
□ オブジェクト名からファイルを特定
pg_classカタログを検索する以外に、pg_relation_filepath 関数を使ってテーブル名か
らファイル名を特定することができます。この関数にテーブル名/マテリアライズド・ビ ュー名/インデックス名を指定すると、下記のように、データベース・クラスタからの相 対パスを返します。pg_default以外のテーブル空間を使用している場合は、pg_tblspcデ ィレクトリ以下に格納されているように表示されますが、実際にはシンボリック・リンク 先のファイルになります。
postgres=# SELECT oid, datname FROM pg_database ; oid | datname
---+--- 1 | template1 12783 | template0 12788 | postgres 16385 | demodb (4 rows)
$ oid2name All databases:
Oid Database Name Tablespace --- 12788 postgres pg_default 16385 demodb pg_default 12783 template0 pg_default 1 template1 pg_default
$ ls –l /opt/PostgreSQL/9.4/data/base total 32
drwx--- 2 postgres postgres 12288 Apr 16 12:59 1 drwx--- 2 postgres postgres 4096 Apr 16 12:58 12783 drwx--- 2 postgres postgres 4096 Apr 23 11:09 12788 drwx--- 2 postgres postgres 12288 Apr 23 11:09 16385
$
例 30 オブジェクトとファイルの対応
ファイル名のみを取得する場合は、pg_relation_filenode関数を使用します。
postgres=> CREATE TABLE demo1(c1 NUMERIC, c2 CHAR(10)) ; CREATE TABLE
postgres=> SELECT pg_relation_filepath('public.demo1') ; pg_relation_filepath
--- base/16394/16447 (1 row)
postgres=> CREATE TABLE demo2 (c1 NUMERIC, c2 CHAR(10)) TABLESPACE ts1 ; CREATE TABLE
postgres=> SELECT pg_relation_filepath('public.demo2') ; pg_relation_filepath
--- pg_tblspc/16453/PG_9.4_201409291/16394/16454 (1 row)