Windows版 PostgreSQL Ver16 → 17へのメジャーアップデートの方法

未分類

本ページは広告が含まれています。気になる広告をクリック頂けますと、サーバ運営費になります(^^

現在のバージョンを確認する

現在利用しているPostgresのバージョンの確認方法は、スタートメニューから、SQL Shellを起動して、

コマンドを実行します。

select * From version();

database_jp=# select * From version();
                          version
------------------------------------------------------------
 PostgreSQL 16.3, compiled by Visual C++ build 1939, 64-bit
(1 行)

今回は、現在利用できる最新バージョン

PostgreSQL Version 17.4にアップデートしてみます。

ダウンロードはこちら

Postgresサービスの停止

タスクマネージャを開き、PostgreSQL Serverプロセスを停止します。右クリックしてタスクの終了します。

PostgreSQL 17.4をインストール

ダウンロードした、PostgreSQL 17.4をインストールします。

セットアップしていきます。特に必要なければ全てデフォルトでインストールしていきます。

ディレクトリは標準で17が指定されるのでそのまま

次へ、次へと進めればインストールが始まります。

結構時間がかかって完了

また、タスクマネージャにPostgreSQL が現れるのでタスクを終了で停止する。

設定ファイルの場所

主要な設定ファイルはここ

C:\Program Files\PostgreSQL\16\data

17の場合はここ

C:\Program Files\PostgreSQL\17\data

pg_hba.confをtrustにする

ファイルのエンコードは UTF-8になっているので、UTF-8が扱えるテキストエディタで編集します。私は、EmEditorを使っています。最近はメモ帳もUTF-8に対応しているので、メモ帳でも構いませんが、Windowsのバージョンなどで、どのように違うのか検証取ってません。

scram-sha-256 → trust へ

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "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

バージョン16も、17も同じように設定します。

16からadminpackを削除する

すでに、16のサービスを停止した後だったら起動するのは以下のコマンド

net start postgresql-x64-16
postgresql-x64-16 - PostgreSQL Server 16 サービスを開始します.
postgresql-x64-16 - PostgreSQL Server 16 サービスは正常に開始されました。

拡張機能であるadminpackを削除しておきます。

Server [localhost]:
Database [postgres]:
Port [5432]:
Username [postgres]:
Client Encoding [SJIS]:
psql (16.3)
"help"でヘルプを表示します。

postgres=# DROP EXTENSION adminpack;
DROP EXTENSION

注意 pg_upgradeでエラー出た

私は、上記手順をやっていなかったために、pg_upgradeでエラー出ました。

c:\tmp>"C:\Program Files\PostgreSQL\17\bin\pg_upgrade.exe" -U postgres -d "C:/Program Files/PostgreSQL/16/data" -D "C:/Program Files/PostgreSQL/17/data" -b "C:/Program Files/PostgreSQL/16/bin" -B "C:/Program Files/PostgreSQL/17/bin"
整合性チェックを実行しています。
-----------------------------
Checking cluster versions                                     ok
Checking database user is the install user                    ok
Checking database connection settings                         ok
Checking for prepared transactions                            ok
Checking for contrib/isn with bigint-passing mismatch         ok
Checking data type usage                                      ok
Creating dump of global objects                               ok
Creating dump of database schemas
                                                              ok
Checking for presence of required libraries                   致命的

このクラスタでは、移行先の環境にはないロード可能ライブラリを参照しています。
これらのライブラリを移行先の環境に追加するか、もしくは移行元の環境から
それらを使っている関数を削除してください。 問題のライブラリの一覧は、
以下のファイルに入っています:
    C:/Program Files/PostgreSQL/17/data/pg_upgrade_output.d/20250320T153545.636/loadable_libraries.txt
失敗しました、終了しています

Files/PostgreSQL/17/data/pg_upgrade_output.d/20250320T153545.636/loadable_libraries.txt

このファイルの中に、移行先の環境にはない関数を使っているとの事

ファイルの中身にはこのような記載が

ライブラリ”$libdir/adminpack”をロードできませんでした: ERROR: 繝輔ぃ繧、繝ォ”$libdir/adminpack”縺ォ繧「繧ッ繧サ繧ケ縺ァ縺阪∪縺帙s縺ァ縺励◆: No such file or directory
データベース: postgres

BUG #18635: pg_upgrade で PostgreSQL17 に「$libdir/adminpack をロードできませんでした」というエラーが発生する

まさにこれだなという事で、adminpack拡張機能を削除すればいい!となり

DROP EXTENSION adminpack;

このコマンドを実行する事にたどりつきました。

contrib の adminpack拡張が削除されました。 (Daniel Gustafsson) (17)

これは開発終了した pgAdmin III で使われていました。

PostgreSQL 17 に関する技術情報

postgres17では削除されたんですね。

C:¥にtempフォルダ作成

C:¥ドライブ直下にtmpフォルダを作成します。右クリック→新規作成→フォルダ

pg_upgradeの実行

コマンドプロンプトを管理者として実行します。

c:\tmp にカレントディレクトリを移動して、pg_upgradeコマンドを実行します。

pg_upgradeの使い方はここ

pg_upgrade -b oldbindir [-B newbindir-d oldconfigdir -D newconfigdir [option…]

C:\Windows\System32>cd c:\tmp

c:\tmp>"C:\Program Files\PostgreSQL\17\bin\pg_upgrade.exe" -U postgres -d "C:/Program Files/PostgreSQL/16/data" -D "C:/Program Files/PostgreSQL/17/data" -b "C:/Program Files/PostgreSQL/16/bin" -B "C:/Program Files/PostgreSQL/17/bin"

Windowsセキュリティ ダイアログが表示されるので許可します。

すると、アップグレードを実行してくれます。

結構時間かかります。

Checking cluster versions                                     ok
Checking database user is the install user                    ok
Checking database connection settings                         ok
Checking for prepared transactions                            ok
Checking for contrib/isn with bigint-passing mismatch         ok
Checking data type usage                                      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で再作成する必要があります。

アップグレードを実行しています。
------------------
Setting locale and encoding for new cluster                   ok
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_xact 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
Copying user relation files
                                                              ok
Setting next OID for new cluster                              ok
Sync data directory to disk                                   ok
Creating script to delete old cluster                         ok
Checking for extension updates                                ok

アップグレードが完了しました
----------------
オプティマイザーの統計は、pg_upgrade では転送されません。そのため
新サーバーを起動した後、以下を行うことを検討してください。
    C:/Program Files/PostgreSQL/17/bin/vacuumdb -U postgres --all --analyze-in-stages
このスクリプトを実行すると、旧クラスタのデータファイルが削除されます:
    delete_old_cluster.bat

17のpg_hba.confを元に戻して起動

trust → scram-sha-256 へ

PostgreSQL17を起動します

c:\tmp>net start postgresql-x64-17
postgresql-x64-17 サービスを開始します.
postgresql-x64-17 サービスは正常に開始されました。

PgAdmin4を起動し、DBにアクセスすると、 PostgreSQL17ができていました。

しかし、まだエラーが

列"daticulocale"は存在しません LINE 5: datconnlimit, daticulocale, daticurules, datcollversion, ^ HINT: 列"db.datlocale"を参照しようとしていたようです。

こちらのエラーは、以前の16でインストールしていたバージョンPgAdmin4 8.7でおきていました。

新しくインストールされたPgAdmin4 9.0を開いたところ、エラーも表示されずに起動する事ができました。

日本語に変更しました。

File → Preffernce → UserInterface

最初はうまく変わらなかったので、焦りましたが、2回同じ操作をする事で変更されました。

PostgreSQL16の削除

使わなくなったPostgreSQL16を削除します。

プログラムの追加と削除から、PostgreSQL 16を選択し削除します。

データを含め全て削除します。

Entire application

16フォルダが残るので削除

Windowsを再起動し、もう一度PgAdmin4にてDBにアクセスできるかを確認して問題が出なければ終了です。

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