自宅の開発環境を漸くバージョンアップしたので備忘録として書きました。
環境
- 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 -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が旧クラスタのデータファイルを削除します:」と書きたかったのでしょうね。

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