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
,它将显示扩展位于schemadb1
中,而不是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中创建扩展名,则会失败。