PostgreSQL13から14へバージョンアップ手順【pg_upgrade】

 

★悩み★
・PostgreSQL13からPostgreSQL14へバージョンアップする手順は?
・PostgreSQL13を14へアップグレード(バージョンアップ)する必要ある?
・pg_upgradeでバージョンアップする場合の使い方や注意点を知りたい。



こういった「悩み」に答えます。
 

★本記事の内容★
① PostgreSQLをバージョンアップ(アップグレード)する必要性と注意点
② PostgreSQL13から14へバージョンアップ(アップグレード)するための準備
③ pg_upgradeでPostgreSQL13からPostgreSQL14へバージョンアップ手順



これからご紹介する「PostgreSQL13から14へバージョンアップ手順【pg_upgrade】」を実践したことで、筆者は1時間以内でPostgreSQL13をPostgreSQL14 へバージョンアップ(アップグレード)できました。
 

記事の前半では「PostgreSQLを最新版へバージョンアップ(アップグレード)する必要性と注意点」を解説します。
記事の後半では「pg_upgradeコマンドを使い、PostgreSQL13からPostgreSQL14へバージョンアップ(アップグレード)する手順」を紹介します。
 

この記事を読み終えることで、「PostgreSQL13内のデータをPostgreSQL14に移行する方法」と「pg_upgradeコマンドの使い方」を把握した状態になります。

 

 


 

PostgreSQLをバージョンアップ(アップグレード)する必要性と注意点


「PostgreSQLをバージョンアップ(アップグレード)する必要性と注意点」に関してご紹介します。
 

そもそもPostgreSQLをバージョンアップせずに今のまま使い倒せばいいのでは?と考えている方必見です。



PostgreSQLをバージョンアップ(アップグレード)する必要性は、以下となります。
 

★PostgreSQLをバージョンアップ(アップグレード)する必要性★
・PostgreSQLのサポート期間は、バージョンリリースされてから5年間のみ
 → 5年経つとPostgreSQLの障害(バグや脆弱性)が修正されなくなる
 → セキュリティ問題(例:log4j)があったとしても、修正されない
 → 脆弱性を攻撃されてデータ破損やデータ漏洩の可能性がある
参照:PostgreSQLのサポート期間(PostgreSQL公式サイト)

 



PostgreSQLには、バージョンアップ(アップグレード)用のコマンド「pg_upgrade」が提供されています。
pg_upgradeコマンドの機能は、以下となります。
 

★pg_upgradeとは?★
PostgreSQLをインストールすると利用できるコマンドです。
pg_upgradeを実行することで、例えばPostgreSQL13からPostgreSQL14へのバージョンアップ(アップグレード)できます。
ただし、pg_upgradeの注意点としては、統計情報(クエリプランを作成する際に利用するデータ)は、移行されません。

参照:pg_upgradeのリファレンス(公式サイト)



最後に、PostgreSQLをバージョンアップ(アップグレード)する際の注意点に関して説明します。
 

★PostgreSQLをバージョンアップ(バージョンアップ)する際の注意点★
バージョンを数世代跨ぐバージョンアップの場合(例:PostgreSQL9から14など)、「パラメータ」や「関数/処理」の互換性が保たれていない場合があります。
多くのユーザ定義関数を作成してたり、多くのパラメータを変更してたりする場合、互換性や影響調査で時間を浪費しますので、論理バックアップ(pg_dump)の利用を検討してください。(下の記事参照)
参照:PostgreSQLのパラメータ一覧(PostgreSQL公式サイト)

 



以上が、「PostgreSQLをバージョンアップ(アップグレード)する必要性と注意点」となります。
 

PostgreSQLのセキュリティリスク観点から、できれば定期的にお使いのPostgreSQLのバージョンアップ(アップグレード)を検討しましょう。


 

PostgreSQL13から14へバージョンアップ(アップグレード)するための準備


「PostgreSQL13から14へバージョンアップ(アップグレード)するための準備」に関してご紹介します。
 

★PostgreSQL13からPostgreSQL14へバージョンアップするための準備★
手順1:PostgreSQL14をインストール
手順2:PostgreSQL14の動作確認



