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

Я новичок в Postgres и только что обнаружил, что не могу получить доступ к данным разных баз данных в одном SQL-запросе. А также изучил концепцию схемы в Postgres.

теперь у меня две базы данных

db1 и db2

оба имеют таблицы с одинаковым именем в их общедоступной схеме.

теперь я хочу создать новую схему в db1 с именем: new_schema

и переместить данные из db2.public для db1.new_schema

Что такое простой способ сделать это ?

2 ответов


самый простой способ сделать это, чтобы переименовать схем. Однако вы должны быть уверены, что вы являетесь единственным пользователем базы данных 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 успешно. он позволяет получать доступ к данным различных баз данных.


экспорт "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

не рекомендую это без большого тестирования, Конечно.