Такая задача встречается не так уж и редко, но практически везде приведен один и тот же сценарий: выгрузить базы в дамп – загрузить базы из дампа.
Все это хорошо, но ровно до тех пор, пока не дойдет до практического применения. Для начала базы надо куда-то выгрузить, с учетом имеющихся прав доступа у всех участников этого процесса.
Затем их надо на второй сервер как-то передать и снова куда-то сложить, снова не забыть про права.
Потом их надо загрузить. Получается такая не быстрая эпопея, большую часть которой мы бегаем со своими дампами как дурень с крашеной торбой.
Но есть способ проще, гораздо проще, достаточно вспомнить, что служебные утилиты Postgres умеют работать с удаленными серверами и поддерживают стандартные потоки ввода вывода.
Для того, чтобы подключиться к другому узлу используйте ключ
-h:
-h имя_сервера
Если пользователь удаленного сервера отличается от текущего пользователя СУБД, то дополнительно используем ключ -U:
-U имя_пользователя
Теперь несколько практических примеров:На целевом сервере переключаемся на учетную запись суперпользователя СУБД:
su - postgres
Теперь можно посмотреть базы на текущем сервере:
psql -l
И на удаленном:
psql -h SRV-02 -l
Перед тем как переносить базы на сервере приемнике их нужно создать, причем обязательно использовать для этого template0:
createdb -T template0 newbase
Это также можно сделать удаленно, не вставая с любимого дивана:
createdb -h SRV-02 -T template0 newbase
Ну вот, все готово к переносу. Выгружаем здесь и по конвейеру передаем туда:
pg_dump oldbase | psql -h SRV-02 newbase
Также можно выполнить всю эту операцию полностью удаленно, это может пригодиться, если сервера СУБД находятся у вас в разных подсетях и не видят друг друга или в контейнерах с минимальным набором инструментов.Все что вам понадобится – это клиент Postgres:
apt install postgresql-client-<VERSION>
Версию ставим ту, что в дистрибутиве, ее номер роли не играет, так же, как и базы можно переносить между серверами различных версий.Теперь переносим базы с одного на другой командой:
pg_dump -h SRV-01 oldbase | psql -h SRV-02 newbase
Первая часть команды выгрузит базу с удаленного сервера в стандартный поток вывода, а вторая загрузит на другой удаленный сервер через стандартный поток ввода.
