Database Postgresql:使用不同的模式将不同的数据库复制到一个数据库中

Database Postgresql:使用不同的模式将不同的数据库复制到一个数据库中,database,postgresql,Database,Postgresql,我在服务器中有三个postgresql数据库:db1,db2,db3。现在,我想将每个数据库中的表保存到一个新的数据库dbnew,并将其与schemas区分开来。这意味着这个数据库中有三个模式dbnew.db1,dbnew.db2,dbnew.db3。实现它最简单的方法是什么 (注:我已将数据库转储到本地文件。) 我测试了@a_horse_和_no_name的答案,它似乎有效,但有一个新问题,如下所示: 如果在db1中有一个类似postgis的扩展,那么我用psql加载db1,并将public重

我在服务器中有三个
postgresql
数据库:
db1
db2
db3
。现在,我想将每个数据库中的表保存到一个新的数据库
dbnew
,并将其与
schemas
区分开来。这意味着这个数据库中有三个模式
dbnew.db1
dbnew.db2
dbnew.db3
。实现它最简单的方法是什么

(注:我已将数据库转储到本地文件。)

我测试了@a_horse_和_no_name的答案,它似乎有效,但有一个新问题,如下所示:


如果在
db1
中有一个类似
postgis
的扩展,那么我用
psql
加载
db1
,并将
public
重命名为
db1
,并创建一个名为
public
的新模式。我无法为
public
架构创建扩展
postgis
,因为它表明
扩展postgis已经存在
。但是,如果我使用命令
\dx
,它将显示扩展位于schema
db1
中,而不是
dbnew
中。即使我使用
create EXTENSION postgis with schema public
它也不起作用。

基于备份/普通和使用psql恢复

我假设dbnew中的模式已创建,模式的权限设置为使用psql执行所有恢复的用户

通过某种方式创建sql文件(在pgadmin3中为普通备份),可以使用psql将生成的文件加载到dbnew数据库中,但它们应该通过sed或grep管道传输,以便所有表名都获得模式前缀


我的意思是,从原始数据库进行备份,或者首先将备份恢复到临时数据库(如果它们还不是sql),然后将它们作为纯文本进行备份

基于使用psql的备份/普通和恢复

我假设dbnew中的模式已创建,模式的权限设置为使用psql执行所有恢复的用户

通过某种方式创建sql文件(在pgadmin3中为普通备份),可以使用psql将生成的文件加载到dbnew数据库中,但它们应该通过sed或grep管道传输,以便所有表名都获得模式前缀


我的意思是,从原始数据库进行备份,或者首先将备份恢复到临时数据库(如果它们还不是sql),然后将它们作为纯文本进行备份

假设所有表都存储在源数据库的
public
模式中

导入第一个转储(通过运行
psql…-f dumpfile.sql
),然后将公共架构重命名为新名称:

alter schema schema public rename to db1;
然后重新创建公共架构:

create schema public;

现在,对其他两个数据库脚本执行相同的操作。

假设所有表都存储在源数据库的
公共
模式中

导入第一个转储(通过运行
psql…-f dumpfile.sql
),然后将公共架构重命名为新名称:

alter schema schema public rename to db1;
然后重新创建公共架构:

create schema public;

现在对另外两个数据库脚本执行相同的操作。

解决方案非常好,可以将二进制备份快速地保存到新数据库中。但是第二次重命名将失败,因为模式已经存在。有效的方法是对公共模式中的每个表使用“alter table public.set schema dbnew;”。我发现,如果我用扩展名重命名模式,并且如果我想在
public
schema中创建扩展名,则会失败。解决方案很好,将二进制备份放入新数据库中,速度非常快。但是第二次重命名将失败,因为模式已经存在。有效的方法是对公共模式中的每个表使用“alter table public.set schema dbnew;”。我发现,如果我使用扩展名重命名模式,并且如果我想在
public
schema中创建扩展名,则会失败。