Postgres:将数据从一个数据库的公共模式移动到另一个数据库的新模式的最佳方法

时间:2014-06-06 11:32:21

标签: database postgresql postgresql-9.3 pg-dump

我是Postgres的新手,刚刚发现我无法在一个SQL查询中访问不同数据库的数据。并且还在Postgres中学习了架构的概念。

现在,我有两个数据库

db1和db2

两者都在公共模式中具有相同名称的表。

现在,我想在db1中使用名称:new_schema

创建一个新模式

将数据从db2.public移动到db1.new_schema

最简单的方法是什么?

2 个答案:

答案 0 :(得分:10)

最简单的方法是重命名模式。但是,您必须确保您是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 :(得分:2)

出口"公共"来自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

当然,如果没有经过大量的测试,我们不建议这样做。