web-dev-qa-db-ja.com

pg_upgrade認識されない設定パラメータ "unix_socket_directory"

このコマンドをpostgresユーザーとして使用して、Fedora 18でPostgresqlを9.2から9.3にアップグレードしようとしています

$ pg_upgrade -b /bin -B /usr/pgsql-9.3/bin -d /var/lib/pgsql/data -D /var/lib/pgsql/9.3/data/ -j 2 -u postgres

ログのエラー

コマンド: "/ bin/pg_ctl" -w -l "pg_upgrade_server.log" -D "/ var/lib/pgsql/data" -o "-p 50432 -b -c listen_addresses = '' -c unix_socket_permissions = 0700 -c unix_socket_directory = '/ var/lib/pgsql' "start >>" pg_upgrade_server.log "2>&1がサーバーの起動を待機しています... FATAL:認識されない構成パラメーター" unix_socket_directory "....停止を待機しましたpg_ctl:開始できませんでしたサーバ

a_horseで指摘されているように、パラメータがunix_socket_directories(複数)9.3。ただし、起動中のサーバーバージョンは古い9.2です。

$ /bin/pg_ctl --version
pg_ctl (PostgreSQL) 9.2.4

何か案は?

13
Clodoaldo

私は(rootとして)実行することで問題をハッキングしました:

mv /usr/bin/pg_ctl{,-orig}
echo '#!/bin/bash' > /usr/bin/pg_ctl
echo '"$0"-orig "${@/unix_socket_directory/unix_socket_directories}"' >> 
     /usr/bin/pg_ctl
chmod +x /usr/bin/pg_ctl

意図したとおりにpg_upgradeを実行し、ハッキングを元に戻します。

mv -f /usr/bin/pg_ctl{-orig,}

問題は、pg_upgradeがプログラムpg_ctrlを、新しい「unix_socket_directories」ではなく古い「unix_socket_directories」内のファイルを指定する引数で実行することです(2番目は複数形であることに注意してください)。このハックは、元の/usr/bin/pg_ctlの名前を/usr/bin/pg_ctl-origに変更し、元のpg_ctlプログラムを呼び出すだけのシェルスクリプトを作成し、すべての引数に「unix_socket_directory」を「unix_socket_directories」に変更した文字列を渡します。

Bashでは、$fooを使用して、文字列の一部を変数${foo/bar/baz}barからbazに変更できます(これにより、変数ですが、変数の変更された内容を返します)。配列を${x/y/z}とともに使用して、すべての内容を一度に置き換えた配列を取得することもできます。変数$@は、プログラム/スクリプト/関数に渡されるすべての引数を含む配列であるため、新しいpg_ctlスクリプトは、すべての引数を古いディレクトリ名から新しいものに変更して古いスクリプトを実行します。

同じ問題があります。 Fedora Repoの9.2.4からPGDG 9.3にアップグレードしていました。問題の原因は、Fedoraがパラメーターunix_socket_directoryからunix_socket_directoriesへの変更をバックポートすることです( https://bugzilla.redhat.com/show_bug.cgi?id=85335 を参照)。 。

私の解決策は、ファイルpg_upgradeを更新して、ソースからcontrib/pg_upgrade/server.c:199を再構築することです。ここで、pg_upgradeはサーバーのバージョンを確認します。

199:       (GET_MAJOR_VERSION(cluster->major_version) < 903) ?

、私の場合は次のように変更します。

199:       (GET_MAJOR_VERSION(cluster->major_version) < 900) ?

(私の パッチファイルはこちら を参照)。

5
Ali Akbar