データベースの物理的な格納

PostgreSQL 8.0.0 文書
前のページ | 巻戻し |  | 早送り | 次のページ

# 第 49章データベースの物理的な格納

本章ではPostgreSQLデータベースで使用される物理的格納書式についての概要を説明します。

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

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

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

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

表 49-1. `PGDATA` の内容

項目 | 記述
--- | ---
`PG_VERSION` | PostgreSQL の主バージョン番号を保有するファイル
`base` | データベース毎のサブディレクトリを保有するサブディレクトリ
`global` | `pg_database` のようなクラスタで共有するテーブルを保有するサブディレクトリ
`pg_clog` | トランザクションのコミット状態のデータを保有するサブディレクトリ
`pg_subtrans` | サブトランザクションの状態のデータを保有するサブディレクトリ
`pg_tblspc` | テーブル空間へのシンボリックリンクを保有するサブディレクトリ
`pg_xlog` | WAL (ログ先行書き込み) ファイルを保有するサブディレクトリ
`postmaster.opts` | 最後に postmaster を起動したコマンドラインのオプションを記録するファイル
`postmaster.pid` | 実行中の postmaster の PID および共有メモリのセグメント IDを記録するロックファイル (postmaster が停止した後は存在しません。)

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

各テーブルおよびインデックスは別個のファイルに格納され、ファイル名はテーブルまたはインデックスのファイルノード番号となり、`pg_class`.`relfilenode` 内で検索できます。

注意
テーブルにおけるファイルノード番号と OID は多くの場合一致しますが、常に一致するとは限らないことに注意してください。 `TRUNCATE`、`REINDEX`、`CLUSTER` 等の幾つかの操作、および `ALTER TABLE` における幾つかの形式は、OID を保持したままファイルノード番号を変更できます。 ファイルノード番号とテーブル OID が同一であると仮定しないでください。

テーブルまたはインデックスが 1 ギガバイトを超えると、ギガバイト単位のセグメントに分割されます。 最初のセグメントのファイル名はファイルノード番号と同一であり、それ以降は、filenode.1、filenode.2、等の名称となります。 この配置法によってファイル容量に制限のあるプラットフォームにおける問題を回避します。 テーブルおよびインデックスの内容は、項49.3 において更に考察されています。

エントリが大きくなりそうな列を持ったテーブルは、連携した TOAST テーブルを保有する可能性があります。 TOAST テーブルは、元のテーブルの行の中には大きすぎて保持できないフィールド値を格納するために使用されます。 `pg_class`.`reltoastrelid` は TOAST テーブルが存在するとき、元のテーブルから参照します。

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

前のページ | ホーム | 次のページ
例 | 上に戻る | TOAST