データを失うことなくPostgreSQLをバージョン9.6からバージョン10.1にアップグレードする方法


207

Ruby on Railsアプリケーション(Mac OS X 10.9)にPostgreSQLデータベースを使用しています。

PostgreSQLデータベースをアップグレードする方法の詳細な手順はありますか?

データベース内のデータを破壊したり、壊したりするのではないかと心配です。


8
いかなる場合でもバックアップを行ってください。
Patrick Oscity 2014年

回答:


401

Postgresのインストールとアップグレードに自作を使用したと仮定すると、次の手順を実行できます。

  1. 現在のPostgresサーバーを停止します。

    launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  2. 新しい10.1データベースを初期化します。

    initdb /usr/local/var/postgres10.1 -E utf8

  3. 実行pg_upgrade (注:以下以外のものからアップグレードする場合は、ビンのバージョンを変更してください)

    pg_upgrade -v \
        -d /usr/local/var/postgres \
        -D /usr/local/var/postgres10.1 \
        -b /usr/local/Cellar/postgresql/9.6.5/bin/ \
        -B /usr/local/Cellar/postgresql/10.1/bin/

    -v 詳細な内部ログを有効にする

    -d 古いデータベースクラスタ構成ディレクトリ

    -D 新しいデータベースクラスタ構成ディレクトリ

    -b 古いPostgreSQL実行可能ディレクトリ

    -B 新しいPostgreSQL実行可能ディレクトリ

  4. 新しいデータを適切な場所に移動します。

    cd /usr/local/var
    mv postgres postgres9.6
    mv postgres10.1 postgres
  5. Postgresを再起動します。

    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  6. /usr/local/var/postgres/server.log詳細を確認し、新しいサーバーが正しく起動したことを確認してください。

  7. 最後に、rails pggemを再インストールします

    gem uninstall pg
    gem install pg

少し時間をかけてPostgreSQLのドキュメントを読んで、フラストレーションを最小限に抑えるために上記の手順で何をしているのかを正確に理解することをお勧めします。


8
私は、データベースを初期化するには、次のコマンドを使用してhade:initdb /usr/local/var/postgres9.4 -E utf8 --lc-collate=C --lc-ctype=utf-8 --lc-monetary=C --lc-numeric=C
sunsations

それはあなたのガイドに一歩一歩従います。そして、すべてがうまくいきました!どうもありがとうございます。
Trantor Liu

3
delete_old_cluster.shコマンドに注意してください。このコマンドを実行する前に、まず/usr/local/postgres9.3ディレクトリを手動で削除しましたが、/ usr / local / var / postgresディレクトリ全体を失ったようです(Time Machineから復元できました)
peter_v

1
Bundlerを使用している場合は、gemを削除する必要がありますが、をgem uninstall pg実行するだけで、BundlerがGemfile.lockから正しいバージョンを再インストールできますbundle
danielricecodes

1
マイナーアップデートは:brew今も使用するためのオプションがあるbrew services stop postgresqlbrew services start postgresql代わりに、直接呼び出すのlaunchctl unloadとをlaunchctl load
フロリダ州2017年

59

上記のすべての回答にもかかわらず、ここで私の5セントになります。

これは、あらゆるOSで、あらゆるバージョンのPostgresから機能します。

  • 実行中のすべてのpostgresインスタンスを停止します。
  • 新しいバージョンをインストールして起動します。新しいバージョンにも接続できるかどうかを確認してください。
  • 古いバージョンのpostgresql.conf-> port5432に変更し5433ます。
  • 古いバージョンのpostgresインスタンスを起動します。
  • ターミナルを開きcd、新しいバージョンのbinフォルダーに移動します。
  • 走る pg_dumpall -p 5433 -U <username> | psql -p 5432 -U <username>
  • 古いpostgres実行インスタンスを停止します。

4
クリスチャンのおかげで、これは間違いなく素晴らしくて簡単な解決策です。私はこのように9.3から9.5にうまく行きました
fnicollet