上記の流れで、「pg_upgradeコマンドを用いて、PostgreSQL13からPostgreSQL14へバージョンアップ(アップグレード)するための準備」ができます。
また、本記事では、PostgreSQL13とPostgreSQL14を同一環境にインストールした前提で、手順を説明します。(下図参照)
 

PostgreSQL13とPostgreSQL14を同一環境にインストール


 

上記の各手順は、以下の日時と環境で動作確認済みです。
動作確認済み日時:2021年11月7日
動作確認済み環境:CentOS Linux release 7.7.1908 (Core)



以降で、上記「PostgreSQL13からPostgreSQL14へバージョンアップするための準備」の各手順に関してご説明します。
 

手順1:PostgreSQL14をインストール

「手順1:PostgreSQL14をインストール」に関してご説明します。
 

PostgreSQL13からPostgreSQL14へバージョンアップ(アップグレード)するために、PostgreSQL14をインストールしましょう。



「PostgreSQL14のインストール手順」に関しては、以下の記事をご覧ください。
 


 

既にPostgreSQL14をインストールされている方は、本手順を省略してください。



以上で、「手順1:PostgreSQL14をインストール」は完了です。
 

手順2:PostgreSQL14の動作確認

「手順2:PostgreSQL14の動作確認」に関してご説明します。
 

PostgreSQL14が正常に動作するかを確認しましょう。



「PostgreSQL14が起動できるか」を確認し、PostgreSQLが正常に動作することを確認してください。
確認手順に関しては、以下の記事をご覧ください。
 



以上で、「手順2:PostgreSQL14の動作確認」は完了です。
 

上記の流れで、PostgreSQL13からPostgreSQL14へバージョンアップ(アップグレード)するための準備ができました。


 

pg_upgradeでPostgreSQL13からPostgreSQL14へバージョンアップ手順


「pg_upgradeでPostgreSQL13からPostgreSQL14へバージョンアップ手順」に関してご紹介します。
 

★pg_upgradeでPostgreSQL13から14へバージョンアップする流れ★
手順1:PostgreSQL13とPostgreSQL14を停止
手順2:PostgreSQL14の設定ファイルを編集
手順3:PostgreSQL14の「pg_upgradeコマンド」で13からバージョンアップ
手順4:PostgreSQL14を起動
手順5:バージョンアップしたPostgreSQL14に統計情報を登録
手順6:PostgreSQL13からバージョンアップしたPostgreSQL14の動作確認
手順7:PostgreSQL13内のデータを削除



上記の流れで、「pg_upgradeコマンドを用いて、PostgreSQL13からPostgreSQL14へバージョンアップ(アップグレード)」できます。
また、上記手順で以下の「PostgreSQL13内に格納されたデータをPostgreSQL14へ移行(データ移行)」を実現できます。(下図参照)
 

PostgreSQL13内のテーブルなどのデータをPostgreSQL14へ移行


 

上記の各手順は、以下の日時と環境で動作確認済みです。
動作確認済み日時:2021年11月7日
動作確認済み環境:CentOS Linux release 7.7.1908 (Core)



以降で、上記「pg_upgradeでPostgreSQL13から14へバージョンアップする流れ」の各手順に関してご説明します。
 

手順1:PostgreSQL13とPostgreSQL14を停止

「手順1:PostgreSQL13とPostgreSQL14を停止」に関して解説します。
 

PostgreSQLのアップグレードコマンド「pg_upgrade」を実行するために、PostgreSQL13とPostgreSQL14を停止させる必要があります。



PostgreSQL13とPostgreSQL14を停止するために、以下のコマンドを順に実行してください。

#  systemctl stop postgresql-13.service
#  systemctl stop postgresql-14.service



以上で、「手順1:PostgreSQL13とPostgreSQL14を停止」は完了です。
 

手順2:PostgreSQL14の設定ファイルを編集

「手順2:PostgreSQL14の設定ファイルを編集」に関して解説します。
 

PostgreSQLのアップグレードコマンド「pg_upgrade」を実行するために、PostgreSQL14の設定ファイルを編集する必要があります。



PostgreSQLの設定ファイルの1つである「pg_hba.conf」を編集しましょう。
見直すべき設定値は、以下となります。

↓↓ 接続のルールを変更(今回は、以下に変更) ↓↓
# "local" is for Unix domain socket connections only
local   all             all                                     trust
# 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.
local   replication     all                                     scram-sha-256
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256



