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
не рекомендую это без большого тестирования, Конечно.