3
Windows 2012サーバーでの9.1から9.5へのアップグレードで問題なく動作しました。
Rolf

4
このソリューションの問題は、一部のPostgres構成ファイル(postgresql.confまたはなどpg_hba.conf)を変更した場合、それらの変更を新しいインストールで手動で複製する必要があることです。あなたが使用している場合代わりに、pg_upgradecluster:、設定ファイルを新しいクラスタにコピーされますmanpages.ubuntu.com/manpages/precise/man8/...
Alphaaa

1
コマンドを開始するとすぐに、1つのパスワードプロンプトが表示されますが、2つのパスワードを1つずつ入力して、Enterキーで確認する必要があることに注意してください。または、次のものが得られますpg_dumpall: could not connect to database "XXX": fe_sendauth: no password supplied
Lu55

2
技術的にはこれは手動状態として、ただでまたは7.0上記のソースのバージョンのために、任意のツー任意のバージョンでは動作しません:Current releases of the dump programs can read data from any server version back to 7.0.
マーク・Tielemans

56

これはUbuntuユーザー向けのソリューションです

まず、postgresqlを停止する必要があります

sudo /etc/init.d/postgresql stop

/etc/apt/sources.list.d/pgdg.listという新しいファイルを作成し、以下の行を追加します

deb http://apt.postgresql.org/pub/repos/apt/ utopic-pgdg main

以下のコマンドに従ってください

wget -q -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install postgresql-9.4
sudo pg_dropcluster --stop 9.4 main 
sudo /etc/init.d/postgresql start

これですべてが揃ったので、以下のようにアップグレードするだけです

sudo pg_upgradecluster 9.3 main
sudo pg_dropcluster 9.3 main

それでおしまい。主にアップグレードされたクラスターは、ポート番号5433で実行されます。以下のコマンドで確認してください

sudo pg_lsclusters

2
「ほとんどアップグレードされたクラスターはポート番号5433で実行されます」と言う最後から2番目の文は、おそらく「必要に応じて元に戻すことができるように、9.3クラスターはポート番号5433で実行されます」と言う必要があります。
Andrew Thaddeus Martin

3
注:ubuntu 14.04の場合、utopic-pgdbの代わりに「trusty-pgdb」を使用してください
Johnny

3
これはインプレースアップグレードを実行しないことに注意してください。したがって、1 TBボリューム上の700 GB DBでは完全に役に立ちません。
偽の名前

16

更新:このプロセスは、9.5を少なくとも11.5にアップグレードする場合と同じです。単にバージョンを反映するためにコマンドを変更9.6して109.6ある古いバージョンはと10ある新しいバージョンを。また、それに応じて「古い」ディレクトリと「新しい」ディレクトリも調整してください。


UbuntuでPostgreSQL 9.5を9.6にアップグレードしたばかりですが、OS /パッケージ固有のニュアンスがいくつかあるので注意してください。

私はデータを手動でダンプして復元する必要がなかったので、ここでの他のいくつかの回答は実行できませんでした。)

手短に言えば、プロセスは、古いバージョン(たとえば、9.5と9.6)とともに新しいバージョンのPostgreSQLをインストールし、次にpg_upgradeバイナリを実行することで構成されます。 docs / 9.6 / static / pgupgrade.html

の唯一の「トリッキーな」側面はpg_upgrade、引数の正しい値を渡せなかったりcd、コマンドを実行する前に正しいユーザーまたは正しい場所にログインできなかったりすると、不可解なエラーメッセージが表示される可能性があることです。

Ubuntu(おそらくDebian)では、「公式」リポジトリを使用しdeb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg mainていて、デフォルトのファイルシステムパスまたはランタイムオプションを変更していない場合は、次の手順で十分です。

新しいバージョンをインストールします(9.6明示的にを指定していることに注意してください):

sudo apt install postgresql-9.6

