1

嗨伙计们,我有一个带有许多数据库的 postgresql 8.3 服务器。

实际上,我计划使用脚本备份这些数据库,该脚本将所有备份存储在与数据库同名的文件夹中,例如:

/mypath/backup/my_database1/
/mypath/backup/my_database2/
/mypath/backup/foo_database/

每天我每 2 小时进行 1 次转储,每天覆盖文件......例如,在 my_database1 文件夹中,我有:

my_database1.backup-00.sql  //backup made everyday at the 00.00 AM
my_database1.backup-02.sql  //backup made everyday at the 02.00 AM
my_database1.backup-04.sql  //backup made everyday at the 04.00 AM
my_database1.backup-06.sql  //backup made everyday at the 06.00 AM
my_database1.backup-08.sql  //backup made everyday at the 08.00 AM
my_database1.backup-10.sql  //backup made everyday at the 10.00 AM
[...and so on...]

这就是我实际上向自己保证能够恢复丢失至少 2 小时数据的每个数据库的方式。

2小时看起来还是太多了。

我查看了 WAL 文件中的 postgresql pitr,但是,这些文件似乎包含有关我所有数据库的所有数据。

我需要分离这些文件,就像分离转储文件一样。

如何?

否则,还有另一个易于安装的备份程序,允许我在 10 秒前仅恢复 1 个备份,但无需每 10 秒创建转储文件?

4

3 回答 3

2

一个 PostgresSQL 实例是不可能的。

您可以在几个实例之间划分 500 个表,每个表在不同的端口上侦听,但这意味着它们不会有效地使用内存等资源(在一个实例中保留但未使用的内存不能被另一个实例使用)。

Slony 在这里也不起作用,因为它不会复制 DDL 语句,例如删除表。

我建议两者都做:

  • 继续进行 pg_dump 备份,但尝试使其平滑 - 限制 pg_dump io 带宽,因此它不会削弱服务器,并连续运行它 - 当它完成最后一个数据库时,然后立即从第一个数据库开始;

  • 另外设置 PITR。

这样您可以快速恢复单个数据库,但可能会丢失一些数据。如果您决定不能丢失那么多数据,那么您可以将 PITR 备份恢复到临时位置(使用 fsync=off 和 pg_xlog 符号链接到 ramdisk 以提高速度),从那里 pg_dump 受影响的数据库并将其恢复到您的主数据库。

于 2009-07-15T16:49:23.150 回答
1

为什么要分离数据库?

PITR 的工作方式是不可能的,因为它适用于整个集群。在这种情况下,您可以做的是为每个数据库创建一个数据目录和一个单独的集群(虽然不推荐,因为它需要不同的端口和 postmaster 实例)。

我相信使用 PITR 而不是常规转储的好处超过了为每个数据库单独备份,因此也许您可以重新考虑为什么需要将其分开的原因。

另一种方法是使用Slony-I设置一些复制,但这需要一台单独的机器(或实例)来接收数据。另一方面,这样您将拥有一个近乎实时的复制系统。

更新评论:

要从错误中恢复,例如删除表,PITR 将是完美的,因为您可以重播到特定时间。但是,对于 500 个数据库,我知道这可能是很多开销。Slony-我可能不会工作,因为它正在复制。不确定它如何处理表删除。

我不知道你可以走的任何其他方式。我会做的可能仍然是 PITR,只是不犯任何错误;)。撇开玩笑不谈,这取决于犯错的频率,这可能是一个解决方案:

  • 为 PITR 设置它
  • 让第二个实例处于待命状态。
  • 发生错误时,在第二个实例上重播还原到该时间点。
  • 从该实例执行受影响数据库的 pg_dump。
  • 在该数据库的生产实例上执行 pg_restore。

但是,这需要您准备好第二个实例,无论是在同一台服务器上还是在不同的服务器上(建议使用不同的服务器)。此外,恢复时间会更长一些,因为它需要您进行一次额外的转储和恢复。

于 2009-07-15T14:04:32.997 回答
1

我认为你这样做的方式是有缺陷的。您应该拥有一个具有多个模式和角色的数据库。然后你可以使用 PITR。但是 PITR 不能替代转储。

于 2009-07-17T19:51:47.463 回答