我想使用不同的架构恢复数据库

问题描述 投票:0回答:8

我使用以下命令转储了名为

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
命令来做到这一点吗?

任何其他方法也将受到赞赏!

postgresql pg-dump pg-restore
8个回答
77
投票

一种快速而肮脏的方法:

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;

71
投票

有一个简单的解决方案:

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

create schema myschema;

SET search_path TO myschema;

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

psql -f pub.backup.sql

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


18
投票

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


16
投票

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

ALTER SCHEMA my_schema RENAME TO temp_schema

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


4
投票

如果您只有几张表,则一次可以恢复一张表,当您指定

pg_restore
时,
-d database
接受
-t tablename
。当然,您必须在恢复表之前设置架构,然后在完成恢复表后整理索引和约束。

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

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


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
即可。


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

2
投票

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

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

类似:

pg_restore ${dumpfile} -f - | \
    sed -e "s/OWNER TO ${source_owner}/OWNER TO ${target_owner}/" \
        -e "s/${source_schema}/${target_schema}/" | \
       psql -h ${pgserver} -d ${dbname} -U ${pguser} 
© www.soinside.com 2019 - 2024. All rights reserved.