インストールが成功すると、両方のバージョンが並行して実行されますが、ポートは異なります。インストールの出力では、下部にこれが示されていますが、見落としがちです。

Creating new cluster 9.6/main ...
  config /etc/postgresql/9.6/main
  data   /var/lib/postgresql/9.6/main
  locale en_US.UTF-8
  socket /var/run/postgresql
  port   5433

両方のサーバーインスタンスを停止します(これにより、両方が同時に停止します)。

sudo systemctl stop postgresql

専用のPostgreSQLシステムユーザーに切り替えます。

su postgres

彼のホームディレクトリに移動します(これを行わないとエラーが発生します):

cd ~

pg_upgrade 次の入力が必要ですpg_upgrade --helpこれを教えてください):

When you run pg_upgrade, you must provide the following information:
  the data directory for the old cluster  (-d DATADIR)
  the data directory for the new cluster  (-D DATADIR)
  the "bin" directory for the old version (-b BINDIR)
  the "bin" directory for the new version (-B BINDIR)

これらの入力は、視覚化しやすくするために、「長い名前」で指定できます。

  -b, --old-bindir=BINDIR       old cluster executable directory
  -B, --new-bindir=BINDIR       new cluster executable directory
  -d, --old-datadir=DATADIR     old cluster data directory
  -D, --new-datadir=DATADIR     new cluster data directory

--new-optionsスイッチにパスする必要があります。パスに失敗すると、次の結果が発生するためです。

connection to database failed: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/lib/postgresql/.s.PGSQL.50432"?

これは、このスイッチがない場合にデフォルトの構成オプションが適用され、不正な接続オプションが使用され、ソケットエラーが発生するために発生します。

新しい PostgreSQLバージョンpg_upgradeからコマンドを実行します。

/usr/lib/postgresql/9.6/bin/pg_upgrade --old-bindir=/usr/lib/postgresql/9.5/bin --new-bindir=/usr/lib/postgresql/9.6/bin --old-datadir=/var/lib/postgresql/9.5/main --new-datadir=/var/lib/postgresql/9.6/main --old-options=-cconfig_file=/etc/postgresql/9.5/main/postgresql.conf --new-options=-cconfig_file=/etc/postgresql/9.6/main/postgresql.conf

専用システムユーザーアカウントのログアウト:

exit

これでアップグレードは完了しました、新しいインスタンスはポート5433(標準のデフォルトは5432)にバインドするため、「カットオーバー」する前に新しいインスタンスをテストする場合は、このことを覚えておいてください。

サーバーを通常どおりに起動します(これも、古いインスタンスと新しいインスタンスの両方を起動します)。

systemctl start postgresql

新しいバージョンをデフォルトにする場合は、有効な構成ファイル(など)を編集し/etc/postgresql/9.6/main/postgresql.confて、ポートがそのように定義されていることを確認する必要があります。

port = 5432

あなたがこれを行う場合は、どちらかに古いバージョンのポート番号を変更する5433これがします(単に古いバージョンを削除し、(サービスを開始する前に)、同時に、またはないあなたの実際のデータベースの内容を削除し、あなたが使用する必要がありますapt --purge remove postgresql-9.5発生する、そのために):

apt remove postgresql-9.5

上記のコマンドはすべてのインスタンスを停止するため、次のコマンドを使用して最後にもう一度新しいインスタンスを開始する必要があります。

systemctl start postgresql

最後の注意点として、pg_upgradeの良いアドバイスを考慮することを忘れないでください:

Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
    ./analyze_new_cluster.sh

Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh

