😸

PostgreSQLのディレクトリ構成

2025/02/21に公開

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特性を守るため
https://zenn.dev/shoan/articles/608eaefc3054e1

Discussion