我可以从整个数据库的pg_dump中恢复一个模式吗?

时间:2009-06-09 14:12:30

标签: postgresql

我有postgres数据库的备份 - 整个数据库实例在一个夜间备份中。是否可以从该备份中恢复其中一个数据库?或者,如果我想访问单个数据库(用于迁移或还原),是否需要更改数据库备份方案以执行单个转储?

2 个答案:

答案 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)。

实际上,我在数据库服务器上使用的备份程序就是这样做的。