1. gishi_yama
Changes in title
-PostgreSQL9.4がインストールされたのでpg_upgradeしておく
+PostgreSQL9.4 から PostgreSQL9.5 に pg_upgrade する
Changes in tags
Changes in body
Source | HTML | Preview
@@ -1,33 +1,75 @@
-## 経緯
+**更新履歴**
-開発環境で`brew update; brew upgrade` したところ、リリースされたばかりのPostgreSQL9.4.0がインストールされたので、pg_upgradeして正常動作するようにしておく
+開発環境で`brew update; brew upgrade` したところ、PostgreSQLがリリースされたばかりのPostgreSQL9.5.0にアップグレードされたので、`pg_upgrade` でデータベースの内容を移行する
-## 方法
+## 前準備
-PostgreSQL9.3のデータフォルダを初期化したユーザをfoo(Macだとinitdbした管理者ユーザ)、PostgreSQL9.3のデータフォルダのパスを`/database/data93`と仮定する。
+`brew info postgresql` して、PostgreSQL9.4, 9.5 のインストール先を調べておく。ここでは、
-念のためPostgreSQL9.3の停止を確認してから、ターミナルで以下のように実行。
+- 9.4が `/usr/local/Cellar/postgresql/9.4.5_2`
+- 9.5が `/usr/local/Cellar/postgresql/9.5.0`
+だとする。
+
+また、
+
+- これまでのPostgreSQL9.4のPGDATAフォルダ(古いPGDATA)のパスを`/database/data94`
+- 新しく作るPostgreSQL9.5のPGDATAフォルダ(新しいPGDATA)のパスを`/database/data95`
+- PostgreSQLの管理ユーザ を`foo`(特に指定していなければログインしているユーザのはず)
+
+だとする。
+
+### (念のため)PostgreSQL9.4から9.5へのシンボリックリンクを切り替える
+
+原則、`brew upgrade`でアップグレードされた時に切り替わっているはずだが、念のため確認する
+
+```sh
+psql --version
+ # psql (PostgreSQL) 9.5.0 と表示
+ # もし9.4のままの場合は、brew switchなどでシンボリックリンクを修正
+ # ex) brew switch postgresql 9.5.0
```
-cd /database
-mkdir data94
-initdb --no-locale -E UNICODE -D data94 -U foo
+
+### (念のため)PostgreSQL9.4 を停止させる
+
+```sh
+/usr/local/Cellar/postgresql/9.4.5_2/bin/pg_ctl stop
```
-ここで、initdb
+## 新しいPGDATAのフォルダを作成し、初期化する
+
+PostgreSQL 9.5でinitdbする。このとき、
> 古いクラスタに合うように互換性があるinitdbのオプションを使用してください。
-と[ドキュメントに記載されている](https://www.postgresql.jp/document/current/html/pgupgrade.html)ので注意。(つまり9.3の時にinitdbしたのと同じオプションにする)
+と[ドキュメントに記載されている](https://www.postgresql.jp/document/current/html/pgupgrade.html)(つまり9.4の時にPGDATAフォルダをinitdbしたときと同様のオプションにする)ので注意する。本稿では、`--no-locale -E UNICODE -U foo`(ロケールなし、デフォルトエンコードはUTF8、DBのスーパユーザはfoo)としている。
+
+```sh
+mkdir /database/data95
+initdb -D /database/data95 --no-locale -E UNICODE -U foo
+```
+
+環境変数 `$PGDATA` のパスを古いPGDATAのフォルダから新しいPGDATAのフォルダに切り替えておく。
+
+```sh
+echo $PGDATA
+ # /database/data94 と表示される
+export PGDATA="/database/data95"
+ # .bash_profileなどで初期設定している場合は、そちらも変更
+```
+
+## pg_upgradeの実行
-pg_upgradeコマンドを使って、9.3のdataフォルダの内容を9.4に反映する。
+`pg_upgrade` コマンドを使って、古いPGDATAフォルダの内容を新しいPGDATAフォルダに反映する。
```bash
-pg_upgrade -d data93 -D data94 -b /usr/local/Cellar/postgresql/9.3.5_1/bin -B /usr/local/Cellar/postgresql/9.4.0/bin -U foo
+pg_upgrade -d /database/data94 -D /database/data95 -b /usr/local/Cellar/postgresql/9.4.5_2/bin -B /usr/local/Cellar/postgresql/9.5.0/bin -U foo
```
+実行例
+
```shell-session
Performing Consistency Checks
-----------------------------
Checking cluster versions ok
Checking database user is a superuser ok
@@ -81,35 +123,20 @@
Running this script will delete the old cluster's data files:
delete_old_cluster.sh
```
-エラーや中断を表すログが生じなければ成功
-
-最後に環境変数PGDATAのパスを修正して、動作確認と、pg_upgradeが生成してくれるanalyze_new_cluster.sh の実行をして終了
+エラーや中断を表すログが生じなければ成功している
-私の場合、環境変数PGDATAの参照先はこのパスへのシンボリックリンク:例えば`/database/data`にしているので、シンボリックリンクを作り直せば環境変数の設定は終了。
-
-```bash
-echo $PG_DATA
-```
+最後に、`pg_upgrade` が生成してくれる `analyze_new_cluster.sh` の実行をして終了。
-```shell-session
-/databases/data
-```
```bash
-rm data
-ln -s data94 data
pg_ctl start
-psql --version
-```
-
-```shell-session
-psql (PostgreSQL) 9.4.0
-```
-
-```bash
analyze_new_cluster.sh
+psql -l
+ # 9.4のデータベースの内容が移行されていることを確認
```
-なお、pg_upgradeが完了すると、古いデータフォルダ(上記の例であればdata93)を削除するshも吐いてくれるんだけど、実行するなりrmコマンドで古いデータを削除するか、念のために残しておくかはお好みで。
+なお、`pg_upgrade` は古いPGDATAのフォルダ(の例であれば `/database/data94`)を削除する`delete_old_cluster.sh` も吐きだしてくれる。これを実行して古いPGDATAフォルダを削除するか、念のために残しておくかはお好みで。
+
+`pg_hda.conf` や `postgresql.conf` は移行してくれないので、チューニングする必要があれば自分で修正する。
+