PostgreSQLのバージョンを、9.4から12あげた時のメモ

# はじめに
データを大量に作って、少し試したいことがあり、勉強も兼ねてストアドプロシージャを作ってみようと思ったのですが、postgresqlは11以降でしか使えないらしい。。。
ということで、いっそのこと12まであげてしまおうと思いました。

# バージョンアップ手順
ここを参考にさせていただきました。
https://tech-blog.rakus.co.jp/entry/20190829/postgresql

pg_upgradeというコマンドを実行して、旧→新に移行します。
※当方、Windows10環境です。

### 1.目当てのバージョンをダウンロードしてくる。
[ここ](https://www.enterprisedb.com/downloads/postgres-postgresql-downloads)でインストールできます。

### 2.ダウンロードしてきたexeファイル実行し、インストールする。
※ここでロケールの指定を、旧環境と合わせておいた方がよいので、確認しておきましょう。
また、dataフォルダは、後々いじることになるので、システムファイル配下よりも、別のところにフォルダを作ってあげた方が好ましいようです。
（私は何も考えず、そのままシステムファイル配下にインストールしてしまいましたが。。。）

### 3.コマンド実行前の準備

#### (1)initdbを実行する。
新しくインストールしたバージョンの方でコマンドを実行します。

```
"C:\Program Files\PostgreSQL\12\bin\initdb.exe" -D "C:\Program Files\PostgreSQL\12\data"
```

※ここで注意しておきたいことは、旧でinitdbしたオプションと、新でinitdbしたオプションが一致していなければなりません。ロケールの設定や照合順序等が、旧と新で一致していないと、移行ができなくなってしまいました。（経験済み）
旧の方で特になにもいじっていなければ、ここはスキップしてもよいかもしれません。

#### (2)パスワード設定ファイルを設定する。
Windowsユーザーであれば、`%APPDATA%\postgresql\`フォルダの`pgpass.conf`ファイルを変更します。

　　記載方法：hostname:port:database:username:password
　　　　　例：localhost:5432:postgres:postgres:password


#### (3)認証方式を一時的に変更する。
こちらは、旧と新どちらにも変更が必要になります。
pg_hba.confというファイルを書き換えます。
右側の`METHOD`という列にある`md5`という文字列を、全て`trust`に書き換えます。
一時的にと書いていますが、これでpsqlコマンド実行時に、ユーザー名とパスワードを入力しなくても済むようになるので、このままでもよい方は戻さなくても大丈夫です。

```pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
#host    replication     postgres        127.0.0.1/32            trust
#host    replication     postgres        ::1/128                 trust
```





#### (4) コマンドを実行する、前準備

###### フォルダを確認する。
コマンド実行時に指定するオプションとして、下記があります。
使用するフォルダが存在しているか、念の為確認しておきます。

|オプション|意味|
|:-----------:|:--------------------:|
|-d|旧PostgreSQLのdataフォルダ
|-D|新PostgreSQLのdataフォルダ
|-b|旧PostgreSQLのbinフォルダ
|-B|新PostgreSQLのbinフォルダ
|-p|旧のポート番号
|-P|新のポート番号
|-U|ユーザー名

他にも色々あるのですが、私の場合は、上記を指定しました。
本来は、-p. -Pはなくてもいけるらしいのですが、最初に実行した際に、サーバの起動で50432というポートを見に行っていたので、こちらもオプションで指定しました。

###### フォルダを移動する。
pg_upgradeを実行する際、`pg_upgrade_internal.log`というログファイルが出力されるのですが、それは作業ディレクトリに出力されるため、postgresユーザーでもログが出力できる場所に移動しておいてあげましょう。

###### サーバーを停止する。
旧・新どちらのPostgreSQLサーバーも停止状態にしておきます。

#### (5)いざ、実行
下記の場合は全てフルパスで指定していますが、binフォルダまでを環境変数にいれてあげて実行しても大丈夫です。
pg_upgrade.exeは、最新のバージョンの方で実行するようにします。

```
"C:\Program Files\PostgreSQL\12\bin\pg_upgrade.exe" -b "C:\Program Files\PostgreSQL\9.4\bin" -B "C:\Program Files\PostgreSQL\12\bin" -d "C:\Program Files\PostgreSQL\9.4\data" -D "C:\Program Files\PostgreSQL\12\data" -p 5432 -P 5432 -U postgres
```

アップグレードが完了しました。とでたら、終了です。
メッセージにも出てきますが、統計情報は移行されないみたいなので、メッセージに従ってバッチを実行する必要があるみたいです。今回は実行しませんでした。

pg_hba.confを戻して、終了です。

# 参考

- [postgresql pg_upgrade実施時に、connection to database failed: fe_sendauth: no password supplied が発生](https://www.monotalk.xyz/blog/postgresql-connection-to-database-failed-fe_sendauth-no-password-supplied/)
- [PostgreSQL 12.0文書](https://www.postgresql.jp/document/12/html/pgupgrade.html)
- [pg_upgrade を使ったDBクラスタ移行手順 on Windows](https://qiita.com/leon-joel/items/42eb018598052f8792af)