1
:> 9.5 -マックヨセミテ、PostgreSQLの9.2での私にとってはsudo su postgres、中/プライベート/ tmpのpg_upgradeのが〜とてもうまくいきませんでしたではない実行している、pg_upgradeの前に、信頼に両方のインストールのpg_hba.confの中のすべての方法を変更するsudo mkdir /foobarchmod 777 /foobar、そこにそれを実行しました。最後にpg_upgradeコマンド:/Library/PostgreSQL/9.5/bin/pg_upgrade -b /Library/PostgreSQL/9.2/bin -B /Library/PostgreSQL/9.5/bin -d /Library/PostgreSQL/9.2/data -D /Library/PostgreSQL/9.5/data -o -cconfig_file=/Library/PostgreSQL/9.2/data/postgresql.conf -O -cconfig_file=/Library/PostgreSQL/9.5/data/postgresql.conf
Jarno Argillander

1
私は9.5から11.5に正常にアップグレードできました。ubuntuにpostgres aptリポジトリを追加する必要がありました。そして、次の手順に従ってください:tecadmin.net/install-postgresql-server-on-ubuntu
shakee93

14

自作および自作サービスを使用している場合は、おそらく次のようにすることができます。

brew services stop postgresql
brew upgrade postgresql
brew postgresql-upgrade-database
brew services start postgresql

高度なpostgres機能を使用している場合、これは完全には機能しないかもしれませんが、私には完全に機能しました。


1
macOS Mojave 10.14.2で問題なく動作しました-ありがとうございます!
8bithero、

13

ユーザーマニュアルは深さでこのトピックをカバーしています。あなたはできる:

  • pg_upgrade所定の位置に; または

  • pg_dumppg_restore

疑わしい場合は、ダンプを使用してください。古いデータディレクトリを削除しないでください。何か問題が発生した場合や、間違いを犯した場合に備えて、そのまま残してください。そうすれば、変更前の9.3インストールに戻すことができます。

詳しくはマニュアルをご覧ください。

行き詰まっている場合は、行き詰まっている方法、場所、最初に試したことを説明した詳細な質問を投稿してください。OS X用のPostgreSQLにはいくつかの異なる「ディストリビューション」がある(残念ながら)ため、PostgreSQLのインストール方法にも少し依存します。したがって、その情報を提供する必要があります。


8

ヨセミテにアップグレードした後、私はこの泥を介して歩き回っている他の貧しい生き物の肩の上に立って、次の手順に従って立ち直って実行することができました。

Postgresのインストールとアップグレードに自作を使用したと仮定すると、次の手順を実行できます。

  1. 現在のPostgresサーバーを停止します。

    launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  2. 新しい9.4データベースを初期化します。

    initdb /usr/local/var/postgres9.4 -E utf8

  3. postgres 9.3をインストールします(私のマシンには存在しなくなったため):

    brew install homebrew/versions/postgresql93

  4. Yosemiteのアップグレード中に削除されたディレクトリを追加します。

    mkdir -p /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/touch /usr/local/var/postgres/{pg_tblspc,pg_twophase,pg_stat_tmp}/.keep

  5. 実行pg_upgrade

    pg_upgrade -v -d /usr/local/var/postgres -D /usr/local/var/postgres9.4 -b /usr/local/Cellar/postgresql93/9.3.5/bin/ -B /usr/local/Cellar/postgresql/9.4.0/bin/

  6. 新しいデータを適切な場所に移動します。

    cd /usr/local/var
    mv postgres postgres9.3
    mv postgres9.4 postgres
  7. Postgresを再起動します。

    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

  8. /usr/local/var/postgres/server.log詳細を確認し、新しいサーバーが正しく起動したことを確認してください。

  9. 最後に、関連するライブラリを再インストールしますか?

    pip install --upgrade psycopg2
    gem uninstall pg
    gem install pg

1
pg_upgrade -v -d / usr / local / var / postgres -D /usr/local/var/postgres9.4 -b /usr/local/Cellar/postgresql93/9.3.*/bin/ -B / usr / local / Cellar /postgresql/9.4.*/bin/#マイナーバージョンは異なる場合があります。
アーロンマクミリン2015

1
これをありがとう。brew cleanupデータを移行する前に誤って実行したため、postgres9.3がアンインストールされました。これは役に立ちました。:)
markquezada 2015年

5

