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