75

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

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

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

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

任何其他方法也值得赞赏!

4

8 回答 8

66

一种快速而肮脏的方式:

1)重命名默认架构:

alter schema public rename to public_save;

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

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;
于 2013-05-01T02:28:10.380 回答
64

有一个简单的解决方案:

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

create schema myschema;

SET search_path TO myschema;

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

psql -f pub.backup.sql

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

于 2013-06-01T15:46:26.557 回答
15

pg_restore 本身没有办法。您可以做的是使用 pg_restore 生成 SQL 输出,然后通过例如 sed 脚本发送它来更改它。但是,您需要小心编写该 sed 脚本的方式,因此它不匹配并更改数据内部的内容。

于 2010-11-16T13:47:24.690 回答
14

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

ALTER SCHEMA my_schema RENAME TO temp_schema

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

于 2010-11-16T06:46:06.413 回答
4

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

或者,在不同的端口上设置另一台服务器,使用新的 PostgreSQL 服务器恢复,重命名模式,转储它,然后恢复到原始数据库。当然,这有点杂乱无章,但它会完成工作。

如果您喜欢冒险,您可以使用十六进制编辑器更改转储文件中的数据库名称。我认为它只在转储中的一个地方提到,只要新旧数据库名称相同,它就可以工作。YMMV,不要在生产环境中做这样的事情,如果这炸毁了你的家乡,不要怪我,以及所有其他常见的免责声明。

于 2010-11-16T22:49:58.943 回答
3

重命名临时数据库中的架构。

导出架构:

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

创建一个新的数据库。恢复导出:

psql -f prod.sql

ALTER SCHEMA prod RENAME TO somethingelse;

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

(删除数据库)

对于数据,您只需修改search_path顶部的集合。

于 2017-10-09T05:29:39.767 回答
2

如前所述,pg_dump、psql 或 pg_restore 没有直接支持在转储/恢复过程中更改模式名称。但是使用“普通”格式导出然后修改 .sql 文件相当简单。这个 Bash 脚本执行以下基本操作:

rename_schema () {

  # Change search path so by default everything will go into the specified schema
  perl -pi -e "s/SET search_path = $2, pg_catalog/SET search_path = $3, pg_catalog, $2;/" "$1"

  # Change 'ALTER FUNCTION foo.' to 'ALTER FUNCTION bar.'
  perl -pi -e 's/^([A-Z]+ [A-Z]+) '$2'\./$1 '$3'./' "$1"

  # Change the final GRANT ALL ON SCHEMA foo TO PUBLIC
  perl -pi -e 's/SCHEMA '$2'/SCHEMA '$3'/' "$1"

}

用法:

pg_dump --format plain --schema=foo --file dump.sql MYDB
rename_schema dump.sql foo bar
psql -d MYDB -c 'CREATE SCHEMA bar;'
psql -d MYDB -f dumpsql
于 2018-05-21T03:36:37.457 回答
1

这个问题很老了,但也许可以帮助一些人。

流式传输pg_restoreto的输出sed并替换模式名称,以便将转储导入到不同的模式。

就像是:

pg_restore ${dumpfile} | \
    sed -e "s/OWNER TO ${source_owner}/OWNER TO ${target_owner}/" \
        -e "s/${source_owner}/${target_schema}/" | \
       psql -h ${pgserver} -d ${dbname} -U ${pguser} 
于 2021-06-21T08:28:09.530 回答