ソリューションがHomebrewに組み込まれたようです:

$ brew info postgresql
...
==> Caveats
To migrate existing data from a previous major version of PostgreSQL run:
  brew postgresql-upgrade-database
....

1

これでうまくいきました。

https://gist.github.com/dideler/60c9ce184198666e5ab4

短くて要点。私は正直に言って、PostgreSQLの本質を理解することを目指していません。


1
これはUbuntuのpg_upgradeclusterツールを使用します。これは、PostgreSQLのpg_upgradeツールよりもはるかに遅くなる可能性があり、もちろんUbuntuでのみ使用できます。
alfonx 2015年

@alfonx真実ではありません。私は自分のDebianにそれを持っていますjessie。10以上のDBと約400MBのデータベースデータが瞬く間に変換されました。次に、私はSSDで仮想Debianを使用しています。
dimitarvp 2015年

自分で修正します。pg_upgradeclusterは「Debian PostgreSQLインフラストラクチャ」の一部であるため、Debianベースのディストリビューションでのみ使用できます。速度についてpg_upgradeは "--link"オプションを提供し、可能な場合はデータをコピーしないようにリンクします:postgresql.org/docs/9.4/static/pgupgrade.html
alfonx

1
おそらく、私たちはさまざまな結果を目指しています。ディストリビューション全体のソフトウェアアップグレードの後、2つのバージョンのPostgreSQLになり、私のプロジェクトで使用したデータは古いバージョン(9.3)のままでした。だから私は上のリンクを探して(私の答えで)、それをアップグレードし、古い「クラスター」と古いPGバージョンを取り除きました。
dimitarvp 2015年

9.4から11にアップグレードしようとしましたpg_upgradecluster 9.4 mainが、次のエラーが表示されますエラー:specified cluster does not exist... おそらく
rubo77

1

のWindows I使用しようとすると別のエラーメッセージに直面して保管pg_upgrade

私にとって多くの時間を節約できました:

  1. バックアップDB
  2. PostgreSQLのすべてのコピーをアンインストールします
  3. 9.5をインストールする
  4. DBを復元

これを9.5から9.6で行い、完全に機能しました。「最新」ではなく、簡単で正確なアップグレードもできるのは良いことです。Big SQLを使用して適切なインストーラー(openscg.com/bigsql/postgresql/installers.jsp)を取得しました。
コーダー、2017年

0

私の解決策は、次の2つのリソースを組み合わせることです。

https://gist.github.com/tamoyal/2ea1fcdf99c819b4e07d

そして

http://www.gab.lc/articles/migration_postgresql_9-3_to_9-4

第二 1は、より多くの助けその後、最初のものを。また、必要ではない手順があるため、そのままにしないでください。また、postgresコンソール経由でデータをバックアップできない場合は、別の方法を使用して、pgAdmin 3または他のプログラムでバックアップすることができます。

また、リンク:https : //help.ubuntu.com/stable/serverguide/postgresql.html暗号化されたパスワードを設定し、postgresユーザーを認証するためにmd5を設定するのに役立ちました。

結局のところ、postgresのserverバージョンを確認するには、ターミナルで実行します。

sudo -u postgres psql postgres

パスワードを入力した後、postgresターミナルで実行します。

SHOW SERVER_VERSION;

それは次のようなものを出力します:

 server_version 
----------------
 9.4.5

postgresの設定と開始には、次のコマンドを使用しました。

> sudo bash # root
> su postgres # postgres

> /etc/init.d/postgresql start
> /etc/init.d/postgresql stop

そして、ファイルからデータベースを復元する場合:

> psql -f /home/ubuntu_username/Backup_93.sql postgres

または、うまくいかない場合は、これを試してください:

> pg_restore --verbose --clean --no-acl --no-owner -h localhost -U postgres -d name_of_database ~/your_file.dump

そして、Railsを使用している場合はbundle exec rake db:migrate、コードをプルした後にa :)


0

自作のMacの場合:

