【问题标题】:Postgres: Best way to move data from public schema of one DB to new schema of another DBPostgres:将数据从一个数据库的公共架构移动到另一个数据库的新架构的最佳方式
【发布时间】:2014-06-09 18:45:30
【问题描述】:
我是 Postgres 的新手,刚刚发现我无法在一个 SQL 查询中访问不同数据库的数据。并且还学习了 Postgres 中 schema 的概念。
现在,我有两个数据库
db1 和 db2
两者的公共架构中都有同名的表。
现在,我想在 db1 中创建一个名为 new_schema 的新模式
并将数据从 db2.public 移动到 db1.new_schema
最简单的方法是什么?
【问题讨论】:
标签:
database
postgresql
postgresql-9.3
pg-dump
【解决方案1】:
最简单的方法是重命名模式。但是,您必须确保您是 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.它可以访问不同数据库的数据。
【讨论】:
-
更新,关于dblink,最好使用postgres_fdw。正如指南所说,它“使用更现代且符合标准的基础架构提供大致相同的功能”。
【解决方案2】:
从 db2 导出“public”(跳过授权和所有权):
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 中已经设置了 schema,您可以一次性完成转移:
pg_dump -xO -n public db2 | sed 's/search_path = public/search_path = new_schema/' | psql db1
当然,如果没有大量测试,不建议这样做。