【PostgreSQL】pg_ctlについて

## pg_ctlとは
PostgreSQLの起動、停止、状態確認などに使用する
実行するユーザは、PostgreSQLの管理ユーザ(一般的にはpostgresユーザー)

### 構文
`pg_ctl サブコマンド [オプション]`

## サブコマンドについて
### initdb
#### initdbとは
initdbを呼び出して、指定したディレクトリにデータベースクラスタを作成する。
#### 構文
`pg_ctl init[db] [オプション]`
#### オプション
| オプション | 説明 |
| :---: | :--- |
| -D, -pgdata=データベースクラスタ | データベースクラスタを作成するディレクトリを指定する。未指定の場合は、環境変数`PGDATA`が使われる |
| -o オプション | 内部的に呼び出す`initdb`に渡すオプションを指定する |

#### 使用例
##### /var/lib/pgsql/testにデータベースクラスタを作成する 
``` bash
pg_ctl -D /var/lib/pgsql/test initdb
```
![](https://enjoy-program.net/wp-content/uploads/2023/02/スクリーンショット-2023-02-03-9.20.48-1024x991.jpg)

##### UTF8のエンコーディング、ロケールなしで、/pgdataにデータベースクラスタを作成する
``` bash
pg_ctl initdb -D /pgdata -o "--encoding=UTF8 --no-locale"
```

### start
#### startとは
PostgreSQLをバックグラウンドで起動する。
時間内に起動が完了しない場合、`pg_ctl start`は失敗するが、失敗するのは`pg_ctl start`であって、PostgreSQLの起動自体は引き続き行われる。起動するPostgreSQLは、指定したデータベースクラスタを利用する。同じデータベースクラスタを使うPostgreSQLを複数起動することはできない。
#### 構文
`pg_ctl start [オプション]`
#### オプション
| オプション | 説明 |
| :---: | :--- |
| -D, -pgdata=データベースクラスタ | データベースクラスタを作成するディレクトリを指定する。未指定の場合は、環境変数`PGDATA`が使われる |
| -t 最大待ち時間 | 起動が完了するまでの最大待ち時間を秒単位で指定する（デフォルトは60秒） |

#### 使用例
##### /pgdataのデータベースクラスタ上でPostgreSQLを起動し、起動が完了するまで最大2分間(120秒間)待っている。

``` bash
pg_ctl start -D /pgdata -t 120
```

### stop
#### stopとは
PostgreSQLを停止（シャットダウン）する。
#### 構文
`pg_ctl stop [オプション]`
#### オプション

| オプション | 説明 |
| :---: | :--- |
| -D, -pgdata=データベースクラスタ | データベースクラスタを作成するディレクトリを指定する。未指定の場合は、環境変数`PGDATA`が使われる |
| -W | 停止が完了するまで待たない |
| -t 最大待ち時間 | 停止が完了するまでの最大待ち時間を秒単位で指定する（デフォルトは60秒） |
| -m シャットダウンモード | 停止方法を指定する<br>s[mart]：スマートシャットダウン<br>クライアントからの接続がすべて切断されるまで待ってから停止する接続が残っている限り、停止は完了しないため注意すること。<br>f[ast]：高速シャットダウン<br>クライアントからの接続をすべて強制的に切断してから停止する。デフォルトのシャットダウンモード。実行中のトランザクションはすべてロールバックされる。<br>i[mmediate]：即時シャットダウン<br>クリーンアップ処理を行わずに緊急停止する（PostgreSQLがクラッシュしたのと同じ状態になる）次回の起動時には復旧処理が必要になる。このモードは、緊急時（たとえば、高負荷のため他のモードではすぐに停止できないとき）またはPostgreSQLのクラッシュを模擬する場合のみに使うこと。 |

#### 使用例
##### /pgdataのデータベースクラスタ上で稼働しているPostgreSQLをスマートシャットダウンで停止する

``` bash
pg_ctl stop -D /pgdata -m smart
```

![](https://enjoy-program.net/wp-content/uploads/2023/02/スクリーンショット-2023-01-30-21.24.40-1024x373.jpg)


### restart
#### restareとは
PostgreSQLを再起動する
稼働中のPostgreSQLを停止し、再び起動する。
停止しているデータベースクラスタを指定すると起動だけをおこなう。
restartは、停止が完了するまで必ず待ちます。最大待ち時間内に停止が完了しない場合、restartは失敗する。ただし、失敗するのは
#### 構文
`pg_ctl restart [オプション]`

#### オプション
| オプション | 説明 |
| :---: | :--- |
| -D, -pgdata=データベースクラスタ | 再起動するPostgreSQLが使っているデータベースクラスタを指定する。未指定の場合は、環境変数`PGDATA`が使われる |
| -m シャットダウンモード | 停止方法を指定する |
| -t 最大待ち時間 | 起動／停止が完了するまでの最大待ち時間を秒単位で指定する（デフォルトは60秒） |

#### 使用例
``` bash
pg_ctl restart -D /pgdata -m f
```

### reload
#### reloadとは
PostgreSQLに設定ファイルを再読込させる。
再読み込みさせる設定ファイルは、postgresql.confとpg_hba.confの2つ。
設定ファイルの変更を稼働中のPostgreSQLに反映させるには、reloadを実行する必要がある。
ただし、reloadでは設定変更を反映出来ないパラメータがある。
#### 構文
`pg_ctl reload [オプション]`
#### オプション
| オプション | 説明 |
| :---: | :--- |
| -D, -pgdata=データベースクラスタ | 設定ファイルを再読み込みさせるPostgreSQLが使っているデータベースクラスタを指定する。未指定の場合は、環境変数`PGDATA`が使われる |

#### 使用例

``` bash
pg_ctl reload -D /pgdata
```

### status
#### statusとは
PostgreSQLが起動しているかどうかを確かめる。
#### 構文
`pg_ctl status [オプション]`
#### オプション
| オプション | 説明 |
| :---: | :--- |
| -D, -pgdata=データベースクラスタ | 起動の確認対象となるPostgreSQLが使っているデータベースクラスタを指定する。未指定の場合は、環境変数`PGDATA`が使われる |

#### 使用例
``` bash
pg_ctl status -D /pgdata
```

### kill
#### killとは
プロセスにシグナルを送信する
送信できるシグナルは、HUP、INT、QUIT、ABRT、TERM、USR1、USR2
killコマンドをサポートしていないWindowsなどの環境でシグナルを送信することができる。
#### シグナルを送信したときの効果
| シグナル | 効果 |
| :---: | :--- |
| TERM | PostgreSQLをスマートシャットダウンで停止する。`pg_ctl stop -m smart`と同じ |
| INT | PostgreSQLを高速シャットダウンで停止する。`pg_ctl stop -m fast`と同じ |
| QUIT | PostgreSQLを即時シャットダウンで停止する。`pg_ctl stop -m immediate`と同じ |
| HUP | PostgreSQLを設定ファイルを再読み込みさせる。`pg_ctl stop -m reload`と同じ |

#### 構文
`pg_ctl kill シグナル名 プロセスID`
#### 使用例
``` bash
pg_ctl kill TERM プロセスID
```