PostgreSQLのデータベースクラスタ内のサブディレクトリや設定ファイルの役割（4、pg_commit_tsの役割）

##はじめに
Dockerを使ってPostgreSQLのデータべースクラスタのサブディレクトリ・設定ファイルの役割を理解するのが目的です

##使用コンテナ
・postgres:11-alpin

PostgreSQLのデータベースクラスタのディレクトリ構成は下記のような構造になっています。

```bash
$ 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_commit_tsの役割
pg_commit_tsはトランザクションのコミット時刻のデータを保有するサブディレクトリとなっています。
実際に動かして、どういった形で保有されるのか確認します

```bash
#pg_commit_tsの中身を確認します
$ ls /var/lib/postgresql/data/pg_commit_ts
#空だったため、出力ありませんでした。
```

ではデータベースに対してトランザクションを行って変化がないか確認していきたいのですが、
2点先に行うことがあります
①設定ファイルの変更
②dockerコンテナのrestart

①に関しては、初期設定ではトランザクションのコミット時刻をため込む設定になっていないため変更します

```
$ vi /var/lib/postgresql/data/postgresql.conf
```

テキストエディタでpostgresqlの設定ファイルの下記項目のコメントアウトを外して、offをonにします

```
#track_commit_timestamp = off
↓
track_commit_timestamp = on
```

①が終わったら、dockerのrestartをして、postgresサーバーを再立ち上げします。
（※設定ファイルの再読み込みでは変更されません）

dockerのリスタートが終わったら
テーブルの作成、データの追加をトランザクションで行っていきます。

```bash
#データベースの確認
$ psql -l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
+-----------+----------+----------+------------+------------+-----------------------
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 test      | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
(4 rows)

#トランザクションはコードが長くなるため、psqlでtestデータベースに接続した状態で行います
$ psql -d test

test=# BEGIN;
BEGIN
test=# INSERT INTO td1 VALUES(1,'田中', 2);
INSERT 0 1
test=# SELECT * FROM td1;
 id | name | did 
----+------+-----
  1 | 田中 |   2
(1 row)

test=# COMMIT;
COMMIT
```

では、pg_commit_tsの中身を確認しましょう

```bash
#pg_commit_tsの中身を確認します
$ ls /var/lib/postgresql/data/pg_commit_ts
0000
```

0000というファイルが作られてますね
このままcatで開くとよくわからないものが出てきます

```bash
$ cat 0000
n[L:?G7?<?
```

この中身を確認するには方法は調べても出てこず、私の知識ではまだ分からないため、
わかったときに追加いたします。
どなたか分かる方いればコメント願います。


#備考
psqlで直接SQLコマンドを送ることも可能です

```bash
$ psql -d test -c "SELECT * FROM td1;"
 id | name | did 
----+------+-----
  1 | 田中 |   2
(1 row)
```


##終わりに
今回のように、PostgresSQLへの操作がデータベースクラスタへどう変化を起こすかを見て行けたらと思います。

[１、ディレクトリ構造を確認](https://qiita.com/michi-michi/items/0aac8b6ccdb365269c90)
[２、PG_VERSION、baseの役割](https://qiita.com/drafts/dd33d3e1e831d0d79b35/)
[３、globalの役割](https://qiita.com/michi-michi/items/c3ca6b1efe13e3a3af84)
4、pg_commit_tsの役割