本節ではファイルとディレクトリというレベルで格納書式について説明します。
伝統的に、データベースクラスタで利用される制御ファイルとデータファイルは、クラスタのデータディレクトリ内に一緒に格納され、通常(このディレクトリを定義するために使用できる環境変数名にちなんで)PGDATA
として参照されます。
通常のPGDATA
の位置は/var/lib/pgsql/data
です。
異なるサーバインスタンスによって管理することで、複数のクラスタを同一のマシン上に存在させることができます。
表 73.1に示すように、PGDATA
ディレクトリには数個のサブディレクトリと制御ファイルがあります。
これら必要な項目に加え、クラスタの設定ファイルであるpostgresql.conf
、pg_hba.conf
およびpg_ident.conf
が、他の場所にも置くことができますが、伝統的にPGDATA
内に格納されます
表73.1 PGDATA
の内容
項目 | 説明 |
---|---|
PG_VERSION | PostgreSQLの主バージョン番号を保有するファイル |
base | データベースごとのサブディレクトリを保有するサブディレクトリ |
current_logfiles | ログ収集機構が現在書き込んでいるログファイルを記録するファイル |
global | pg_database のようなクラスタで共有するテーブルを保有するサブディレクトリ |
pg_commit_ts | トランザクションのコミット時刻のデータを保有するサブディレクトリ |
pg_dynshmem | 動的共有メモリサブシステムで使われるファイルを保有するサブディレクトリ |
pg_logical | 論理デコードのための状態データを保有するサブディレクトリ |
pg_multixact | マルチトランザクションの状態のデータを保有するサブディレクトリ(共有行ロックで使用されます) |
pg_notify | LISTEN/NOTIFY状態データを保有するサブディレクトリ |
pg_replslot | レプリケーションスロットデータを保有するサブディレクトリ |
pg_serial | コミットされたシリアライザブルトランザクションに関する情報を保有するサブディレクトリ |
pg_snapshots | エクスポートされたスナップショットを保有するサブディレクトリ |
pg_stat | 統計サブシステム用の永続ファイルを保有するサブディレクトリ |
pg_stat_tmp | 統計サブシステム用の一時ファイルを保有するサブディレクトリ |
pg_subtrans | サブトランザクションの状態のデータを保有するサブディレクトリ |
pg_tblspc | テーブル空間へのシンボリックリンクを保有するサブディレクトリ |
pg_twophase | プリペアドトランザクション用の状態ファイルを保有するサブディレクトリ |
pg_wal | WAL(ログ先行書き込み)ファイルを保有するサブディレクトリ |
pg_xact | トランザクションのコミット状態のデータを保有するサブディレクトリ |
postgresql.auto.conf | ALTER SYSTEM により設定された設定パラメータを格納するのに使われるファイル |
postmaster.opts | 最後にサーバを起動した時のコマンドラインオプションを記録するファイル |
postmaster.pid |
現在のpostmasterプロセスID(PID)、クラスタのデータディレクトリパス、postmaster起動時のタイムスタンプ、ポート番号、Unixドメインソケットのディレクトリパス(空も可)、有効な監視アドレスの一番目(IPアドレスまたは* 、TCPを監視していない場合は空)および共有メモリのセグメントIDを記録するロックファイル(サーバが停止した後は存在しません)
|
クラスタ内の各データベースに対して、PGDATA
/base
内にサブディレクトリが存在し、サブディレクトリ名はpg_database
内のデータベースOIDとなります。
このサブディレクトリはデータベースファイルのデフォルトの位置であり、特にシステムカタログがそこに格納されます。
以下の節では、組み込みのheap
テーブルアクセスメソッドと組み込みのインデックスアクセスメソッドの振舞いを説明していることに注意してください。
PostgreSQLの拡張性のため、他のアクセスメソッドは異なる動作をするかもしれません。
各テーブルおよびインデックスは別個のファイルに格納されます。
通常のリレーションでは、これらのファイル名はテーブルまたはインデックスのファイルノード番号となります。
ファイルノード番号はpg_class
.relfilenode
内で見つけられます。
しかし一時的なリレーションでは、ファイル名はt
という形になります。
ここでBBB
_FFF
BBB
はファイルを生成したバックエンドのバックエンドID、FFF
はファイルノード番号です。
どちらの場合でも、主ファイル(いわゆる主フォーク)に加え、それぞれのテーブルとインデックスはリレーションに利用できる空き領域についての情報を格納する空き領域マップ(73.3参照)を持ちます。
空き領域マップはファイルノード番号に接尾辞_fsm
がついた名前のファイルに格納されます。
テーブルは同時に、どのページが無効なタプルを持っていないと判断できるように追跡する可視性マップを持ち、フォークに接尾辞_vm
を付けたファイルに格納します。
可視性マップは73.4でより詳しく解説します。
ログを取らないテーブルとインデックスは、初期化フォークという第3のフォークを持ち、フォークに接尾辞_init
を付けたファイルに格納します(73.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テーブルを結びつけます。
73.2を参照してください。
テーブルおよびインデックスの内容は、73.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
、_init
を追加する必要があるかもしれません。
一時ファイル(メモリ内に収まりきらないデータのソートなどの操作用)はPGDATA
/base/pgsql_tmp
内、または、pg_default
以外のテーブル空間が指定されていた場合はテーブル空間ディレクトリ下のpgsql_tmp
サブディレクトリ内に作成されます。
一時ファイルの名前はpgsql_tmp
という形式です。
ここで、PPP
.NNN
PPP
は所有するバックエンドのPIDであり、NNN
で同一バックエンドで作成された別の一時ファイルと区別します。