Postgresql 8.4->9.1 с ошибкой pg_upgrade, поскольку существует база данных «template0»

Я работаю над обновлением базы данных 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, и я был бы очень признателен за любую помощь и предложения относительно того, что делать дальше. Заранее спасибо.


person Jessy Diamond Exum    schedule 22.05.2012    source источник
comment
Не по теме. Вы должны обратиться к dba.stackexchange.com   -  person Luc M    schedule 22.05.2012


Ответы (1)


Останавливаться. Сделайте чашку чая/кофе и присядьте.

  1. Убедитесь, что у вас одновременно установлены версии 9.1 и 8.4. Debian позволяет это, так что, вероятно, Ubuntu тоже.
  2. Используя версию pg_dump 9.1, создайте дамп каждой из ваших баз данных из версии 8.4 и либо дамполл для пользователей, либо просто воссоздайте их вручную.
  3. Используя 9.1 pg_restore, восстановите свои базы данных как пользовательские postgres вместе с флагом --create.

Если есть определенные проблемы с любым из этих шагов, вам нужно будет записать их и предоставить подробности. О, лучшим местом для подробных пошаговых советов, вероятно, является список рассылки postgresql-general (подробности см. на веб-сайте). Вы можете не торопиться и делать каждый шаг правильно.

Полагаю, вы пытаетесь выполнить pg_upgrade в существующем каталоге initdb-ed, чего я не думаю, что он ожидает. В любом случае, дамп + восстановление - самый чистый способ сделать это - он также дает вам резервную копию вашей БД.

person Richard Huxton    schedule 22.05.2012