はじめに
Dockerを使ってPostgreSQLのデータべースクラスタのサブディレクトリ・設定ファイルの役割を理解するのが目的です
使用コンテナ
・postgres:11-alpin
PostgreSQLのデータベースクラスタのディレクトリ構成は下記のような構造になっています。
$ tree -L 1
data
├── PG_VERSION
├── base #データベースごとのサブディレクトリを保有するサブディレクトリ
├── global #pg_databaseのようなクラスタで共有するテーブルを保有するサブディレクトリ
├── pg_commit_ts #トランザクションのコミット時刻のデータを保有するサブディレクトリ
├── pg_dynshmem #動的共有メモリサブシステムで使われるファイルを保有するサブディレクトリ
├── pg_hba.conf #PostgreSQL に接続するクライアントの認証に関する設定を記述するファイル
├── pg_ident.conf #Ident認証のユーザー名をPostgreSQLのロール名にマッピングするためのファイル
├── 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により設定された設定パラメータを格納するのに使われるファイル
├── postgresql.conf #PostgreSQLのパラメータを設定するファイル
├── postmaster.opts #最後にサーバを起動した時のコマンドラインオプションを記録するファイル
└── postmaster.pid #現在のpostmasterプロセスID(PID)、クラスタのデータディレクトリパス、postmaster起動時のタイムスタンプ、ポート番号、共有メモリのセグメントIDを記録するロックファイル
PG_VERSIONの役割
PG_VERSIONはPostgreSQLのメジャーバージョンを記録しています
$ cat PG_VERSION
11
バージョン11のPostgreSQLなので11と出力されています。
baseの役割
baseはデータベースごとのサブディレクトリを保有するサブディレクトリ
新しく作成・追加したデータベースを追加した際に、そのデータベース対応したディレクトリが作成されます。
実際に作成してみると、どうなるか確認してみましょう。
まずbaseの中に入っているサブディレクトリを確認します
$ ls /var/lib/postgresql/data/base
1 13116 13117
初期の状態では3つのディレクトリが存在していますが、これがそれぞれ、テンプレートデータベースであるpostgres・template0・template1を表しています。
ここに、createdbで新しいDBを作成します。
$ createdb -O postgres test
$ ls /var/lib/postgresql/data/base
1 13116 13117 24577
createdb後にサブディレクトリが追加されています。
この24577という数字がデータベースOIDに当たり、testという名前のデータベースの実体に該当します。
終わりに
今回のように、PostgresSQLへの操作がデータベースクラスタへどう変化を起こすかを見て行けたらと思います。
1、ディレクトリ構造を確認
2、PG_VERSION、baseの役割
3、globalの役割
4、pg_commit_tsの役割
5、pg_dynshmemの役割