Вопрос или проблема
Это низкие ставки и просто репетиция для того случая, когда мне срочно нужно будет это сделать, а также чтобы подтвердить, что pg_dump сработал удовлетворительно.
Я пытаюсь использовать psql
или pg_restore
, чтобы восстановить мою копию базы данных Postgres в новую базу данных. Я использую Ubuntu 22.04.
Как мой обычный пользователь, rlm
, в ~
я могу ввести dir
и получить, среди других файлов, мой вывод apgym.sql
из pg_dump
.
Итак, я ввожу pg_restore -d testRestore -U postgres apgym.sql
и получаю: pg_restore: error: input file appears to be a text format dump. Please use psql.
Я думаю, ладно, я использую psql. Я ввожу его и получаю psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: database "rlm" does not exist
Я не понимаю сообщение об ошибке, но попробую снова как пользователь Postgres. Итак, я ввожу
sudo su postgres
и становлюсь пользователем postgres. Я ввожу psql -d testRestore -f apgym.sql
в том же каталоге, где находится мой файл apgym.sql
, и получаю:
could not change directory to "/home/rlm": Permission denied
psql: error: apgym.sql: No such file or directory
Я не могу использовать pgAdmin для восстановления из резервной копии, он говорит, что статус “Failed” за 0,02 секунды.
Как я могу восстановить мою резервную копию базы данных postgres? Мне нужно уметь это делать на случай, если мои данные будут испорчены, и я захочу вернуться. Пожалуйста, не предлагайте альтернативы: я хочу сделать это таким способом.
В случае, если это поможет читателям или тем, кто хочет создать собственный вывод pg_dump
в будущем, я создал резервную копию с помощью команды pg_dump -h localhost -U postgres -W apGymPostgres > apgym.sql
Решением для меня было обойти эту проблему. Мне не удалось заставить psql или pg_restore восстановить созданную мной резервную копию. Предположительно, поскольку я создал текстовый файл pg_dump, мне нужно было использовать psql. Но я не смог заставить psql работать.
Успех начался, когда я нашел руководство, в котором говорилось, что, если я использую файл дампа в формате tar, то могу использовать pg_restore. Я смог создать файл дампа tar с помощью pgAdmin, а затем аналогично восстановить, используя pgAdmin.
Так что это не решение, чтобы заставить работать текстовый pg dump, но это обходной путь.
Ответ или решение
Ваша проблема с восстановлением базы данных PostgreSQL из резервной копии очевидно связана с выбором формата резервной копии и командой, используемой для его восстановления. Давайте разберемся с каждым шагом подробнее, чтобы вы могли успешно восстановить свою базу данных в будущем.
Проблема с форматом резервной копии
Вы создали резервную копию с помощью команды pg_dump -h localhost -U postgres -W apGymPostgres > apgym.sql
. Этот метод создает резервную копию в виде текстового файла SQL, что требует использования psql
для восстановления, а не pg_restore
, который предназначен для работы с другими форматами (например, tar или custom).
Переход на tar-формат
Ваше решение обойти проблему с использованием формата tar было правильным подходом. Воспользовавшись форматом tar, вы можете использовать pg_restore
, который автоматически обрабатывает необходимые сценарии для восстановления базы данных.
Решение ошибки с использованием psql
Для восстановления из текстового файла SQL используя psql
, необходимо выполнить следующие шаги:
-
Подключение к базе данных: Убедитесь, что база данных
testRestore
существует. Если нет, создайте её с помощью команды:createdb -U postgres testRestore
-
Использование psql: Перейдите в каталог, где находится ваш файл
apgym.sql
, и выполните следующую команду под пользователем, имеющим доступ к базе данных:psql -U postgres -d testRestore -f apgym.sql
Если вы видите ошибку "No such file or directory", убедитесь, что рабочий каталог является тем, где лежит
apgym.sql
, или укажите полный путь к файлу. -
Проблема с правами доступа: Если вы пытаетесь выполнить команду
psql
под пользователемpostgres
, но получаетеcould not change directory
, возможно, стоит изменить права доступа к каталогу или переместить файл в доступный каталог, например,/tmp
.
Диагностика ошибки подключения
Ошибка "connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: database "rlm" does not exist" возникает, когда psql
пытается по умолчанию подключиться к базе с именем пользователя текущей системы. Обязательно указывайте базу данных с помощью опции -d
.
Использование pgAdmin
Хотя вам удалось перенести процесс в pgAdmin, важно отметить, что этот инструмент также поддерживает множество форматов резервных копий и может быть использован для создания как текстовых, так и tar резервных копий. Убедитесь, что выбрали правильный формат при создании резервной копии и восстановления.
Заключение
Итак, существуют разные подходы для восстановления баз данных в PostgreSQL, и ваш опыт показывает, что важно выбрать правильный инструмент и подходящий формат резервной копии. Для будущих резервных копий, если вы предпочитаете текстовый формат, используйте появившиеся здесь рекомендации по команды psql. В противном случае, tar-формат может быть более универсальным с точки зрения возможности восстановления.