Tihiroの頭を休めるIT教室

少しだけ頭使って後は根性

PostgreSQLのデータベースクラスタ(ファイルやディレクトリ)のお話し

記事の概要

PostgreSQLのデータファイルや、自動的に作成されるディレクトリの解説です。 要は、PostgreSQLの「データベースクラスタ」と呼ばれるものについての解説です。

利用バージョンはPostgreSQL 9.6.3。

「データベースクラスタ」以外の解説については別途記事を立てて解説したいと思います。

データベースクラスタの作成

データベースクラスタはinitdbコマンドで作成されます。

initdb -E UTF-8 --no-locale -D /home/postgres/pgsql96/data

上記の例では

また、作成されたデータベースクラスタの場所を環境変数PGDATAへ登録しておくと、PostgreSQLが自動的に参照したりもします。

作成されたデータベースクラスタの確認

/home/postgres/pgsql96/dataの下には

  • base
  • global
  • pg_clog
  • pg_commit_ts
  • pg_dynshmem
  • pg_log
  • pg_logical
  • pg_multixact
  • pg_notify
  • pg_replslot
  • pg_serial
  • pg_snapshots
  • pg_stat
  • pg_stat_tmp
  • pg_subtrans
  • pg_tblspc
  • pg_twophase
  • pg_xlog

というディレクトリが作成されます。

また、設定ファイルとして

が、作成されます。

沢山ありますが、人間が気にしなければならないファイルやディレクトリは、それほど多くありません。 それらのディレクトリやファイルについては、以下で説明していきます。

データベースクラスタのファイル・ディレクトリの解説

作成されたデータベースクラスタ内のファイルやディレクトリについて、重要なものを解説していきます。

base

テーブルデータやインデックスデータが格納されるフォルダです。 データベースごとにサブディレクトリが作成されて、データが格納されます。

base/pgsql_tmp

ハッシュやディスクソートなどの処理で一時的に作成されるデータを保存するディレクトリです。 OOM-Killerなどで、SQLの実行が正常に終了できなかった場合に一時的なデータが残存する可能性があります。 データベースクラスタの起動時(終了時?)に消去されるのですが、24時間休みなく稼働している場合など、気がつけばpgsql_tmpディレクトリ内にデータが溜まっている場合があります。

global

データベースクラスタ全体で共有するデータ(システムカタログなど)が格納されるフォルダです。

pg_clog

トランザクションの状態が「実行中」「コミット済み」「ロールバック(アボート)済み」のいずれかであることを管理するログの格納ディレクトリです。 コミットログなどと呼ばれたりします。 用途としては、リカバリなどに利用されます。また、pg_resetxlogでトランザクションIDを指定する場合には、pg_clog内のファイル名を確認して指定します。

pg_xlog

WAL(ワル)ファイルというトランザクションのログが格納されるディレクトリです。 コミットやロールバックなどは勿論、PostgreSQLではDROPテーブルなども、WALファイルに記録されます。 用途としては、リカバリレプリケーション機能に利用されます。

pg_log

PostgreSQLの出力したログが格納されるディレクトリです。 ログの設定はpostgresql.confで設定します。 pg_logにログが出力されていない場合は、syslogに出力されているかもしれません。

pg_stat

PostgreSQL(統計情報コレクタ)が収集した統計情報を永続的に保存するディレクトリです。 データベースクラスタが実行中の場合は空っぽで、データベースクラスタが終了した際にファイルが作成されます。

pg_stat_tmp

PostgreSQL(統計情報コレクタ)が収集した統計情報を一時的に保存するディレクトリです。 データベースクラスタが実行中の場合にファイルが作成され、データベースクラスタが終了した際にファイルは消去されます。

postmaster.pid

データベースクラスタが実行中の場合のみ存在するファイルです。 PostgreSQLは、このファイルが存在するかどうかで、データベースクラスタが起動中かどうかを判定します。 OOM-Killerなどで、PostgreSQLが正常に終了できなかった場合に、postmaster.pidが残存する可能性があります。 その場合は、postmaster.pidを消去しないとデータベースクラスタが起動しません。

最後に

以上、データベースクラスタ内のファイルやディレクトリについての簡単な説明でした。 今回、解説しきれなかったことが沢山ありますので、引き続き更新していきたいと思います。