PostgreSQLバージョンアップ(9.6→14.7)

PostgreSQL database

自宅の開発環境を漸くバージョンアップしたので備忘録として書きました。

環境

  • Windows11(22H2)
  • Windws Server 2022 Standard(21H2)

いずれもDebian11で動かしているVirtual Box上の仮想マシンです。

新バージョンのPostgreSQLインストール

今回私は14.7を選択しました(15はスキーマの取り扱いが変わるのでまたの機会に)。いずれのプラットフォームでもこちらから入手できます。

この後の作業で新旧両方のDBを並行稼働させますから、新DBのポート番号は旧DBと異なるポート番号を指定しましょう。

pg_hba.conの編集

移行元・移行先ともpg_hba.confのMETHODを全てtrustに変更します。変更前にオリジナルのバックアップを忘れないようにしましょう。あと、サービスの再起動もお忘れなく。

作業用ディレクトリ作成

旧DBの内容を取り出し保存する先を作成します。今回私はCドライブ直下にworkというフォルダを作りEveryoneフルコントロールとしました。

pg_upgrade実行

ここまでの準備だけで引っ越し作業をまるっと行ってくれるpg_upgrade.exeという非常に便利なツールがあります。

pg_upgrade.exe

あとはこれを実行するだけです。

公式ドキュメントでは上記のように記述されていますが、コマンドプロンプトを管理者として実行し、下記要領でユーザー名を指定して実行すればうまくいきました。

pg_upgrade -U postgres -d 旧データベースクラスタのパス -D 新データベースクラスタのパス -b 旧データベースbinディレクトリのパス -B 新データベースbinディレクトリのパス

その際、先ほど作成した作業用ディレクトリへ移動してから実行します。私の環境ではこんな感じです。

cd C:\work
"C:\Program Files\PostgreSQL\bin\pg_upgrade.exe" -U postgres -d "C:\Program Files\PostgreSQL.6\data" -D "C:\Program Files\PostgreSQL\data" -b "C:\Program Files\PostgreSQL.6\bin" -B "C:\Program Files\PostgreSQL\bin"

ターンッ(Enterキー)

整合性チェックを実行しています。
-----------------------------
Checking cluster versions                                   ok
Checking database user is the install user                  ok
Checking database connection settings                       ok
Checking for prepared transactions                          ok
Checking for system-defined composite types in user tables  ok
Checking for reg* data types in user tables                 ok
Checking for contrib/isn with bigint-passing mismatch       ok
Checking for user-defined encoding conversions              ok
Checking for user-defined postfix operators                 ok
Checking for incompatible polymorphic functions             ok
Checking for tables WITH OIDS                               ok
Checking for invalid "sql_identifier" user columns          ok
Checking for invalid "unknown" 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 the install user                  ok
Checking for prepared transactions                          ok
Checking for new cluster tablespace directories             ok

この後pg_upgradeが失敗した場合は、続ける前に新しいクラスタを
initdbで再作成する必要があります。

アップグレードを実行しています。
------------------
Analyzing all rows in the new cluster                       ok
Freezing all rows in the new cluster                        ok
Deleting files from new pg_xact                             ok
Copying old pg_clog to new server                           ok
Setting oldest XID for new cluster                          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
Restoring database schemas in the new cluster
                                                            ok
ユーザーリレーションのファイルをコピーしています
                                                            ok
Setting next OID for new cluster                            ok
Sync data directory to disk                                 ok
Creating script to delete old cluster                       ok
Checking for hash indexes                                   ok
Checking for extension updates                              notice

環境にALTER EXTENSIONコマンドで更新すべき機能拡張があります。以下のファイル
    update_extensions.sql
を、psqlを使用してデータベースのスーパーユーザーとして実行することで、これらの機能拡張
が更新されます。


アップグレードが完了しました
----------------
オプティマイザーの統計情報は、pg_upgrade では転送されません。
新サーバーを起動した後、以下のコマンドを実行することを検討してください:
    C:/Program Files/PostgreSQL/14/bin/vacuumdb -U postgres --all --analyze-in-stages

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


c:\work>

後はupdate_extensions.sqlとvacuumdbの実行だけですが、これらを実行する前に新DBのpostgresql.confを編集してポートを5432へ戻しておきます。このタイミングでpg_hba.confを修正しても問題ありませんが、他から繋ぎに来られる可能性があるのであれば後回しにしましょう。

update_extensions.sql実行

ここまでの作業でサービスは停止していますので、ポートを変更したらサービスを起動します。update_extensions.sqlの中身は「ALTER EXTENSION “adminpack” UPDATE;」だけですのでpostgresでログインして直接実行しても構いません。

vacuumdb実行

後はvacuumdbの実行です(DB名を***で伏せています)。

c:\work>"C:/Program Files/PostgreSQL/14/bin/vacuumdb" -U postgres --all --analyze-in-stages
vacuumdb: データベース"***"の処理中です: 最適化のための情報を最小限生成します(1対象)
vacuumdb: データベース"***"の処理中です: 最適化のための情報を最小限生成します(1対象)
vacuumdb: データベース"***"の処理中です: 最適化のための情報を最小限生成します(1対象)
vacuumdb: データベース"***"の処理中です: 最適化のための情報を最小限生成します(1対象)
vacuumdb: データベース"***"の処理中です: 最適化のための情報を最小限生成します(1対象)
vacuumdb: データベース"postgres"の処理中です: 最適化のための情報を最小限生成します(1対象)
vacuumdb: データベース"template1"の処理中です: 最適化のための情報を最小限生成します(1対象)
vacuumdb: データベース"***"の処理中です: 最適化のための情報を複数生成します(10対象)
vacuumdb: データベース"***"の処理中です: 最適化のための情報を複数生成します(10対象)
vacuumdb: データベース"***"の処理中です: 最適化のための情報を複数生成します(10対象)
vacuumdb: データベース"***"の処理中です: 最適化のための情報を複数生成します(10対象)
vacuumdb: データベース"***"の処理中です: 最適化のための情報を複数生成します(10対象)
vacuumdb: データベース"postgres"の処理中です: 最適化のための情報を複数生成します(10対象)
vacuumdb: データベース"template1"の処理中です: 最適化のための情報を複数生成します(10対象)
vacuumdb: データベース"***"の処理中です: 最適化のための情報をデフォルト数(全て)生成します
vacuumdb: データベース"***"の処理中です: 最適化のための情報をデフォルト数(全て)生成します
vacuumdb: データベース"***"の処理中です: 最適化のための情報をデフォルト数(全て)生成します
vacuumdb: データベース"***"の処理中です: 最適化のための情報をデフォルト数(全て)生成します
vacuumdb: データベース"***"の処理中です: 最適化のための情報をデフォルト数(全て)生成します
vacuumdb: データベース"postgres"の処理中です: 最適化のための情報をデフォルト数(全て)生成します
vacuumdb: データベース"template1"の処理中です: 最適化のための情報をデフォルト数(全て)生成します

c:\work>

この作業は旧DBのデータベースクラスタ削除を含んでいます。「このスクリプトを実行すると、旧クラスタのデータファイル delete_old_cluster.batが削除されます:」の日本語は微妙で「このスクリプトを実行すると、delete_old_cluster.batが旧クラスタのデータファイルを削除します:」と書きたかったのでしょうね。

dataが削除されています

後は動作確認を済ませて終了です!

コメント