brew tap petere/postgresql

brew install <formula>(例:brew install petere/postgresql/postgresql-9.6

古いPostgresを削除します。

brew unlink postgresql

brew link -f postgresql-9.6

エラーが発生した場合は、各ステップでbrewの指示を読み、それに従うことを忘れないでください。

詳細はこちらをご覧くださいhttps : //github.com/petere/homebrew-postgresql


0

Windows 10ではnpmを使用していたため、rimrafパッケージをインストールしました。 npm install rimraf -g

コマンドを使用してすべてのデータベースを1つずつバックアップします pg_dump -U $username --format=c --file=$mydatabase.sqlc $dbname

次に、最新のPostgreSQLバージョン、つまり11.2をインストールしたため、今回はポート5433を使用するように求められました。

以前のバージョンのPostgreSQL mineのアンインストールは10でした。アンインストーラーはフォルダーを削除しないという警告を表示する場合がありますC:\PostgreSQL\10\data。これが、rimrafを使用してフォルダーとそのサブフォルダーを完全に削除する次のステップがある理由です。

PostgreSQLのインストールディレクトリに移動し、コマンドを実行しrimraf 10ます。10はディレクトリ名です。PostgreSQLの古いバージョン、つまり9.5などを使用してください。

次にC:\PostgreSQL\pg11\bin, C:\PostgreSQL\pg11\lib、Windows環境変数に追加します。新しくインストールしたバージョンは11なので、なぜを使用しているのpg11ですか。

ナビゲートしC:\PostgreSQL\data\pg11postgresql.conf編集port = 5433を開くport = 5432

それでおしまい。cmdを開いて入力psql -U postgres

コマンドを使用して、バックアップされたすべてのデータベースを1つずつ復元できるようになりました pg_restore -U $username --dbname=$databasename $filename


0

Windows 10でPostgresql 11からPostgresql 12にアップグレードするための私の解決策は次のとおりです。

最初の発言として、Postgresqlサービスを停止および開始できる必要があります。これを行うには、Powershellで次のコマンドを実行します。

開始: pg_ctl start -D “d:\postgresql\11\data”

やめる: pg_ctl stop -D “d:\postgresql\11\data”

状態: pg_ctl status -D “d:\postgresql\11\data”

アップグレードを行う前にバックアップを作成することをお勧めします。Postgresql 11インスタンスが実行されている必要があります。次に、グローバルをコピーするには

pg_dumpall -U postgres -g -f d:\bakup\postgresql\11\globals.sql

そして各データベース

pg_dump -U postgres -Fc <database> > d:\backup\postgresql\11\<database>.fc

または

pg_dump -U postgres -Fc -d <database> -f d:\backup\postgresql\11\<database>.fc

まだ完了していない場合は、Postgresql 12をインストールします(Postgresql 11もインストールされているため、これはポート5433になります)

次に、次のようにアップグレードを実行します。

1)Postgresql 11サービスを停止します(上記を参照)

2)編集postgresql.conf中のファイルd:\postgresql\12\dataや変更port = 5433port = 5432

3)Postresql 11ではなくPostgresql 12を指すようにWindowsユーザー環境パスを編集し(windows start次にenv

4)次のコマンドを入力して、アップグレードを実行します。

pg_upgrade `
-b c:\program files\postgresql\11\bin `
-B c:\program files\postgresql\12\bin `
-d d:\postgresql\11\data `
-D d:\postgresql\12\data --username=postgres

(Powershellでは、次の行でコマンドを続行するには、バックティック(またはバッククォート) `を使用します)

5)そして最後に新しいPostgresql 12サービスを開始します

pg_ctl start -D “d:\postgresql\12\data”


-1

私はこれがpostgresを9.6に更新するためのあなたのソリューションのための最良のリンクだと思います

https://sandymadaan.wordpress.com/2017/02/21/upgrade-postgresql9-3-9-6-in-ubuntu-retaining-the-databases/
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.