В рамках обновления сервера мы переходим с 32-битного Linux на 64-битный Linux (Gentoo, если это имеет значение) и Postgresql 9.1 на 9.2. У меня чертовски много времени на обновление базы данных с помощью pg_upgrade ...
Моя первая попытка заключалась в том, чтобы спрятать старый (32-битный 9.1) каталог pgsql bin & lib, обновить систему, а затем запустить обновленную (64-битную) систему:
pg_upgrade -b pgsql.old/bin -B /usr/lib64/postgresql-9.2/bin -d data.old -D data.new
Это не удается, потому что pg_upgrade пытается запустить pgsql.old / bin / pg_ctl с неправильным libpq.so.5 (64-разрядная версия системы, а не 32-разрядная версия в pgsql.old / lib). Если я установлю LD_LIBRARY_PATH так, чтобы он указывал на pgsql.old / lib, тогда я мог бы вручную запустить старый 32-битный pg_ctl нормально, но это, похоже, не помогает для pg_upgrade.
Тогда я подумал, что просто установлю 64-битный Postgresql 9.1 вместе с 9.2. Теперь, когда я бегу:
pg_upgrade -b /usr/lib64/postgresql-9.1/bin -B /usr/lib64/postgresql-9.2/bin -d data.old -D data.new
Бинарные файлы работают нормально, но обновление не выполняется раньше:
old and new pg_controldata alignments are invalid or do not match
что, я думаю, связано с 32-битными и 64-битными проблемами выравнивания в БД?
Я знаю, что pg_dump / pg_restore будет работать нормально, но из соображений скорости я хотел бы использовать pg_upgrade, если это вообще возможно. Это не разовая сделка - у нас есть пара сотен действующих систем, которые необходимо будет обновить в автоматическом режиме (через загрузочную флешку с соответствующими скриптами).
Я бы никогда не поступил так, как ты. Для справки, я работаю с PostgreSQL с, ох, 6.x дней (то есть много-много лет).
Я всегда, без вопросов, делаю что-то в этом роде:
Я использую собственный сценарий RC для остановки, запуска и перезапуска почтмейстера, и в нем у меня есть настройки, указывающие на текущие каталоги данных и xlog.
Кроме того, я понимаю, что вы используете диспетчер пакетов определенного дистрибутива. Я избегаю этого и всегда создаю PostgreSQL из исходников.
Вы не можете использовать pg_upgrade для обновления с 32-битной до 64-битной или вообще с любой ОС / ЦП / платформы на любую другую ОС / ЦП / платформу. Файлы данных зависят от платформы, и pg_upgrade работает путем простого копирования (или связывания) файлов данных без изменений. Так что это никогда не сработает.
На этом этапе у вас есть варианты: дамп / восстановление или использование системы логической репликации для перемещения ваших данных (Slony, Londiste, Bucardo).