我想用不同的模式恢复数据库

亲爱的大家 ,
我已经转储了一个名为temp1的数据库
使用follwing命令

$ pg_dump -i -h localhost -U postgres -F c -b -v -f pub.backup temp1 

现在我想在另一个名为“db_temp”的数据库中恢复转储,但是我只是希望所有的表都应该在“temp_schema”(而不是fms temp1数据库中的默认模式)中创build“db_temp”数据库​​。

有没有办法使用pg_restore命令来做到这一点
任何其他方法也不胜感激!
提前致谢!

pg_restore本身没有办法。 你可以做的是使用pg_restore生成SQL输出,然后通过例如sed脚本发送它来改变它。 你需要小心你如何编写sed脚本,所以它不匹配和改变你的数据内的东西。

有一个简单的解决scheme:

  • 以普通的SQL格式创build备份转储(使用参数“–format = p”或“-F p”格式“p”)
  • 使用您最喜欢的编辑器编辑您的pub.backup.sql转储,并在文件顶部添加以下两行:

创build模式myschema;

将search_path设置为myschema;

现在你可以用命令恢复你的备份转储

psql -f pub.backup.sql

“set search_path to”命令会将myschema设置为默认值,以便在此模式中创build新表和其他对象,与之前所处的“默认”模式无关。

一个快速和肮脏的方式:

1)重命名默认模式:

 alter schema public rename to public_save; 

2)创build新的模式作为默认模式:

 create schema public; 

3)恢复数据

 pg_restore -f pub.backup db_temp [and whatever other options] 

4)根据需要重新命名模式:

 alter schema public rename to temp_schema; alter schema public_save rename to public; 

也许最简单的方法是在恢复后简单地重命名模式,即使用以下SQL:

 ALTER SCHEMA my_schema RENAME TO temp_schema 

我相信,因为你使用压缩的归档格式输出pg_dump,所以在恢复之前不能修改它。 该选项将使用默认的输出,并在模式名称上进行search和replace,但如果您不小心,这可能会导致数据被破坏。

如果你只有几个表,那么你可以一次恢复一个表,当你指定-t tablename时, pg_restore接受-d database 。 当然,在恢复表之前,必须先设置模式,然后在恢复表时完成索引和约束。

或者,在另一个端口上设置另一台服务器,使用新的PostgreSQL服务器进行恢复,重命名该模式,将其转储并还原到原始数据库中。 这当然是一个混乱,但它会完成工作。

如果您喜欢冒险,则可以使用hex编辑器更改转储文件中的数据库名称。 我认为它只是在转储中的一个地方提到,只要新旧数据库名称是相同的,它应该工作。 YMMV,在生产环境中不要这样做,不要责怪我,如果这炸了起来,水平你的家乡和所有其他通常的免责声明。

重命名临时数据库中的模式。

导出模式:

 pg_dump --schema-only --schema=prod > prod.sql 

创build一个新的数据库。 恢复出口:

 psql -f prod.sql ALTER SCHEMA prod RENAME TO somethingelse; pg_dump --schema-only --schema=somethingelse > somethingelse.sql 

(删除数据库)

对于数据,您可以修改顶部的设置search_path