web-dev-qa-db-ja.com

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

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

PostgreSQLデータベースをアップグレードする方法に関する詳細な指示はありますか?

データベース内のデータを破壊するか、それをめちゃくちゃにすることを恐れています。

188
user3675188

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を実行してください(注:下記以外からアップグレードする場合はbinのバージョンを変更してください)

    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/
    
  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 pg gemを再インストールします

    gem uninstall pg
    gem install pg
    

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

382
Donovan

これは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
53
pramod

上記のすべての答えにもかかわらず、ここに私の5セント行きます。

それはどんなOSでもそしてany-to-any postgresバージョンからでも動作します。

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

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

  • pg_upgradeインプレース。または

  • pg_dumppg_restore

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

詳細はマニュアルを参照してください。

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

11
Craig Ringer

更新:このプロセスは9.6から10へのアップグレードと同じです。単にバージョン9.610を反映するようにコマンドを修正してください。ここで9.6oldversionで、10newversionです。それに応じて、必ず "old"ディレクトリと "new"ディレクトリも調整してください。


私はUbuntuでPostgreSQL 9.5を9.6にアップグレードし、OS /パッケージ固有の微妙なニュアンスがいくつかあるので知っていると思います。

データを手動でダンプしたり復元したりする必要はありませんでした。そのため、他の回答のいくつかは実行不可能でした。)

手短に言えば、このプロセスは古いバージョン(例えば9.5と9.6)と一緒に新しいバージョンのPostgreSQLをインストールし、それからpg_upgradeバイナリを実行することから成ります。これについては https:/に詳しく説明されています。 /www.postgresql.org/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"?

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

newPostgreSQLバージョンから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

アップグレードは完了しました。but、新しいインスタンスはポート5433にバインドされます(標準のデフォルトは5432です)。そのため、新しいインスタンスをテストする前にこのことを念頭に置いてください。 「それに。

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

systemctl start postgresql

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

port = 5432

これを行う場合は、(サービスを開始する前に)同時に古いバージョンのポート番号を5433に変更するか、単に古いバージョンを削除します(これによりnot実際のデータベースコンテンツは削除されます)。 ;そのためには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
10
Ben Johnson

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

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

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

9
jnmandal

この悪口を踏みにじる他の貧しい生き物の肩の上に立って、私はYosemiteへのアップグレードの後に​​立ち上がって走るためにこれらのステップに従うことができました:

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
    
8
Josh

解決策がHomebrewに組み込まれたようです。

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

これは私のためにそれをやった。

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

手短に言うとポイント。私は正直に言ってPostgreSQLの本質を理解することを目的としていません。

1
dimitarvp

OnWindowspg_upgradeを使おうとすると、さまざまなエラーメッセージが表示されます。

私のために多くの時間を節約しました。

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

私はこれがpostgresを9.6にアップデートするためのあなたの解決策のための最良のリンクであると思います

https://sandymadaan.wordpress.com/2017/02/21/upgrade-postgresql9-3-9-6-in-ubuntu-retaining-the-databases/
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

何らかのエラーが発生した場合は、各手順の説明を読んで従うことを忘れないでください。

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

0
ThangTD

Windows 10では、npm以降、rimrafパッケージをインストールしました。 npm install rimraf -g

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

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

PostgreSQL mineの古いバージョンのアンインストールは10でした。アンインストーラはフォルダC:\PostgreSQL\10\dataを削除しないという警告を出すかもしれません。そのため、rimrafを使用してフォルダとそのサブフォルダを完全に削除します。

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

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

C:\PostgreSQL\data\pg11に移動してpostgresql.confを開き、port = 5433port = 5432に編集します。

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

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

0
STREET MONEY

私の解決策はこれら二つのリソースの組み合わせをすることでした:

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

そして

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

2番目の1は最初の1つよりも多くのを助けました。そうでないためにも、いくつかは必要ではないのでそのままステップに従わないでください。また、あなたがpostgresコンソールでデータをバックアップすることができないならば、あなたは別のアプローチを使い、私の場合のようにpgAdmin 3か他のプログラムでそれをバックアップすることができます。

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

結局のところ、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をしてください:)

0
Aleks