我能否从完整数据库的pg_dump中恢复一个模式(schema)?

8

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

2个回答

14
您可以通过一些文本处理方式(例如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中恢复一个数据库?”。

谢谢。你的备用备份脚本看起来正是所需。 - cnk

6

是的,如果你的备份是"由pg_dump在非纯文本格式之一中创建的归档文件",请使用"--schema="选项来pg_restore

另一方面,我不确定你在这里使用了正确的术语 - 你把数据库集群称为"整个数据库实例";在解释中你询问"数据库",但在标题中你写了"模式"等等。

编辑: 现在,在经过一些思考之后,我相信你有一个集群备份,是用"pg_dumpall"创建的。 "pg_dumpall"仅创建纯文本(SQL命令)备份。在这种情况下,不可能只恢复一个数据库(或一个数据库中的一个模式)。

那么是的,你需要更改备份程序,使用非纯文本格式备份各个数据库(--format=custom是推荐的格式)。

事实上,我在我的DB服务器上使用的备份程序就是这样做的。


谢谢。很抱歉使用了令人困惑的术语。我目前在Oracle、MySQL和Postgres中拥有生产数据,有时会对“数据库”、“表空间”、“实例”等术语的含义感到有些混淆。 - cnk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接