我已经取了一个名为数据库的转储 temp1, ,通过使用follwing命令

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

现在,我想在一个称为“ db_temp”的不同数据库中还原转储,但是我只希望在“ temp_schema”中创建所有表“ DB_TEMP”数据库。

有什么方法可以使用 pg_restore 命令?

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

有帮助吗?

解决方案

pg_restore本身没有办法。您可以做的就是使用PG_Restore生成SQL输出,然后将其发送到例如SED脚本以更改它。您需要谨慎编写SED脚本,因此它与数据中的内容不匹配并更改内容。

其他提示

有一个简单的解决方案:

  • 以普通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设置为默认值,以便在本架构中创建新的表和其他对象,而与他们以前居住的“默认”模式无关。

快速而肮脏的方式:

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;

最简单的方法可能是简单地将架构重命名后,即以下SQL:

ALTER SCHEMA my_schema RENAME TO temp_schema

我相信,由于您使用的是压缩档案格式来用于PG_DUMP的输出,因此在还原之前无法更改它。选项是使用默认输出并在模式名称上进行搜索并替换,但这是有风险的,如果您不小心,可能会导致数据损坏。

如果您只有几张桌子,那么您可以一次还原一张桌子, pg_restore 接受 -d database 指定时 -t tablename. 。当然,您必须在还原表格之前设置架构,然后在还原桌子后整理索引和约束。

或者,在另一个端口上设置另一台服务器,使用新的PostgreSQL Server还原,重命名架构,将其丢弃并将其还原到您的原始数据库中。当然,这有点像是一个笨拙的事情,但是可以完成工作。

如果您喜欢冒险,则可以使用十六进制编辑器更改转储文件中的数据库名称。我认为只有在转储中的一个地方提到,只要新的和旧的数据库名称与应有用。 YMMV,在生产环境中不要做这样的事情,如果这会炸毁并将您的家乡和所有其余的免责声明炸毁,请不要怪我。

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

导出模式:

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 在顶部。

如前所述,在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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top