我想用不同的模式恢复数据库
亲爱的大家 ,
我已经转储了一个名为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
。