2

Postgresql データベースを 8.4 から 9.1 にアップグレードする作業を行っています。数え切れないほどの問題に遭遇しました (Ubuntu のファイル配置に関係している可能性があります) が、最終ラインは見えていると思います。pg_upgrade はほとんど機能していますが、最初のデータベース「template0」に到達すると「既に存在する」ため失敗します。

psql:/var/lib/postgresql/pg_upgrade_dump_globals.sql:36: ERROR:  database "template0" already exists

There were problems executing "/usr/lib/postgresql/9.1/bin/psql" --set ON_ERROR_STOP=on --no-psqlrc --port 5432 --username "postgres" -f "/var/lib/postgresql/pg_upgrade_dump_globals.sql" --dbname template1 >> "/dev/null"
Failure, exiting

もちろん、この template0 データベースはすべての新しいクラスターの一部であり、削除することはできません。(再作成した後) 新しいクラスターで template0 と template1 の名前を (安全のために) 変更しようとしましたが、その後の pg_upgrade 呼び出しも失敗しましたが、今回は template1 が新しいクラスターに存在しないと不平を言いました。

"/usr/lib/postgresql/9.1/bin/pg_ctl" -w -l "/dev/null" -D "/var/lib/postgresql/9.1/main" -o "-p 5432 -b" start >> "/dev/null" 2>&1

connection to database failed: FATAL:  database "template1" does not exist

unable to connect to new postmaster started with the command: "/usr/lib/postgresql/9.1/bin/pg_ctl" -w -l "/dev/null" -D "/var/lib/postgresql/9.1/main" -o "-p 5432 -b" start >> "/dev/null" 2>&1
Failure, exiting

template0 の名前を変更するだけで再試行しましたが、再び失敗しましたが、今回は postgres 自体からのアサーションの問題がありました。

executing: SELECT datcollate, datctype FROM     pg_catalog.pg_database WHERE    datname = 'template0' 

pg_upgrade: /build/buildd/postgresql-9.1-9.1.3/build/../contrib/pg_upgrade/check.c:310: set_locale_and_encoding: Assertion `PQntuples(res) == 1' failed.
Aborted (core dumped)

健全性チェックに関する注意事項: 「完全な sql ダンプを実行して復元するだけ」でもうまく機能しないと誰かが考える場合に備えて、pg_upgrade を機能させようとしています。また、過去の失敗の遺物がアップグレードに失敗し続けるのを防ぐために、アップグレードが失敗するたびにクラスターをドロップして再作成するようにしました. データベースは Amazon ボリューム上にあるため、実際に何かを壊すことはできず、常にバックアップを取っています。私はubuntu 12を使用しており、両方のデータベースを並べてインストールしています。

私は現在、postgresql ソースにアクセスする必要のないアイデアがありません。次に何を試すかについて、助けや提案をいただければ幸いです。前もって感謝します。

4

1 に答える 1

6

Stop. Make a cup of tea / coffee and sit down.

  1. Make sure you have 9.1 and 8.4 installed at the same time. Debian allows this, so presumably ubuntu does too.
  2. Using the 9.1 version of pg_dump, dump each of your databases from 8.4, and either a dumpall for the users or just manually recreate them.
  3. Using 9.1 pg_restore, restore your databases as user postgres along with the --create flag.

If there are specific problems with any of these steps you'll need to make a note of them and provide details. Oh - the best place for detailed step-by-step advice is probably the postgresql-general mailing list (see the website for details). You can take your time there and get each step right.

At a guess you're trying to do the pg_upgrade into an existing initdb-ed directory which I don't think it expects. In any case, dump+restore is the cleanest way to do this - it also gives you a backup copy of your DB too.

于 2012-05-22T06:45:54.393 に答える