• 検索結果がありません。

オブジェクトとファイルの関係

ドキュメント内 PostgreSQL Internals(1) (ページ 50-55)

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列に対応する名前で す。

図 4 ディレクトリとテーブル空間

例 24 テーブル空間の対応

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_201405111

データベースoid

テーブル空間を作成すると、ディレクトリ内には「PG_{VERSION}_{YYYYMMDDN}」

という名前のサブ・ディレクトリが作成されます。YYYYMMDD部分はテーブル空間作成 日付ではなく、フォーマット用の日付だと思われます。

例 25 テーブル空間の内部

□ データベースの特定

データベースにはデータベース・クラスタ全体で一意の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_201405111

$

例 26 データベースの対応

□ オブジェクト名からファイルを特定

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

$

例 27 オブジェクトとファイルの対応

ファイル名のみを取得する場合は、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_201405111/16394/16454 (1 row)

ドキュメント内 PostgreSQL Internals(1) (ページ 50-55)