Postgres: лучший способ переместить данные из открытой схемы одного БД в новую схему другой БД

Вопрос:Я новичок в Postgres и только что обнаружил, что я не могу получить доступ к данным разных баз данных в одном SQL-запросе. А также узнал концепцию схемы в Postgres. Теперь у меня есть две базы данных db1 и db2 Оба имеют таблицы с одинаковым именем в своей общедоступной схеме. Теперь я хочу создать новую схему

Вопрос:

Я новичок в 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

Не рекомендовал бы это без большого количества тестов, конечно.

Оцените статью
Добавить комментарий