OracleからAzure DB（PostgreSQL）へ移行する~④PostgreSQLのファイル管理

今回はPostgreSQLのファイル管理について記載します。Azure DBはPaaSなのであまり意識することはないかもしれませんが、知識として持っておいた方が何かと役に立つこともありますので。

#データベースクラスタにおけるファイルとディレクトリ
PostgreSQLで使われるファイルはデータベースクラスタと呼ばれるディレクトリ内に格納されます。
WindowsでPostgreSQLをインストールしたときのデータベースクラスタをベースに各ディレクトリ、ファイルの役割を記載します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/eed68d01-1cb5-3537-4cbe-3413bc80187c.png)|
|:--|

①baseディレクトリ
　└データベースディレクトリ
　　├テーブルファイル
　　├インデックスファイル
　　├TOASTファイル
　　├FSMファイル
　　└Visibirity Mapファイル
②globalディレクトリ
③pg_walディレクトリ
　└WALファイル
④pg_xactディレクトリ
⑤pg_tblspcディレクトリ
　└テーブル空間のシンボリックリンク
⑥PG_VERSIONファイル
⑦postmaster.pidファイル
⑧postgresql.confファイル
⑨postgresql.auto.confファイル
⑩pg_hba.confファイル

#主なディレクトリ
PostgreSQLで主要なディレクトリは以下の５つです。

* __baseディレクトリ__
本ディレクトリ配下にデータベース毎に識別子を示す数字のディレクトリ（データベースディレクトリ）が作成されます。データベースディレクトリは、baseディレクトリ配下に格納され、テーブルファイル、インデックスファイルTOASTファイル、Free Space Mapファイル、Visibility Mapファイル等のファイルが格納されます。

* __globalディレクトリ__
データベースクラスターで共有するテーブルを保管するディレクトリです。主に複数のデータベースにまたがる「システムカタログ」などが格納されています。

* __pg_walディレクトリ__
WALファイルを格納するディレクトリです。データベースの作成時のオプションによっては、シンボリックリンクとなる場合もあります。

* __pg_xactディレクトリ__
トランザクションのコミット状態を管理するファイルが格納されるディレクトリです。

* __pg_tblspcディレクトリ__
PostgreSQLでは、テーブルやインデックスなどのデータベースオブジェクトをbaseディレクトリ以外の任意のディレクトリ（テーブル空間）に格納することも可能です。テーブル空間として作成されたディレクトリへのシンボリックリンクがこのディレクトへ格納されます。

#主なファイル
先ほどはディレクトリでしたが、次に主要なファイルです。

* __PG_VERSIONファイル__
PostgreSQLのメジャーバージョン番号が書き込まれているテキストファイルです。以下の通りテキストエディタなどで開く事が出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/d0826dc1-323d-7669-85d0-51ef48a42af7.png)
当該ファイルは起動するPostgreSQLのメジャーバージョンと使用するデータベースクラスタのバージョンチェックのために使用されます。PostgreSQLでは、異なるメジャーバージョン間ではデータベースクラスタのディレクトリやファイルの構成が微妙に異なります。無理に起動するとデータベースクラスタ内に作成されるファイルやファイルのフォーマットが異なるため、想定外の誤動作が発生する可能性があり、こうした誤動作の防止のために起動時に当該ファイルのバージョンと起動するPostgreSQLのバージョンを比較し、異なる場合は起動しないようにしています。

* __テーブルファイル__
テーブルデータの実態が格納さえているファイルです。データベースディレクトリ配下に格納され、8192バイトの「ページ」によって構成されます。

* __インデックスファイル__
インデックス情報が格納されているファイルです。テーブルファイル同様にデータベースディレクトリ配下に格納され、8192バイトの「ページ」によって構成される。

* __TOASTファイル__
TOASTファイルはすこしイメージしにくいかもしれません。先ほどページサイズが8ｋと記載しましたが、Oracleでは「ページサイズ」いわゆる「ブロックサイズ」を、2k、4k、8k、16K、32kと様々選べるのに対して、PostgreSQLは8k固定です。このため、PostgreSQLではテーブル内にレコード長の長いデータを格納する場合、特殊な方法で格納します。それがこのTOASTファイルです。レコード長の長いデータ（通常は2KBを超えるサイズ）はこのTOASTファイルに分割して格納されます。

* __Free Space Mapファイル__
空き領域を追跡するための情報が格納されたファイルです。データベースディレクトリ配下に格納されており、テーブルおよびインデックスごとに生成され、「＜oid＞_fsm」という名前でデータベースディレクトリ配下に格納されます。

