我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
命令来做到这一点?
任何其他方法也值得赞赏!
我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
命令来做到这一点?
任何其他方法也值得赞赏!
一种快速而肮脏的方式:
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;
有一个简单的解决方案:
--format=p
or -F p
)
create schema myschema;
SET search_path TO myschema;
现在您可以使用以下命令恢复备份转储
psql -f pub.backup.sql
该set search_path to <schema>
命令会将 myschema 设置为默认值,以便在此模式中创建新表和其他对象,而与它们之前所在的“默认”模式无关。
pg_restore 本身没有办法。您可以做的是使用 pg_restore 生成 SQL 输出,然后通过例如 sed 脚本发送它来更改它。但是,您需要小心编写该 sed 脚本的方式,因此它不匹配并更改数据内部的内容。
可能最简单的方法是在恢复后简单地重命名架构,即使用以下 SQL:
ALTER SCHEMA my_schema RENAME TO temp_schema
我相信,因为您使用压缩存档格式作为 pg_dump 的输出,所以在恢复之前无法更改它。选项将是使用默认输出并在模式名称上进行搜索和替换,但这将是有风险的,如果您不小心,可能会导致数据损坏。
如果您只有几个表,那么您可以一次恢复一个表,当您指定时pg_restore
接受。当然,您必须在恢复表之前设置架构,然后在完成恢复表时整理索引和约束。-d database
-t tablename
或者,在不同的端口上设置另一台服务器,使用新的 PostgreSQL 服务器恢复,重命名模式,转储它,然后恢复到原始数据库。当然,这有点杂乱无章,但它会完成工作。
如果您喜欢冒险,您可以使用十六进制编辑器更改转储文件中的数据库名称。我认为它只在转储中的一个地方提到,只要新旧数据库名称相同,它就可以工作。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
这个问题很老了,但也许可以帮助一些人。
流式传输pg_restore
to的输出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}