本章ではPostgreSQLデータベースで使用される物理的格納書式についての概要を説明します。
本節ではファイルとディレクトリというレベルで格納書式について説明します。
データベースクラスタで必要となる全てのデータは、クラスタのデータディレクトリ内に格納され、通常 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 と連携します。