Вопрос:
Я новичок в Postgres и только что обнаружил, что я не могу получить доступ к данным разных баз данных в одном SQL-запросе. А также узнал концепцию схемы в Postgres.
Теперь у меня есть две базы данных
db1 и db2
Оба имеют таблицы с одинаковым именем в своей общедоступной схеме.
Теперь я хочу создать новую схему в db1 с именем: new_schema
И переместите данные из db2.public в db1.new_schema
Каков самый простой способ сделать это?
Лучший ответ:
Самый простой способ – переименовать схемы. Однако вы должны быть уверены, что являетесь единственным пользователем базы данных db1.
Сначала скройте общедоступную схему в db1:
alter schema public rename to original_public; create schema public;
Затем выполните резервное копирование и восстановление:
$ pg_dump —format custom —file «my_backup» —schema «public» «db2» $ pg_restore —dbname «db1» «my_backup»
Наконец, воссоздайте соответствующие имена схем:
alter schema public rename to my_schema; alter schema original_public rename to public;
Другой вариант – использовать dblink. Он позволяет получать доступ к данным из разных баз данных.
Ответ №1
Экспорт “public” из db2 (пропуск грантов и права собственности):
pg_dump -xO -n public db2 > db2.sql
Экспортированный файл установит путь поиска (где-то около вершины):
SET search_path = public, pg_catalog;
измените его на:
CREATE SCHEMA IF NOT EXISTS new_schema; SET search_path = new_schema, pg_catalog;
Импортировать в db1, как обычно:
psql db1 < db2.sql
Вероятно, вы сначала захотите перенести все с общедоступной на новую схему в db1.
Если схема уже настроена в db1, вы можете сделать передачу за один раз:
pg_dump -xO -n public db2 | sed ‘s/search_path = public/search_path = new_schema/’ | psql db1
Не рекомендовал бы это без большого количества тестов, конечно.