ちなみに、上記を設定せずに「pg_upgradeコマンド」を実行した場合、以下のエラーが発生します。

ソケット"/var/lib/pgsql/work/.s.PGSQL.50432"上でのサーバーへの接続に失敗しました: fe_sendauth: no password supplied

以下のコマンドで起動した移行先postmasterに接続できませんでした:
"/usr/pgsql-14/bin/pg_ctl" -w -l "pg_upgrade_server.log" -D "/var/lib/pgsql/14/data" -o "-p 50432 -b -c synchronous_commit=off -c fsync=off -c full_page_writes=off -c vacuum_defer_cleanup_age=0  -c listen_addresses='' -c unix_socket_permissions=0700 -c unix_socket_directories='/var/lib/pgsql/work'" start
失敗しました、終了しています



以上で、「手順2:PostgreSQL14の設定ファイルを編集」は完了です。
 

手順3:PostgreSQL14の「pg_upgradeコマンド」で13からバージョンアップ

『手順3:PostgreSQL14の「pg_upgradeコマンド」で13からバージョンアップ』に関して解説します。
 

PostgreSQL14にバージョンアップ(アップグレード)するために、PostgreSQL14に同梱された「pg_upgradeコマンド」を実行します。



PostgreSQL13からPostgreSQL14にバージョンアップ(アップグレード)するために、以下のコマンドを実行してください。
コマンド内のPATHに関しては、適宜自分用に書き換えてください。

[root@data-manager postgres]# su - postgres
-bash-4.2$ /usr/pgsql-14/bin/pg_upgrade -d /var/lib/pgsql/13/data  -D /var/lib/pgsql/14/data -b /usr/pgsql-13/bin -B /usr/pgsql-14/bin
整合性チェックを実行しています。
-----------------------------
Checking cluster versions                                   ok
・
・
・
アップグレードが完了しました
----------------
オプティマイザーの統計情報は、pg_upgrade では転送されません。
新サーバーを起動した後、以下のコマンドを実行することを検討してください:
    /usr/pgsql-14/bin/vacuumdb --all --analyze-in-stages

このスクリプトを実行すると、旧クラスタのデータファイル ./delete_old_cluster.shが削除されます:

-bash-4.2$ echo $?
0
-bash-4.2$ 



pg_upgradeコマンド実行後、「0」が表示された場合、「正常にPostgreSQL13から PostgreSQL14にバージョンアップ(アップグレード)できた」と判断できます。
 

ちなみに、「pg_upgradeコマンド」のコマンドリファレンスは以下となります。
 

★pg_upgradeのコマンドリファレンス★
pg_upgrade -d <移行元のデータPATH> -D <移行先のデータPATH>
-b <移行元のbinのPATH> -B <移行先のbinのPATH>

さらに詳細を知りたい方は、以下の公式サイトから確認してください。
参照:pg_upgradeのリファレンス(公式サイト)



以上で、『手順3:PostgreSQL14の「pg_upgradeコマンド」で13からバージョンアップ』は完了です。
 

手順4:PostgreSQL14を起動

「手順4:PostgreSQL14を起動」に関して解説します。
 

データ移行先のPostgreSQL14を起動してみましょう。



データ移行先のPostgreSQL14を起動するために、以下のコマンドを実行してください。
 

#  systemctl start postgresql-14.service



以上で、「手順4:PostgreSQL14を起動」は完了です。
 

手順5:バージョンアップしたPostgreSQL14に統計情報を登録

「手順5:バージョンアップしたPostgreSQL14に統計情報を登録」に関して解説します。
 

PostgreSQL13に格納された統計情報(クエリプラン作成時に利用)は、pg_upgradeコマンドを実行してもPostgreSQL14へ移行されません。



PostgreSQL14に統計情報を登録するために、以下のコマンドを順に実行してください。

