我有postgres数据库的备份 - 整个数据库实例在一个夜间备份中。是否可以从该备份中恢复其中一个数据库?或者,如果我想访问单个数据库(用于迁移或还原),是否需要更改数据库备份方案以执行单个转储?
答案 0 :(得分:13)
您可以使用以下文本处理方式从文本格式(pg_dumpall)的完整数据库集群转储中访问各个数据库:
awk '/^\\connect database_name/ {flag=1;print;next}
/^\\connect/ {flag=0}
flag { print }' \
< all_databases.sql \
> database_name.sql
这将从pg_dumpall文件获取“\connect database_name
”和下一个“\connect
”之间的所有内容。但效率不高。
但是我建议像这样单独转储每个数据库:
# Dumping global data (for example roles)
pg_dumpall -g > /var/lib/pgsql/backups/globals.sql
#Dumping indidual databases in tar (uncompressed binary) format
for dbname in
`
psql -qXtc "
select datname from pg_catalog.pg_database
where datname<>'template0'" template1
`
do
pg_dump -b -F t "$dbname" > "/var/lib/pgsql/backups/$dbname.dump"
done
我假设你的意思是“我可以从整个数据库集群的pg_dumpall中恢复一个数据库吗?”
答案 1 :(得分:3)
是的,如果您的备份是"an archive created by pg_dump in one of the non-plain-text formats.",请使用{ - 1}}的“--schema =”选项。
另一方面,我不确定你在这里使用的是正确的术语 - 你将数据库集群称为“整个数据库实例”;你在解释中询问“数据库”,但在标题中你写了“架构”等等。
编辑现在,经过一番考虑,我相信您有一个使用"pg_dumpall
"创建的群集备份。 “pg_dumpall”仅创建纯文本(SQL命令)备份。在这种情况下,不可能只恢复一个数据库(或只恢复数据库中的一个模式)。
然后是的,您需要更改备份过程以使用非纯文本格式备份单个数据库(建议使用--format = custom)。
实际上,我在数据库服务器上使用的备份程序就是这样做的。