我使用以下命令导出了名为temp1
的数据库:
$ pg_dump -i -h localhost -U postgres -F c -b -v -f pub.backup temp1
现在我想将转储文件恢复到名为 "db_temp" 的不同数据库中,但是我只想让所有表格都创建在“db_temp”数据库中的“temp_schema”(而不是fms temp1数据库中的默认模式)。
是否有任何方法可以使用pg_restore
命令来实现此操作?
也欢迎任何其他方法!
我使用以下命令导出了名为temp1
的数据库:
$ pg_dump -i -h localhost -U postgres -F c -b -v -f pub.backup temp1
现在我想将转储文件恢复到名为 "db_temp" 的不同数据库中,但是我只想让所有表格都创建在“db_temp”数据库中的“temp_schema”(而不是fms temp1数据库中的默认模式)。
是否有任何方法可以使用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
或-F p
,格式为“p”)
create schema myschema;
SET search_path TO myschema;
现在,您可以使用以下命令还原备份转储:
psql -f pub.backup.sql
set search_path to <schema>
命令将myschema设置为默认值,使得新表和其他对象在该模式下创建,而不是它们之前所属的“默认”模式中创建。
( echo "CREATE SCHEMA myschema; SET search_path TO myschema;" ; pg_dump -F p ... ) | gzip -9 > dump.sql.gz
- gldnspudpg_dump
不再使用SET search_path
,而是在转储中为所有命令添加模式名称前缀。 - user2384183在pg_restore本身中不存在该方法。您可以使用pg_restore生成SQL输出,然后将其通过sed脚本发送以进行更改。但是,您需要注意编写sed脚本的方式,以避免匹配和更改数据中的内容。
最简单的方法可能是在还原后直接重命名模式,即使用以下SQL:
ALTER SCHEMA my_schema RENAME TO temp_schema
我认为,因为您正在使用压缩的存档格式作为pg_dump输出的格式,所以您无法在还原之前对其进行修改。选项是使用默认输出,并在模式名称上执行搜索和替换,但这将是有风险的,如果您不小心可能会导致数据损坏。
pg_restore
在指定-t tablename
时接受-d database
。当然,在还原表格之前,您必须设置模式,并在完成还原表格后解决索引和约束问题。
或者,在不同端口上设置另一个服务器,使用新的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
s/\b$OLD_SCHEMA/$NEW_SCHEMA/g
。 - Pipo$OLD_SCHEMA
出现略微更安全。 - Sakari Cajanuspg_restore
的输出流传输给sed
并替换模式以将转储导入到不同的模式中。pg_restore ${dumpfile} | \
sed -e "s/OWNER TO ${source_owner}/OWNER TO ${target_owner}/" \
-e "s/${source_schema}/${target_schema}/" | \
psql -h ${pgserver} -d ${dbname} -U ${pguser}
pg_dump
而不是 pg_restore
吗? - John Smith