pg_upgradeでPostgreSQL12を13へアップグレードする方法

PostgreSQL 12 から 13へアップグレードする手順(pg_upgrade)

 

★悩み★
・PostgreSQL 12 のデータベースを 13 へデータ移行できないかな?
・PostgreSQL 12 から PostgreSQL 13 へアップグレードする手順は?
・pg_upgradeを使って、PostgreSQLをアップグレードできるのか?



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

★本記事の内容★
① pg_upgradeコマンドとは?
➁ PostgreSQL 12 から 13へアップグレードするための準備
➂ PostgreSQL 12 から 13へアップグレード(pg_upgrade)する手順



これからご紹介する手順を実践したことで、筆者は1時間以内でPostgreSQL 12 をPostgreSQL 13 へアップグレードできました。
 

記事の前半では「PostgreSQL 12 から 13へアップグレードするための準備」を解説します。記事の後半では「PostgreSQL 12 から 13へアップグレード(pg_upgrade)する手順」を紹介します。
 

この記事を読み終えることで、「PostgreSQL 12に格納したデータをPostgreSQL 13に移行できる」状態になります。


 

 


 

pg_upgradeコマンドとは?【アップグレード用のコマンド】


PostgreSQL専用のコマンドです。pg_upgradeを実行することで、PostgreSQLのアップグレードを実現できます。

pg_upgradeコマンドに指定できるオプションなどに関して詳細に知りたい方は、以下の公式ドキュメントをご覧ください。

>> pg_upgradeのリファレンス(公式サイト)
 

また、pg_upgradeを用いたPostgreSQL 13 から 14 へバージョンアップする手順に関しては知りたい方は、以下の記事をご覧ください。

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

以降では、PostgreSQL 12 からPostgreSQL 13をサンプルとしてpg_upgradeの使い方を解説します。


 

PostgreSQL 12 から 13へアップグレードするための準備


「PostgreSQL 12 から 13へアップグレードするための準備」に関してご紹介します。
 

【PostgreSQL 12 から 13へアップグレードするための準備
手順1:PostgreSQL 13 をインストール
手順2:PostgreSQL 13 の動作確認



上記の流れで、「PostgreSQL 12 から 13へアップグレードするための準備」ができます。また、アップグレード環境は、以下となります。(下図参照)
 

PostgreSQL 12 から 13へアップグレードするための準備


 

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



以降で、上記「PostgreSQL 12 から 13へアップグレードするための準備」の各手順に関してご説明します。
 

手順1:PostgreSQL 13 をインストール

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

PostgreSQL 13へアップグレード(データ移行)するために、PostgreSQL 13をインストールしましょう。



お使いのパソコンにPostgreSQL 13 をインストールされていない方は、以下の記事を参考にしインストールしましょう。

>>【Linux向け】5ステップでPostgreSQL13をインストールする方法

>>【5分でわかる】Windows版PostgreSQLのインストール方法


 

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



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

手順2:PostgreSQL 13 の動作確認

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

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



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

>>【Linux向け】5ステップでPostgreSQL13をインストールする方法

>>【5分でわかる】Windows版PostgreSQLのインストール方法



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

上記の流れで、PostgreSQL 12 から 13へアップグレード(データ移行)するための準備ができました。


 

PostgreSQL 12 から 13へアップグレード(pg_upgrade)する手順


「PostgreSQL 12 から 13へアップグレード(pg_upgrade)する手順」に関してご紹介します。
 

【PostgreSQL 12 から 13へアップグレード(pg_upgrade)する流れ】
手順1:PostgreSQL 12 と PostgreSQL 13 を停止
手順2:PostgreSQL 13 の設定ファイルを編集
手順3:PostgreSQL 13 に同梱された「pg_upgrade」を実行
手順4:PostgreSQL 13 を起動
手順5:アップグレード(データ移行)したPostgeSQL 13 に統計情報を登録
手順6:アップグレード(データ移行)したPostgeSQL 13の動作確認
手順7:PostgreSQL 12 内のデータを削除



上記の流れで、「PostgreSQL 12 から PostgreSQL 13 へアップグレード(データ移行)」できます。また、上記手順で以下の「アップグレード(データ移行)」を実現できます。(下図参照)
 

PostgreSQL 12 から 13へアップグレード(pg_upgrade)する手順


 

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



以降で、上記「PostgreSQL 12 から 13へアップグレード(pg_upgrade)する流れ」の各手順に関してご説明します。
 

手順1:PostgreSQL 12 と PostgreSQL 13 を停止

「手順1:PostgreSQL 12 と PostgreSQL 13 を停止」に関して解説します。
 

PostgreSQLのアップグレードコマンド「pg_upgrade」を実行するために、PostgreSQLを停止させましょう。



以下の方法でPostgreSQL 12 と PostgreSQL 13 を停止してください。

・CentOSやRHEL(Red Hat Enterprise Linux)向け
#  systemctl stop postgresql-12.service
#  systemctl stop postgresql-13.service

・Ubuntu向け
$ sudo /etc/init.d/postgresql stop

・Windows向け
Windowsのサービス管理画面で停止



以上で、「手順1:PostgreSQL 12 と PostgreSQL 13 を停止」は完了です。
 

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

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

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



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」を実行した場合、以下のエラーが発生しpg_upgradeコマンドが失敗します。

以下のコマンドで起動した移行先postmasterに接続できませんでした:
"/usr/pgsql-13/bin/pg_ctl" -w -l "pg_upgrade_server.log" -D "/var/lib/pgsql/13/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/tmp'" start
失敗しました、終了しています



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

手順3:PostgreSQL 13 に同梱された「pg_upgrade」を実行

「手順3:PostgreSQL 13 に同梱された「pg_upgrade」を実行」に関して解説します。
 

