😸
PostgreSQLのディレクトリ構成
Daily Blogging62日目
DBも結局はファイルの集まりなんですよ
全体像
ディレクトリ構成の全体像はこんな感じ
データベースクラスタ
├── base/ # データベースごとのデータを格納するディレクトリ
├── global/ # クラスタ全体で共有するテーブル(pg_database など)を格納
├── pg_logical/ # 論理デコードの状態データを管理
├── pg_multixact/ # マルチトランザクションの状態データを管理
├── pg_notify/ # LISTEN/NOTIFY の状態データを管理
├── pg_serial/ # コミットされたシリアライザブルトランザクション情報を管理
├── pg_snapshots/ # エクスポートされたスナップショットを格納
├── pg_stat/ # 統計サブシステム用の永続データを格納
├── pg_stat_tmp/ # 統計サブシステム用の一時データを格納
├── pg_subtrans/ # サブトランザクションの状態データを管理
├── pg_tblspc/ # テーブル空間へのシンボリックリンクを管理
├── pg_twophase/ # プリペアドトランザクションの状態ファイルを管理
├── pg_wal/ # WAL(Write-Ahead Logging)ファイルを格納
├── pg_xact/ # トランザクションの状態データを管理
├── postgresql.conf # PostgreSQLの設定ファイル
├── pg_hba.conf # クライアント認証の設定ファイル
├── pg_ident.conf # ユーザー認証のマッピング設定ファイル
├── postmaster.pid # PostgreSQLプロセスのPIDを記録
├── postmaster.opts # サーバー起動時のオプションを記録
└── PG_VERSION # PostgreSQLのバージョン情報を記録
まぁ公式ドキュメントの説明を見てもよくわかんない
重要そうな箇所の理解をもう少し深めてみる
baseディレクトリ
データベースごとのディレクトリであるデータベースディレクトリが作成される。
データベースディレクトリ配下に、テーブルファイル、インデックスファイル、TOASTファイル、Free Space map、visibility mapなどが格納される。
テーブルファイル
8KBのページと呼ばれる複数のブロックから成るファイル。
テーブルデータの実体が格納されてるよ
インデックスファイル
これも1ページ8KBの複数のブロックで構成されてる。
インデックスデータが格納されてる。
TOASTファイル
極端に長いデータを持つ列や大量の列を持つレコードはこの特殊なファイルに別途格納される。
PostgreSQLは固定長のページサイズ(通常8キロバイト)を使用し、複数ページにまたがるタプルを許しません。
https://www.postgresql.jp/docs/9.4/storage-toast.html
別ファイルに格納されるので検索効率が落ちるよ
WALファイル
PoatgreSQLに対して行われた更新履歴を記録するファイル
データベースの持続性を担保する上で重要な役割を担う。
pg_xactディレクトリ
トランザクションのコミット状態を管理するディレクトリ
コミット状態
- コミットされたか
- ロールバックされたか
各トランザクションごとにXIDが振られるのでそれを基に管理している
なんでこんなことしているかというと、トランザクションのACID特性を守るため
Discussion