Postgres Package Managerを使ってみる

## Postgres Package Managerとは？

これまでWindows環境ではPostgreSQLをインストールするには、**Interactive installer by EnterpriseDB**しか選択肢がなかった気がしますが、**Graphical installer by BigSQL**もダウンロードページに出ていました。

EnterpriseDBのPostgreSQL 9.6を入れるとpgAdmin4になっていて使いづらかったりしましたが、BigSQLのインストーラーではpgAdmin3を選べて良い感じです。

BigSQLで9.6.4から9.6.5に上げようとインストーラーをダウンロードして起動したらエラーで止められて、何やらpgcを使ってアップデートして欲しいようです。

>There has been an error.
>An installation already exsists on this machine.  It you are attempting to upgrade your installation, please use the PGCLI instead.
>
>Information related to upgrading an exsisting installation via the PGCLI can be found at the following URL:
>                            
>                     https://bigsql.org/upgrade_windows
>                     
>If you require another version of PostgreSQL on this machine, please install it via the PGCLI
>
>Documentation for the PGCLI can be found at the following URL:
>
>                   https://bitbucket.org/openscg/pgcli

**Graphical installer by BigSQL**でインストールすると`pgc`というPostgres Package Managerのコマンドが含まれているらしく、PostgreSQLのアップデートやその他の管理をコマンドラインで行うことができるようです。

## pgcのインストール

せっかくなので全部アンインストールして `pgc` のインストールから行ってみます。

公式の[Setting startedなページ](https://www.openscg.com/bigsql/package-manager/)を見るとコマンド一発でpgcをインストールできるように見えます。

### 注意：インストールスクリプト実行時のカレントディレクトリ

インストールのコマンドは、コマンドプロンプトを管理者権限で起動する必要があります。
Windowsキー＋xでさくっと起動してコマンドを実行したくなりますが、`カレントディレクトリ\bigsql\pgc` にインストールされてしまうので `C:\WINDOWS\system32\bigsql\pgc`に入れられたりします。他の場所に移し直すだけで良さそうですが。

```
mkdir C:\pgc && cd C:\pgc
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://s3.amazonaws.com/pgcentral/install.ps1'))"
```

このように`C:\pgc`ディレクトリを作成、カレントディレクトリにしてインストールスクリプトを実行すると、`C:\pgc\bigsql\pgc.bat`がpgcコマンドになります。

## PostgreSQLその他のインストール

※以下、pgcコマンドの使い方はWindows以外（macOS）でも同じです。
`pgc list`で利用可能なコンポーネントの一覧が出ます。

```
Category     | Component | Version  | ReleaseDt  | Status    | Updates
PostgreSQL     pg92        9.2.23-1   2017-08-31
PostgreSQL     pg93        9.3.19-1   2017-08-31
PostgreSQL     pg94        9.4.14-1   2017-08-31
PostgreSQL     pg95        9.5.9-1    2017-08-31
PostgreSQL     pg96        9.6.5-1    2017-08-31
Servers        pgdevops    1.6-3      2017-08-10
Applications   backrest    1.20       2017-07-31
Applications   ora2pg      18.1       2017-03-23
Applications   pgadmin3    1.23.0b    2017-06-08
Applications   pgagent     3.4.1-1    2017-02-23
Applications   pgbadger    9.2        2017-07-31
Frameworks     java8       8u121      2017-02-09
Frameworks     perl5       5.20.3.3   2016-03-14
Frameworks     python2     2.7.12-1   2016-10-20   Installed
Frameworks     tcl86       8.6.4-1    2016-03-11
```

PostgreSQL 9.6.xとpgAdmin3を入れてみます。
`pgc install pg96`
`pgc install pgadmin3`

```
Category     | Component           | Version  | ReleaseDt  | Status         | Updates
PostgreSQL     pg92                  9.2.23-1   2017-08-31
PostgreSQL     pg93                  9.3.19-1   2017-08-31
PostgreSQL     pg94                  9.4.14-1   2017-08-31
PostgreSQL     pg95                  9.5.9-1    2017-08-31
PostgreSQL     pg96                  9.6.5-1    2017-08-31   NotInitialized
Extensions     cassandra_fdw3-pg96   3.0.1-1    2016-11-08
Extensions     hadoop_fdw2-pg96      2.5.0-1    2016-09-01
Extensions     oracle_fdw1-pg96      1.5.0-1    2016-09-01
Extensions     orafce3-pg96          3.4.0-1    2017-07-13
Extensions     pgaudit11-pg96        1.1.0-2    2017-05-18
Extensions     pgpartman2-pg96       2.6.4-1    2017-04-15
Extensions     pldebugger96-pg96     9.6.0-1    2016-12-28
Extensions     plprofiler3-pg96      3.2-1      2017-04-15
Extensions     postgis23-pg96        2.3.3-2    2017-07-31
Extensions     setuser1-pg96         1.4.0-1    2017-08-31
Extensions     tds_fdw1-pg96         1.0.8-1    2016-11-23
Servers        pgdevops              1.6-3      2017-08-10
Applications   backrest              1.20       2017-07-31
Applications   ora2pg                18.1       2017-03-23
Applications   pgadmin3              1.23.0b    2017-06-08   Installed
Applications   pgagent               3.4.1-1    2017-02-23
Applications   pgbadger              9.2        2017-07-31
Frameworks     java8                 8u121      2017-02-09
Frameworks     perl5                 5.20.3.3   2016-03-14
Frameworks     python2               2.7.12-1   2016-10-20   Installed
Frameworks     tcl86                 8.6.4-1    2016-03-11
```

入りましたがNotInitializedと表示されています。
`pgc init pg96`でInstalledになりました。ここでSuperuser（postgresユーザ）のパスワード設定も行います。
`pgc start`でPostgreSQLが起動します。
`pgc stop`で停止します。
`pgc status`で動いているのか止まっているのか確認できます。

### サービスとして起動する

インストーラーでインストールした時の様にサービスとして動かすには
`pgc config pg96 --autostart=on`
を実行するとサービスが作成されます。
作成されるだけなのですぐ使う場合は `pgc start pg96` を実行するとサービスが起動します。

## バージョンアップ

### リビジョンアップデート

```
pgc update
pgc upgrade
```

明示的にstopしなくてもupgradeできました。

### メジャー、マイナーアップデート

pgcではメジャーバージョンやマイナーバージョンの番号が変わると別パッケージとして扱われているので、新しいパッケージをインストールしてデータを移します。（pgcからのdbdump等は使い方がよくわからないので止めておきます。。。）

動いているのを止める。

```
pgc stop pg96
pgc config pg96 --autostart=off
pgc disable pg96
```

disableはパッケージの扱いがdisableになるだけのようで、サーバー動作止める、サービス削除、パッケージ無効と手順を踏んだほうがよさそうです。

## pgcコマンドの使い方を探る

ドキュメントはどこにあるの？

### pgc config

`pgc config pg96 --autostart=on`の他に何を設定できるのか。
実装は各パッケージ内のpg96\config-pg96.pyにあるっぽい。
これを見ると使えるオプションは次の通り。

|オプション例 |内容 |
|------------|----|
|--port=5432|ポート番号を5432に設定する。|
|--autostart=on|PostgreSQLサービス作成。（=offでサービス削除）|
|--datadir=||
|--logdir=||
|--svcname=||