RHEL7/CentOS7 環境で OSのリポジトリにある PostgreSQL 9.2 を使っている。
こいつを PostgreSQL のリポジトリにある PostgreSQL 9.6 にバージョンアップしたい。
ネット上によくあるバージョンアップの手順を参考にすれば良いが、大きく手法が2つある。
ひとつは DB全ダンプしておき、新環境にリストアする方法。
もうひとつは、PostgreSQL 付属の pg_upgrade コマンドで DBアップグレードする方法。今回はこちらの方法を使う。楽だから。
まずは yum で使うリポジトリファイルをインストールする。
https://yum.postgresql.org/repopackages/ から選ぶ。
そして本体インストール。
yum --enablerepo=pgdg96 install postgresql96-server
OS リポジトリに入ってる PostgreSQL 9.2 が入ってる環境に postgresql96-server をインストールすると、途中注意のメッセージが出る。
PostgreSQL リポジトリのパッケージからインストールすると、複数バージョンを切り替えできるように /usr/bin などにあるファイルは実体へのリンクとなる。
けど OS リポジトリに入ってる PostgreSQL 9.2 は複数バージョンの切り替えとかそんなん知らないから /usr/bin にはファイル実体がある。
リンクファイルを作ろうとしたところに実体があるからリンクは作成しませんよ、みたいなメッセージが出る。現時点ではこれは無視して進む。
次にDBの準備をする。
注意点は旧環境とロケールは合わせておく。例えば旧環境が en_US.UTF-8 だったとすると、
/usr/pgsql-9.6/bin/initdb --encoding=en_US.UTF-8
DBの準備ができたら、旧バージョンから持ってこれるかチェックする。
/usr/pgsql-9.6/bin/pg_upgrade -c -d /var/lib/pgsql/data -D /var/lib/pgsql/9.6/data -b /usr/bin/ -B /usr/pgsql-9.6/bin/
オプション -c をつけると実際の実行はしないでチェックだけする。ここで失敗するはず。旧バージョン側の起動ができないという理由で。どうやら unix_socket_directory オプションがまずいとのこと。
これは pg_upgrade にパッチを当てることで解消する。
素敵な記事があるので参考にする pg_upgradeでつまずいた - tmegos blog
PostgreSQL 9.6.22 で試したところ、パッチ当てる部分の表記が微妙に違った。
src/bin/pg_upgrade/server.c ファイル中
(GET_MAJOR_VERSION(cluster->major_version) <= 902) ?
となっているところを
(GET_MAJOR_VERSION(cluster->major_version) < 900) ?
と変更して ./configure && make する。これで pg_upgrade が動く。
pg_upgrade が終わったら、最初に放置していたリンクの解決。
素敵な記事があるので参考にする CentOS7にpostgresqlを9.xと10.xを共存させた場合の注意点 - Qiita
上記リンク先の記事は 9.xと10.xを共存させた場合について書いてあるが、これはバージョンの問題ではなくて OS 標準リポジトリのものと PostgreSQL リポジトリのものを混在させた時の話なので、今回の場合も上記リンク先の手法で解決できる。
これで PostgreSQL 9.2 → 9.6 ができた。