我想使用不同的架构还原数据库

abu*_*ker 55 postgresql pg-dump pg-restore

temp1使用follwing命令转储了一个名为的数据库

$  pg_dump -i -h localhost  -U postgres -F c -b -v -f pub.backup temp1 
Run Code Online (Sandbox Code Playgroud)

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

有没有办法用pg_restore命令做到这一点?

任何其他方法也不胜感激!

小智 58

有一个简单的解决方案:

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

create schema myschema;

SET search_path TO myschema;

现在,您可以使用该命令恢复备份转储

psql -f pub.backup.sql

set search_path to <schema>命令将myschema设置为默认值,以便在此模式中创建新表和其他对象,而不管它们之前存在的"默认"模式.

  • 这在Postgres 9.6.8/10.3中不起作用:`pg_dump`不再使用`SET search_path`; 相反,它将模式名称作为转储中所有命令的前缀 (11认同)
  • @PeterEhrlich您可以使用子进程在转储内容之前将某些内容写入文件。例如: `( echo "CREATE SCHEMA myschema; SET search_path TO myschema;" ; pg_dump -F p ... ) | gzip -9 &gt; dump.sql.gz` (2认同)

sha*_*unc 47

快速而肮脏的方式:

1)重命名默认架构:

alter schema public rename to public_save;
Run Code Online (Sandbox Code Playgroud)

2)创建新模式作为默认模式:

create schema public;
Run Code Online (Sandbox Code Playgroud)

3)恢复数据

pg_restore -f pub.backup db_temp [and whatever other options]
Run Code Online (Sandbox Code Playgroud)

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

alter schema public rename to temp_schema;
alter schema public_save rename to public;
Run Code Online (Sandbox Code Playgroud)


Mag*_*der 12

pg_restore本身没办法.你可以做的是使用pg_restore生成SQL输出,然后通过例如sed脚本发送它来更改它.您需要注意如何编写该sed脚本,因此它不匹配并更改数据中的内容.


Ham*_*ish 10

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

ALTER SCHEMA my_schema RENAME TO temp_schema
Run Code Online (Sandbox Code Playgroud)

我相信,因为您使用压缩归档格式输出pg_dump,所以在恢复之前无法改变它.选项是使用默认输出并对模式名称进行搜索和替换,但这样做会有风险,如果不小心可能会导致数据损坏.

  • 以什么方式?SQL语句是更改模式名称的唯一安全方法.在另一个答案中也提出了另一种解决方案,我们都解释说它存在风险.可怜的低调. (4认同)
  • 我更改了架构名称,但在那之后,我无法更改 serach 路径!重命名后用户无法搜索任何表! (2认同)