我们在 Amazon Web Services 上有一个 Postgres RDS 实例。我们启用了自动备份,并且每天拍摄快照。我们想为我们自己管理的 RDS 实例生成本地“最新”备份。对实例运行 pg_dump 是不够的,因为我们希望能够将数据库恢复到任何时间点。我们希望对 RDS 和所有 WAL 文件进行本地备份,因为该备份已进行。问题:
是否可以访问 RDS 在其备份例程中自动生成的 WAL 文件和备份?这将是理想的。我想下载它们的本地副本。经过初步调查,我觉得这个问题的答案是否定的。听起来 RDS 将其 WAL 文件和备份存储在 S3 中,但这使我们无法访问它们。我很想确认。
有没有其他方法可以访问 RDS 实例上发生的事务(WAL 文件)?我想我们应该能够在 EC2 上创建一个 Postgres 数据库,并将我们的主要“实时”RDS 实例中的事务“馈送”到这个 EC2 实例中。一旦我们的 EC2 实例更新,我们就可以从那里提取 WAL 文件。不过,多么令人头疼:/这种设置可能吗?从我们的 RDS 实例“馈送”到 EC2 实例以使其始终保持最新状态有什么魔力?
谢谢!
更新:我已在 AWS 论坛上发布了有关此内容的信息 - 请加入并在那里索取。
在撰写本文时,Amazon RDS 不支持 RDS 之外的物理复制。您可以使用登录
GRANT
用户权限,但您不能在.REPLICATION
rds_superuser
replication
pg_hba.conf
此外,当您在 RDS 中创建 DB 参数组时,一些关键参数会显示但已锁定,例如
archive_command
,锁定为/etc/rds/dbbin/pgscripts/rds_wal_archive %p
。AWS RDS for PostgreSQL 似乎没有公开这些 WAL 以供外部访问(例如,通过 S3),因为如果您要对外部 PITR 使用 WAL-shipping 复制则需要这样做。所以在这一点上,如果你想要wal-shipping,不要使用RDS。它是一个易于使用的罐头数据库,但易于使用通常意味着它也是有限的,这里肯定就是这种情况。正如 Joe Love 在评论中指出的那样,它在 RDS中提供 WAL 运输和 PITR ,但您无法从RDS外部访问 WAL 。
所以你需要使用 RDS 自己的备份工具——转储、快照和它自己的基于 WAL 的 PITR。
即使 RDS 确实允许您建立复制连接(用于
pg_basebackup
或流式复制)并允许您访问存档的 WAL,您也可能无法实际使用该 WAL。RDS 运行一个打过补丁的 PostgreSQL,但没有人知道打了多少补丁或者它是否显着改变了磁盘格式。它也运行在亚马逊选择的架构上,可能是 x64 Linux,但不容易确定。由于 PostgreSQL 的磁盘格式和复制依赖于架构,因此您只能复制到与 Amazon RDS 使用的架构相同的主机,并且前提是您的 PostgreSQL 构建与他们的兼容。除其他外,这意味着您没有任何简单的方法可以从 RDS 迁移。您必须停止对数据库的所有写入足够长的时间才能执行 a
pg_dump
、恢复它并让新数据库运行。复制和故障转移、rsync 等的常用技巧将不起作用,因为您无法直接访问数据库主机。即使 RDS 运行未打补丁的 PostgreSQL,
pg_basebackup
出于安全原因,Amazon 也可能不希望允许您将 WAL 流式传输到 RDS 或导入 RDS。PostgreSQL 将数据目录视为受信任的内容,如果您制作了任何巧妙的“LANGUAGE c”函数来挂钩内部功能或做任何其他棘手的事情,您可能能够利用服务器获得比您应该拥有的更大的访问权限. 所以亚马逊不会很快允许入站 WAL。它们可以支持出站 WAL 发送,但上述格式兼容性、自由更改等问题仍然适用。
相反,您应该使用 Londiste 或 Bucardo 之类的工具。
现在可以使用逻辑复制: https ://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html#PostgreSQL.Concepts.General.FeatureSupport.LogicalReplication
根据该论坛主题的回复,从2014 年 11 月 10 日起,现在支持使用基于触发器的系统(如 Londiste 和 Bucardo)进出 RDS 进行复制。
公告在这里