我想用不同的模式还原数据库
-
10-10-2019 - |
题
我已经取了一个名为数据库的转储 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