[root@data-manager postgres]# su - postgres
-bash-4.2$ /usr/pgsql-14/bin/vacuumdb --all --analyze-in-stages
vacuumdb: データベース"postgres"の処理中です: 最適化のための情報を最小限生成します(1対象)
vacuumdb: データベース"routefinder"の処理中です: 最適化のための情報を最小限生成します(1対象)
vacuumdb: データベース"template1"の処理中です: 最適化のための情報を最小限生成します(1対象)
vacuumdb: データベース"postgres"の処理中です: 最適化のための情報を複数生成します(10対象)
vacuumdb: データベース"routefinder"の処理中です: 最適化のための情報を複数生成します(10対象)
vacuumdb: データベース"template1"の処理中です: 最適化のための情報を複数生成します(10対象)
vacuumdb: データベース"postgres"の処理中です: 最適化のための情報をデフォルト数(全て)生成します
vacuumdb: データベース"routefinder"の処理中です: 最適化のための情報をデフォルト数(全て)生成します
vacuumdb: データベース"template1"の処理中です: 最適化のための情報をデフォルト数(全て)生成します
-bash-4.2$ echo $?
0
-bash-4.2$ 



コマンド実行後、「0」が表示された場合、「正常にバージョンアップ(アップグレード)したPostgeSQL14に統計情報を登録できた」と判断できます。
 

以上で、「手順5:バージョンアップしたPostgreSQL14に統計情報を登録」は完了です。
 

手順6:PostgreSQL13からバージョンアップしたPostgreSQL14の動作確認

「手順6:PostgreSQL13からバージョンアップしたPostgreSQL14の動作確認」に関して解説します。
 

PostgreSQL13からPostgreSQL14にバージョンアップ後、PostgreSQL14にデータが移行されたことを確認しましょう。



PostgreSQL13からバージョンアップしたPostgreSQL14内に「移行したデータ」があることを確認するために、以下のコマンドを順に実行してください。

[root@data-manager postgres]# su - postgres
-bash-4.2$ psql
postgres=# \c routefinder
routefinder=# \d
 public   | route_data | テーブル | postgres


routefinder=# select count(*) from route_data;
 10286

routefinder=# 



コマンド実行後、「PostgreSQL13内にあったデータが表示された」場合、「正常にPostgreSQL14にデータ移行できた」と判断できます。
 

以上で、「手順6:PostgreSQL13からバージョンアップしたPostgreSQL14の動作確認」は完了です。
 

手順7:PostgreSQL13内のデータを削除

「手順7:PostgreSQL13内のデータを削除」に関して解説します。
 

移行元のPostgreSQL内に存在するデータが不必要である場合は、削除しておきましょう。



移行元のPostgreSQL内に存在するデータを削除するために、以下のコマンドを順に実行してください。
ちなみに、delete_old_cluster.shは、pg_upgradeコマンドを実行したディレクトリ内に作成されます。

-bash-4.2$ cat delete_old_cluster.sh 
#!/bin/sh

rm -rf '/var/lib/pgsql/13/data'
-bash-4.2$ ./delete_old_cluster.sh 
-bash-4.2$ echo $?
0
-bash-4.2$ 



コマンド実行後、「0」が表示された場合、「正常に移行元のデータを削除できた」と判断できます。
 

以上で、「手順7:PostgreSQL13内のデータを削除」は完了です。
 

上記の流れで、pg_upgradeコマンドを用いて、PostgreSQL13からPostgreSQL14へバージョンアップ(アップグレード)できました。



ちなみに、「PostgreSQLのアーキテクチャを体系的に学びたい」や「その他のPostgreSQLのコマンドを知りたい」方は、以下の参考書がオススメです。


 

【まとめ】PostgreSQL13から14へバージョンアップ手順【pg_upgrade】


いかがでしたでしょうか?
PostgreSQL13からPostgreSQL14へアップグレードする為に必要な事前準備、pg_upgradeコマンドを使ったバージョンアップ(アップグレード)の進め方を解説し、以下の悩みを解決しました。
 

★悩み★
・PostgreSQL13からPostgreSQL14へバージョンアップする手順は?
・PostgreSQL13を14へアップグレード(バージョンアップ)する必要ある?
・pg_upgradeでバージョンアップする場合の使い方や注意点を知りたい。



適切に「pg_hba.conf」を設定し、PostgreSQLのコマンド「pg_upgrade」を実行することで、簡単にPostgreSQLのアップグレードを実現できます。
ぜひあなたも本記事を参考に「pg_upgradeコマンドを使ってPostgreSQL13からPostgreSQL14へのバージョンアップ(アップグレード)」を実践してください。