PostgreSQL 13 にアップグレード(データ移行)するために、PostgreSQL 13 に同梱された「pg_upgrade」を実行します。



PostgreSQL 12 から PostgreSQL 13 にアップグレードするために、PostgreSQLの管理ユーザーでログインしてください。

・CentOS/RHEL(Red Hat Enterprise Linux)/Ubuntu向け
# su - postgres

・Windows向け
実施不要


PostgreSQL管理ユーザーで以下のコマンドを実行してください。PATHに関しては、適宜自分用に書き換えてください。

-bash-4.2$ /usr/pgsql-13/bin/pg_upgrade -d /var/lib/pgsql/12/data  -D /var/lib/pgsql/13/data -b /usr/pgsql-12/bin -B /usr/pgsql-13/bin
整合性チェックを実行しています。
・
・
・
アップグレードが完了しました
----------------
オプティマイザーの統計は、pg_upgrade では転送されません。そのため
新サーバーを起動した後、./analyze_new_cluster.sh を動かすことを検討してください。


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

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



コマンド実行後、「0」が表示された場合、「正常にPostgreSQL 12 から PostgreSQL 13 にアップグレード(データ移行)できた」と判断できます。
 

【よくあるエラーその①】
「cannot be run as root」のエラーが出力され、pg_upgradeコマンドが失敗した場合、スーパーユーザーで実行していることが原因です。

 

【よくあるエラーその➁】
「pg_upgrade command not found」のエラーが出力された場合、pg_upgradeのPATHが間違っています。findやwhereコマンドでpg_upgradeが格納されているPATHを確認しましょう。



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

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

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



以上で、「手順3:PostgreSQL 13 に同梱されたpg_upgradeを実行」は完了です。
 

手順4:PostgreSQL 13 を起動

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

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



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

・CentOSやRHEL(Red Hat Enterprise Linux)向け
#  systemctl start postgresql-13.service

・Ubuntu向け
$ sudo /etc/init.d/postgresql start

・Windows向け
Windowsのサービス管理画面で起動



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

手順5:アップグレード(データ移行)したPostgeSQL 13 に統計情報を登録

「手順5:アップグレード(データ移行)したPostgeSQL 13 に統計情報を登録」に関して解説します。
 

PostgreSQL 12 に格納された統計情報は、pg_upgradeを実行しても移行されません。



PostgreSQL 13 に統計情報を登録するために、以下のコマンドを順に実行してください。ちなみに、analyze_new_cluster.shは、pg_upgradeを実行したディレクトリ内に作成されます。

・CentOS/RHEL(Red Hat Enterprise Linux)/Ubuntu向け
-bash-4.2$ ls
analyze_new_cluster.sh  delete_old_cluster.sh  loadable_libraries.txt
-bash-4.2$ ./analyze_new_cluster.sh 
This script will generate minimal optimizer statistics rapidly
so your system is usable, and then gather statistics twice more
with increasing accuracy.  When it is done, your system will
have the default level of optimizer statistics.
・
・
・
vacuumdb: データベース"testdb"の処理中です: 最適化のための情報をデフォルト数(全て)生成します

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

・Windowsの場合
analyze_new_cluster.batをダブルクリック



コマンド実行後、「0が表示された」または「エラーが出力されなかった」場合、「正常にアップグレード(データ移行)したPostgeSQL 13 に統計情報を登録できた」と判断できます。
 

以上で、「手順5:アップグレード(データ移行)したPostgeSQL 13 に統計情報を登録」は完了です。
 

手順6:アップグレード(データ移行)したPostgeSQL 13の動作確認

「手順6:アップグレード(データ移行)したPostgeSQL 13の動作確認」に関して解説します。
 

アップグレード(データ移行)したPostgeSQL 13内に移行したデータがあることを確認しましょう。



アップグレード(データ移行)したPostgeSQL 13内に「移行したデータ」があることを確認するために、以下のコマンドを順に実行してください。

-bash-4.2$ psql
postgres-# \c testdb
testdb-# \t
「タプルのみ表示」は on です。
testdb-# \d
 public   | mymovie     | テーブル | postgres
 public   | seo_ranking | テーブル | postgres

testdb=# select * from mymovie;
  1 | a
  2 | b
  2 | b
  2 | b
  2 | b
  2 | b
  2 | b
  2 | b
  2 | c
  2 | c

testdb=# 



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

以上で、「手順6:アップグレード(データ移行)したPostgeSQL 13の動作確認」は完了です。
 

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

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

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



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

・CentOS/RHEL(Red Hat Enterprise Linux)/Ubuntu向け
-bash-4.2$ cat delete_old_cluster.sh 
#!/bin/sh

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

・Windowsの場合
delete_old_cluster.batをダブルクリック



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

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

上記の流れで、PostgreSQL 12 から PostgreSQL 13へアップグレード(データ移行)ができました。



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


 

【まとめ】PostgreSQL 12 から 13へアップグレードする手順(pg_upgrade)

【まとめ】PostgreSQL 12 から 13へアップグレードする手順(pg_upgrade)


今回の記事を通して、「PostgreSQL 12 から 13へアップグレードする手順(pg_upgrade)」をご紹介することで、以下の悩みを解消しました。
 

★悩み★
・PostgreSQL 12 のデータベースを 13 へデータ移行できないかな?
・PostgreSQL 12 から PostgreSQL 13 へアップグレードする手順は?
・pg_upgradeを使って、PostgreSQLをアップグレードできるのか?



PostgreSQL 12 から PostgreSQL 13へアップグレード(データ移行)する手順?」で悩んでいるあなたにこの記事が少しでも役に立てれば幸いです。
 

 


 

タイトルとURLをコピーしました