【问题标题】:Dump postgres data with indexes使用索引转储 postgres 数据
【发布时间】:2011-09-30 12:45:18
【问题描述】:

我有一个 Postgres 9.0 数据库,我经常对其进行数据转储。

这个数据库有很多索引,每次我恢复一个转储时,postgres 都会启动后台任务vacuum clean(对吗?)。该任务消耗大量处理时间和内存来重新创建已恢复转储的索引。

我的问题是:

  1. 有没有办法转储数据库数据和该数据库的索引?
  2. 如果有办法,是否值得付出努力(我的意思是用索引转储数据会比真空吸尘器更好)?
  3. Oracle 有一些“数据泵”命令可以更快地进行 imp 和 exp。 postgres 有类似的吗?

提前致谢, 安德烈

【问题讨论】:

  • dba.stackexchange.com 的好问题
  • 使用 pg_dump 时,无法保存索引数据——导入后必须重建索引。但是,您可以简单地 tar 整个 postgres 数据目录,而不是执行 pg_dump。
  • 谢谢弗兰克,我会试试看,也许这对我来说是最好的选择。我唯一担心的是不同的次要 postgres 版本和操作系统之间的差异。
  • @FrankFarmer,将对整个数据目录进行 tar 处理,并将其移动到新的服务器上,这会“正常工作”吗?如果旧服务器在旧 CentOS 和 PG 8.x 上,而新数据库在新硬件堆栈上并使用 PG 9.6?

标签: postgresql indexing vacuum


【解决方案1】:

如果您使用 pg_dump 两次,一次使用--schema-only,一次使用--data-only,您可以将仅模式输出分成两部分:第一部分使用裸表定义,最后一部分使用约束和索引。 pg_restore 也可以做类似的事情。

【讨论】:

  • 这实际上应该接近公认的答案,并且 PG 文档本身应该清楚地说明这一点。否则,转储和恢复在许多现实世界的场景中都是相当老套的。
【解决方案2】:

最佳实践可能是

  • 在没有索引的情况下恢复架构
  • 并且可能没有限制,
  • 加载数据,
  • 然后创建约束,
  • 并创建索引。

如果存在索引,批量加载将使 PostgreSQL 写入数据库和索引。批量加载将使您的表统计信息无用。但是,如果您先加载数据,然后创建索引,则统计信息会自动更新。

我们将创建索引的脚本和创建表的脚本存储在版本控制下的不同文件中。这就是原因。

在您的情况下,changing autovacuum settings 可能会对您有所帮助。您也可以考虑为某些表或所有表禁用自动清理,但这可能有点极端。

【讨论】:

  • 仅供参考,这几乎就是 pg_dump -> pg_restore 所做的。
  • @ScottMarlowe:不过,OP 只是在转储数据。 pg_dump --data-only 不包括 CREATE INDEX 语句。不过,--rebuild-indexes 选项会很方便。也许我会努力。
  • OP 根本不清楚他们是否使用 --data-only 转储数据。我想这就是他们所说的“进行数据转储”的意思,但谁知道呢? --rebuild-indexes 会非常方便。
猜你喜欢
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多