PostgreSQL: Как перенести данные из одной БД в другую

Недавно столкнулся с проблемой переноса данных в postgresql, как оказалось, сделать дамп и потом загрузку данных в PostgreSQL несколько сложнее, чем в MySQL. Рассмотрим как это сделать с помощью двух команд — pg_dump и pg_restore.

Для начала делаем дамп с сервера, откуда переносим данные:

Это создаст полный дамп базы dbname с BLOB’ами и без owner’а, в специальном формате для pg_restore.

Далее, создаём базу данных на сервере, где будем делать загрузку данных:

Последняя команда нужна не во всех случаях, просто мой шаблон BD в postgresql уже содержал по дефолту объявление plpgsql и из-за этого загрузка данных вываливалась с ошибкой. Далее сама процедура загрузки:

Флаги в данном случае означают следующее:

  • Остановиться в случае ошибки.
  • Не выполнять восстановление прав (в моём случае на двух разных серверах просто были разные пользователи БД, что также вызывало ошибку импорта).
  • Выполнить всё в одной транзакции (если вдруг возникнет ошибка — будет проще начать с нуля).

Далее, поскольку пользователи на двух разных серверах различались и восстановление дампа происходило без восстановления пользователя, необходимо проставить права для пользователя test (выставляются права на таблицы, последовательности и представления aka views). В моём случае команды выполнялись от пользователя pgsql:

Не забудьте изменить везде dbname на соответствующие имена баз и, конечно, поменять где необходимо имя пользователя и т.п.

P.S. Возможно, последние 3 команды можно заменить внутренними средствами PostgreSQL, но для меня такой вариант приемлем.

Update

Вышеперечисленные команды для переназначения прав можно завернуть в shell-скрипт. Например, в такой:

Первый параметр скрипта — имя БД, 2й — имя пользователя, на которого необходимо назначить права.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: