無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

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

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

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

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

表 58-1. PGDATA の内容

項目 説明
PG_VERSION PostgreSQL の主バージョン番号を保有するファイル
base データベースごとのサブディレクトリを保有するサブディレクトリ
global pg_database のようなクラスタで共有するテーブルを保有するサブディレクトリ
pg_clog トランザクションのコミット状態のデータを保有するサブディレクトリ
pg_multixact マルチトランザクションの状態のデータを保有するサブディレクトリ(共有行ロックで使用されます)
pg_notify LISTEN/NOTIFY状態データを保有するサブディレクトリ
pg_serial コミットされたシリアライザブルトランザクションに関する情報を保有するサブディレクトリ
pg_snapshots エキスポートされたスナップショットを保有するサブディレクトリ
pg_stat_tmp 統計用サブシステム用の一時ファイルを保有するサブディレクトリ
pg_subtrans サブトランザクションの状態のデータを保有するサブディレクトリ
pg_tblspc テーブル空間へのシンボリックリンクを保有するサブディレクトリ
pg_twophase プリペアドトランザクション用の状態ファイルを保有するサブディレクトリ
pg_xlog WAL(ログ先行書き込み)ファイルを保有するサブディレクトリ
postmaster.opts 最後にサーバを起動した時のコマンドラインオプションを記録するファイル
postmaster.pid 現在のpostmasterプロセスID(PID)、クラスタのデータディレクトリパス、postmaster起動時のタイムスタンプ、ポート番号、Unixドメインソケットのディレクトリパス(Windowsでは空)、有効な監視アドレスの一番目(IPアドレスまたは * 、TCPを監視していない場合は空)および共有メモリのセグメントIDを記録するロックファイル(サーバが停止した後は存在しません)

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

各テーブルおよびインデックスは別個のファイルに格納されます。 通常のリレーションでは、これらのファイル名はテーブルまたはインデックスの ファイルノード 番号となります。 ファイルノード番号は pg_class . relfilenode 内で見つけられます。 しかし一時的なリレーションでは、ファイル名は t BBB _ FFF という形になります。 ここで BBB はファイルを生成したバックエンドのバックエンドID、 FFF はファイルノード番号です。 どちらの場合でも、主ファイル(いわゆる主フォーク)に加え、それぞれのテーブルとインデックスはリレーションに利用できる空き領域についての情報を格納する 空き領域マップ 項58.3 参照)を持ちます。 空き領域マップはファイルノード番号に接尾辞 _fsm がついた名前のファイルに格納されます。 テーブルは同時に、どのページが不要なタプルを持っていないと判断できるように追跡する 可視性マップ を持ち、フォークに接尾辞 _vm を付けたファイルに格納します。 可視性マップは 項58.4 でより詳しく解説します。 ログを取らないテーブルとインデックスは、初期化フォークという第3のフォークを持ち、フォークに接尾辞 _init を付けたファイルに格納します( 項58.5 参照)。

注意

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

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

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

テーブルおよびインデックスの内容は、 項58.6 においてさらに考察されています。

テーブル空間は状況をさらに複雑にします。 ユーザが定義したテーブル空間はそれぞれ、 PGDATA /pg_tblspc ディレクトリ内に物理的なテーブル空間ディレクトリ(つまりそのテーブル空間の CREATE TABLESPACE コマンドで指定された場所)を指し示す、シンボリックリンクを持ちます。 シンボリックリンクの名称はテーブル空間のOIDとなります。 物理的テーブル空間ディレクトリの内部では、 PG_9.0_201008051 などの PostgreSQL サーバのバージョンに依存した名前のサブディレクトリが存在します。 (このサブディレクトリを使用する理由は、競合することなく CREATE TABLESPACE で指定する場所と同じものを将来のバージョンのデータベースでも使用できるようにするためです。) このバージョン固有のサブディレクトリの内部では、テーブル空間に要素を持つデータベースごとに、データベース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 で同一バックエンドで作成された別の一時ファイルと区別します。


powered by SEO.CUG.NET