1. gishi_yama

    Posted

    gishi_yama
Changes in title
+PostgreSQL9.4がインストールされたのでpg_upgradeしておく
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,103 @@
+## 経緯
+
+開発環境で`brew update; brew upgrade` したところ、リリースされたばかりのPostgreSQL9.4.0がインストールされたので、pg_upgradeして正常動作するようにしておく。
+
+## 方法
+
+PostgreSQL9.3のデータフォルダを初期化したユーザをfoo(Macだとinitdbした管理者ユーザ)、PostgreSQL9.3のデータフォルダのパスを`/database/data93`と仮定する。
+
+念のためPostgreSQL9.3の停止を確認してから、ターミナルで以下のように実行。
+
+```
+cd /database
+mkdir data94
+initdb --no-locale -E UNICODE -D data94 -U foo
+```
+
+ここで、initdbは
+
+> 古いクラスタに合うように互換性があるinitdbのオプションを使用してください。
+
+と[ドキュメントに記載されている](https://www.postgresql.jp/document/current/html/pgupgrade.html)ので注意。(つまり9.3の時にinitdbしたのと同じオプションにする)
+
+pg_upgradeコマンドを使って、9.3のdataフォルダの内容を9.4に反映する。
+
+```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
+```
+
+```shell-session
+Performing Consistency Checks
+-----------------------------
+Checking cluster versions ok
+Checking database user is a superuser ok
+Checking for prepared transactions ok
+Checking for reg* system OID user data types ok
+Checking for contrib/isn with bigint-passing mismatch ok
+Checking for invalid "line" user columns ok
+Creating dump of global objects ok
+Creating dump of database schemas
+ ok
+Checking for presence of required libraries ok
+Checking database user is a superuser ok
+Checking for prepared transactions ok
+
+If pg_upgrade fails after this point, you must re-initdb the
+new cluster before continuing.
+
+Performing Upgrade
+------------------
+Analyzing all rows in the new cluster ok
+Freezing all rows on the new cluster ok
+Deleting files from new pg_clog ok
+Copying old pg_clog to new server ok
+Setting next transaction ID and epoch for new cluster ok
+Deleting files from new pg_multixact/offsets ok
+Copying old pg_multixact/offsets to new server ok
+Deleting files from new pg_multixact/members ok
+Copying old pg_multixact/members to new server ok
+Setting next multixact ID and offset for new cluster ok
+Resetting WAL archives ok
+Setting frozenxid and minmxid counters in new cluster ok
+Restoring global objects in the new cluster ok
+Adding support functions to new cluster ok
+Restoring database schemas in the new cluster
+ ok
+Creating newly-required TOAST tables ok
+Removing support functions from new cluster ok
+Copying user relation files
+ ok
+Setting next OID for new cluster ok
+Sync data directory to disk ok
+Creating script to analyze new cluster ok
+Creating script to delete old cluster ok
+
+Upgrade Complete
+----------------
+Optimizer statistics are not transferred by pg_upgrade so,
+once you start the new server, consider running:
+ analyze_new_cluster.sh
+
+Running this script will delete the old cluster's data files:
+ delete_old_cluster.sh
+
+```
+
+エラーや中断を表すログが生じなければ成功。
+
+最後に環境変数PGDATAのパスを修正して、動作確認。
+
+なお、私の場合、環境変数PGDATAの参照先はこのパスへのシンボリックリンク:例えば`/database/data`にしているので、シンボリックリンクを作り直せば終了。
+
+```bash
+rm data
+ln -s data94 data
+pg_ctl start
+psql --version
+```
+
+```shell-session
+psql (PostgreSQL) 9.4.0
+```
+
+なお、pg_upgradeが完了すると、古いデータフォルダ(上記の例であればdata93)を削除するshを吐いてくれるんだけど、実行するなりrmコマンドで古いデータを削除するか、念のために残しておくかはお好みで。