web-dev-qa-db-ja.com

PostgreSQL:hstoreに互換性がないためpg_upgradeが失敗する

PostgreSQL 9.4.5_2-> 9.5.3から移行しようとしています

pg_upgrade(9.5.3ディストリビューションから)を使用しようとすると、次のエラーが発生します。

pg_dump: [archiver (db)] query failed: ERROR:  incompatible library "/usr/local/lib/postgresql/hstore.so": version mismatch

誰でもこれを修正する方法を知っていますか? pg_dumpallしてからリロードする必要がありますか?それは過去に機能しました。 pg_upgradeを使用していくつかの手順を保存しようとしています。

3
Meltemi

9.6.1がリリースされたので、同じ問題が発生しています。これまでオンラインで見つけたのはこれだけですが、まだ自分で試したことはありません。問題を正常に解決できたら、この回答を更新します。

編集:私はこれらの手順に従いましたが、すべてがうまくいきます。うまくいけば、9.7にアップグレードしてもそれほど難しくはありません。

現在9.5.4_1に

9.6.1へのアップグレード

以下の答えは、これからの引用です コメント FelixBünemannによって提供された答え。バージョン番号(上記を参照)の手順を変更し、いくつかの手順を説明とともに拡張しました。

1)[9.5]を使用している間に、hstoreデータベースが非推奨の=>演算子を使用していないことを確認してください:

$ for db in `echo 'SELECT datname FROM pg_database;' |/usr/local/Cellar/postgresql/9.5.4_1/bin/psql -t`;do echo $db; echo 'ALTER EXTENSION "hstore" UPDATE;' | /usr/local/Cellar/postgresql/9.5.4_1/bin/psql $db;done

これをターミナルで実行すると、基本的に各データベースをループし、それぞれのhstore拡張を更新しようとします。詳細は here を参照してください。いくつかあります

2)[9.5]サーバーを停止し、postgresqlをアップグレードし、ガイドのように新しいデータディレクトリをinitdbにアップグレードします。

これらのステップはメインの記事で説明されており、私の場合、この時点ですでに実行されています。

  1. $ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
  2. $ brew update && brew upgrade postgresql
  3. $ initdb /usr/local/var/postgres9.6 -E utf8

次の3つのステップは、後で説明するアップグレードプロセスで使用される3つのプログラムを置き換える(またはラップする)3つのシェルスクリプトを作成することです。

3)[9.6] pg_ctlの名前をpg_ctl.bakに変更し、pg_ctlとしてシェルラッパーを作成します。

#!/bin/sh
ln -sf /usr/local/Cellar/postgresql/9.6.1/lib/postgresql /usr/local/lib/
exec /usr/local/Cellar/postgresql/9.6.1/bin/pg_ctl.bak "$@"

4)[9.6] pg_dumpの名前をpg_dump.bakに変更し、シェルラッパーpg_dumpを作成します。

#!/bin/sh
ln -sf /usr/local/Cellar/postgresql/9.5.4_1/lib/postgresql /usr/local/lib/
exec /usr/local/Cellar/postgresql/9.6.1/bin/pg_dump.bak "$@"

5)[9.6] pg_dumpallの名前をpg_dumpall.bakに変更し、シェルラッパーpg_dumpallを作成します。

#!/bin/sh
ln -sf /usr/local/Cellar/postgresql/9.5.4_1/lib/postgresql /usr/local/lib/
exec /usr/local/Cellar/postgresql/9.6.1/bin/pg_dumpall.bak "$@"

6)chmod + xでラッパーを実行可能にします

$ chmod +x pg_ctl pg_dump pg_dumpall

Felixによる後のコメントで述べられているように:

基本的に、Shellラッパーが行うことは、移行プロセスの適切な時点で、[9.6.1]と[9.5.4]のlibディレクトリの間でスワップすることです。 pg_dumpは[9.5]バージョンを必要とし、pg_ctlは[9.6]バージョンを必要とするサーバーを起動するためです。

繰り返しますが、私のバージョンを、あなたが同様に実行する必要があるすべてのものに交換していることを思い出してください。

7)ガイドのようにpg_upgradeを起動します(これは-kスイッチでも機能します(私のようにスペースが少ない場合))。

pg_upgrade -d /usr/local/var/postgres -D /usr/local/var/postgres9.6 -b /usr/local/Cellar/postgresql/9.5.4_1/bin/ -B /usr/local/Cellar/postgresql/9.6.1/bin/ -v

8)シェルラッパーを削除し、.bakファイルの名前を元の名前に変更します。

9)ガイドのようにデータディレクトリを交換します

$ mv /usr/local/var/postgres /usr/local/var/postgres9.5
$ mv /usr/local/var/postgres9.6 /usr/local/var/postgres

10)[9.6]サーバーを起動し、生成されたanalyze_all.shスクリプトを使用してサーバーを分析します

$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
  # or, if you're running a current version of Homebrew
$ brew services start postgresql

11)postgres 9.6を楽しんで、バギーpg_upgradeをうまく回避するためのコーヒーを手に入れましょう

注:Railsのpg gemを使用している場合は、再コンパイルする必要があります。

$ gem uninstall pg
$ gem install pg
2
John Kacz