
У меня есть резервная копия каталога данных PostgreSQL 8.3. Мне нужно скопировать базу данных из этой резервной копии в новый экземпляр PostgreSQL. Из-за проблем со старым сервером я не могу сделать pg_dump базы данных.
Я выяснил, какой каталог предназначен для рассматриваемой базы данных. Например, в MySQL все, что вы обычно делаете, это останавливаете сервер, копируете каталог и перезапускаете его, и база данных становится доступной. Теперь это не работает с PostgreSQL, и я подозреваю, что это потому, что база данных не указана в файле global/pg_database. Этот файл, похоже, автоматически генерируется при запуске PostgreSQL, так как мне сообщить системе, что база данных там?
решение1
Обратите внимание, что в PostgreSQL каталог данных кластера представляет собой автономную единицу, которую невозможно надежно восстановить по частям, как указано в документации.здесь.
Лучший вариант — использовать полный каталог данных старого сервера и запустить на нем сервер, а затем восстановить его из дампа базы данных, полученного оттуда:
- Получите postgresql.conf, который соответствует конфигурации нового хоста (ориентируйтесь по файлам на старом — которые вы здесь меняете — и новым каталогам данных)
- Узнайте имя суперпользователя PostgreSQL старой установки — скорее всего, postgres.
- Создайте это имя пользователя (пользователь UNIX) на новом хосте, если его там еще нет.
- Предоставьте (chown) старый каталог данных этому пользователю, если только его uid не совпадает с uid на старом сервере.
- Настройте pg_hba.conf в старом каталоге данных, чтобы разрешить подключения локальных пользователей к тому же имени пользователя postgres (обычно это значение по умолчанию, но проверьте).
- Запустите старый кластер базы данных как пользователь UNIX с тем же именем, что и у суперпользователя старого каталога данных, например, для пользователя postgres:
sudo -u postgres postgres -D old_data_directory # or with su: su postgres postgres -D old_data_directory
- сделайте дамп старой базы данных, снова с обычным именем пользователя postgres:
sudo -u postgres pg_dump -p /path/to/socket/for/old/directory database_name > dump_file.sql # becoming postgres with su analogous to above
- адаптируйте dump_file.sql к именам пользователей нового сервера и т. д.; создайте там пустую базу данных с соответствующим владельцем
- просканируйте базу данных на новый сервер:
sudo -u postgres psql -p /path/to/socket/for/new/directory new_database_name # once again, getting postgres privileges using su analogous to above
Это должно вас настроить или, по крайней мере, указать хороший путь к цели.