* __Visibility Mapファイル__
テーブルの可視性を管理するファイル。「<oid>_vm」という名前でデータベースディレクト配下に格納される。

* __WALファイル__
PostgreSQLに対する更新操作を記録するファイルです。pg_walディレクトリ配下に格納されます。Oracleで言うREDOログファイルでPostgreSQLに対するデータの更新操作を記録し、データベースの永続性の保証やリカバリ時に重要な役割をはたします。16MB固定のサイズで生成され、max_wal_sizeで指定したサイズ（デフォルトは１GB）まで生成されます。

* __postmaster.pid__
PostgreSQLの稼働中に作成されるロックファイルです。データベースクラスタ配下に格納されます。PostgreSQLの「二重起動チェック用」のファイルで、postmaster.pidが存在しているときに、同じデータベースクラスタを指定してPostgreSQLを起動すると二重起動のエラーになります。

* __postgresql.conf__
PostgreSQLの様々なパラメータが記載されているファイルです。Oracleでいうところのinit.oraにあたります。このファイルについては後程もう少し詳しく記載します。

* __pg_hba.conf__
クライアントからPostgreSQLへ接続する際の認証に関する設定を記述するファイルです。誰がどのデータベースにどこから、どの認証方式で接続に来るのかが記述されているファイルとなります。通常、pg_hba.confはデータベースクラスタに置かれますが、postgresql.confのhba_fileパラメータを指定することで配置場所の変更も可能です。
pg_hba.confファイルはPostgreSQL起動時および、PostgreSQLがSIGHUPシグナルを受信したタイミングで読み込まれます。

##postgresql.conf
PostgreSQL全体の動作を制御する設定ファイルですが、様々な設定値を設定することが可能です。設定項目は大きく分類すると以下のようなものが存在しています。

|カテゴリ名|説明|
|:--|:--|
|接続と認証|接続、セキュリティ、認証関連の設定|
|資源の消費|共有メモリ、ディスク、ライタプロセス関連の設定|
|ログ先行書き込み|WAL、チェックポイント、アーカイブ関連の設定|
|レプリケーション|レプリケーション関連の設定|
|問い合わせ計画|実行計画関連の設定|
|エラー報告とログの取得|サーバログ出力に関する関連設定|
|実行時統計情報|統計情報の収集に関する設定|
|自動バキューム作業|自動バキュームに関する設定|
|クライアント接続デフォルト|接続した挙動やロケールに関する設定|
|ロック管理|ロックやデッドロック検知に関する設定|
|バージョンとプラットフォーム|旧バージョンやプラットフォーム間の互換性に関する設定|
|エラー処理|エラーや障害発生時の設定|

また、このpostgresql.confですが、設定項目の確認の方法もいくつかります。直接ファイルを参照するか、SHOW文、pg_settingのシステムビューで確認する方法です。各項目の設定変更に関しても様々なタイミングで設定が変更されます。pg_settingビューのcontext列からどのように変更可能かを確認することができますので、知識として覚えておいてもらうと良いように思います。

|反映のタイミング|pg_settingsシステムビューのcontext列の値|説明|
|:--|:--|:--|
|SET文実行時|userまたはsuperuser|発行したセッション内で即時に反映される。他のセッションには影響を及ぼさない。SET LOCAL文の場合、その効果は発行したトランザクション内に限定。context列がsuperuserの場合、スーパーユーザ権限を持つユーザのみ変更可能となる。|
|SIGHUPシグナル受信時|sighup|'pg_ctl reload'や'pg_reload_conf関数'などの実行によりPostgreSQLがSIGHUPシグナルを受け取ったタイミングで、設定をリロードし反映する。|
|PostgreSQL起動時|postmaster|PostgreSQLの起動時に反映される。|

設定変更の方法としてPostreSQLではALTER SYSTEM文で変更することも可能となります。
ALTER SYSTEM文で変更する場合、postgresql.conf分を変更するのではなく、postgresql.auto.confファイルが変更されます。（なければ生成されます。）
PostgreSQLではまず、postgresql.confファイル内容をデータベースに反映した後、postgresql.auto.confファイルの内容を反映する動きとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697647/3513768b-fa4d-64cd-419d-9d8ab5699cf3.png)

#最後に
以上が主なPostgreSQLのファイル管理となります。
PostgreSQLのプロセス、メモリ、ディレクトリ、ファイルの構成に関して、参考程度として記憶しておくと、PostgreSQLを運用管理する際にきっと役立つと思います。

##次回は
PostgreSQLの動作の仕組みについて簡単に記載しいと思います。