データベースファイルのレイアウト

PostgreSQL 9.0.0文書
前のページ | 巻戻し | 第 54章データベースの物理的な格納 | 早送り | 次のページ

# 54.1. データベースファイルのレイアウト

本節ではファイルとディレクトリというレベルで格納書式について説明します。

データベースクラスタで必要となる全てのデータは、クラスタのデータディレクトリ内に格納され、通常（このディレクトリを定義するために使用できる環境変数名にちなんで）`PGDATA`として参照されます。 通常の`PGDATA`の位置は`/var/lib/pgsql/data`です。 異なるサーバインスタンスによって管理することで複数のクラスタを同一のマシン上に存在させることができます。

表54-1に示すように、`PGDATA`ディレクトリには数個のサブディレクトリと制御ファイルがあります。 これら必要な項目に加え、クラスタの設定ファイルである`postgresql.conf`、`pg_hba.conf`および`pg_ident.conf`が伝統的に`PGDATA`内に格納されます （ただしPostgreSQL 8.0以降では他の場所にも保存できます）。

表 54-1. `PGDATA`の内容

項目 | 説明
--- | ---
`PG_VERSION` | PostgreSQLの主バージョン番号を保有するファイル
`base` | データベースごとのサブディレクトリを保有するサブディレクトリ
`global` | `pg_database`のようなクラスタで共有するテーブルを保有するサブディレクトリ
`pg_clog` | トランザクションのコミット状態のデータを保有するサブディレクトリ
`pg_multixact` | マルチトランザクションの状態のデータを保有するサブディレクトリ（共有行ロックで使用されます）
`pg_notify` | LISTEN/NOTIFY状態データを保有するサブディレクトリ
`pg_stat_tmp` | 統計用サブシステムのための一時ファイルを含むサブディレクトリ
`pg_subtrans` | サブトランザクションの状態のデータを保有するサブディレクトリ
`pg_tblspc` | テーブル空間へのシンボリックリンクを保有するサブディレクトリ
`pg_twophase` | プリペアドトランザクション用の状態ファイルを保有するサブディレクトリ
`pg_xlog` | WAL（ログ先行書き込み）ファイルを保有するサブディレクトリ
`postmaster.opts` | 最後にサーバを起動した時のコマンドラインオプションを記録するファイル
`postmaster.pid` | 実行中のサーバのPIDおよび共有メモリのセグメントIDを記録するロックファイル（サーバが停止した後は存在しません）

クラスタ内の各データベースに対して、`PGDATA``/base`内にサブディレクトリが存在し、サブディレクトリ名は`pg_database`内のデータベースOIDとなります。 このサブディレクトリはデータベースファイルのデフォルトの位置であり、特にシステムカタログがそこに格納されます。

各テーブルおよびインデックスは別個のファイルに格納されます。 ファイル名はテーブルまたはインデックスのファイルノード番号となります。 ファイルノード番号は`pg_class`.`relfilenode`内で見つけられます。 主ファイル（いわゆる主フォーク）に加え、それぞれのテーブルとインデックスはリレーションに利用できる空き領域についての情報を格納する空き領域マップ（項54.3参照）を所有しています。 空き領域マップはファイルノード番号に接尾辞`_fsm`がついた名前のファイルに格納されます。 テーブルは同時に、どのページが不必要なタプルを持っていないと判断できるように追跡する可視性マップを持ち、フォークに接尾辞`_vm`を付けたファイルに格納します。 可視性マップは項54.4でより詳しく解説します。

注意
テーブルにおけるファイルノード番号とOIDは多くの場合一致しますが、常に一致するとは限らないことに注意してください。 `TRUNCATE`、`REINDEX`、`CLUSTER`等のいくつかの操作、および`ALTER TABLE`におけるいくつかの構文は、OIDを保持したままファイルノード番号を変更できます。 ファイルノード番号とテーブルOIDが同一であると仮定しないでください。 また`pg_class`自身を含む特定のシステムカタログにおいて、`pg_class`.`relfilenode`はゼロを持ちます。 これらのカタログの実際のファイルノード番号は低レベルなデータ構造内に保管されており、`pg_relation_filenode()`関数を使用して入手できます。

テーブルまたはインデックスが１ギガバイトを超えると、ギガバイト単位のセグメントに分割されます。 最初のセグメントのファイル名はファイルノード番号と同一であり、それ以降は、ファイルノード番号.1、ファイルノード番号.2等の名称になります。 この配置法によってファイル容量に制限のあるプラットフォームにおける問題を回避します。 （実際、１ギガバイトは単なるデフォルトのセグメント容量です。 セグメント容量はPostgreSQLを構築する際、`--with-segsize`設定オプションを使用して調整することができます。) 原則として、空き領域マップと可視性マップのフォークにおいても複数のセグメントも必要とする可能性がありますが、実際のところは起こりそうにありません。 テーブルおよびインデックスの内容は、項54.5においてさらに考察されています。

項目が大きくなりそうな列を持ったテーブルは、連携したTOASTテーブルを保有する可能性があります。 TOASTテーブルは、テーブル行の中には大き過ぎて適切に保持できないフィールド値を行の外部に格納するために使用されます。 TOASTテーブルが存在する時、`pg_class`.`reltoastrelid`は元のテーブルとTOASTテーブルを結びつけます。 項54.2を参照してください。

テーブル空間は状況をさらに複雑にします。 ユーザが定義したテーブル空間はそれぞれ、`PGDATA``/pg_tblspc`ディレクトリ内に（`CREATE TABLESPACE`コマンドで指定された）物理的なテーブル空間ディレクトリを指し示す、シンボリックリンクを持ちます。 シンボリックリンクの名称はテーブル空間のOIDとなります。 物理的テーブル空間ディレクトリの内部では、テーブル空間に要素を持つデータベースごとに、データベースOIDをディレクトリ名としたサブディレクトリが存在します。 そのディレクトリ内のテーブルは、ファイルノードの命名の規定に従います。 `pg_default`テーブル空間は `pg_tblspc`を通してアクセスされるのではなく、`PGDATA``/base`と連携します。 同様に、`pg_global`テーブル空間は`pg_tblspc`を通してアクセスされるのではなく、`PGDATA``/global`と連携します。

`pg_relation_filepath()`関数は任意のリレーションの(`PGDATA`から相対的な)パス全体を示します。 これは上の規則の多くを記憶する必要がありませんので、しばしば有用です。 しかし、この関数がリレーションの主フォークの最初のセグメントの名前だけを返すことに注意して下さい。 リレーションに関したすべてのファイルを見つけるためにセグメント番号や`_fsm`や`_vm`を追加する必要があるかもしれません。

一時ファイル（メモリ内に収まりきらないデータのソートなどの操作用）は`PGDATA``/base/pgsql_tmp`内、または、`pg_default`以外のテーブル空間が指定されていた場合はテーブル空間ディレクトリ下の`pgsql_tmp`サブディレクトリ内に作成されます。 一時ファイルの名前は`pgsql_tmp`PPP`.`NNN``という形式です。 ここで、`PPP`は所有するバックエンドのPIDであり、`NNN`で同一バックエンドで作成された別の一時ファイルと区別します。

前のページ | ホーム | 次のページ
データベースの物理的な格納 | 上に戻る | TOAST