このコマンドを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
何か案は?
私は(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) ?
(私の パッチファイルはこちら を参照)。