0

据我了解,pg_repack创建一个临时的“镜像”表(表 B)并从原始表(表 A)复制行并重新索引它们,然后用镜像替换原始表。镜像步骤通过逻辑复制(一次插入大量)会产生很多噪音,所以我想忽略镜像表被复制。

不过,我对切换期间发生的事情有点困惑。丢失某些更改是否有风险?我认为没有,因为所有实际写入仍然会在切换之前和之后进入原始表,所以它应该是安全的吧?

我们在 AWS Aurora 上运行 Postgres 10.7,使用wal2json作为复制的输出插件。

4

2 回答 2

0

要执行重新打包,pg_repack 将:

  1. 创建一个日志表来记录对原始表所做的更改。
  2. 在原始表上添加一个触发器,将 INSERT、UPDATE 和 DELETE 记录到我们的日志表中。
  3. 创建一个包含旧表中所有行的新表。
  4. 在这个新表上建立索引。
  5. 将日志表中发生的所有更改应用于新表。
  6. 使用系统目录交换表,包括索引和 toast 表。
  7. 删除原始表。

根据我的经验,日志表会保留所有更改并在构建索引后应用它们,此外,如果重新打包也需要回滚应用于原始表的更改。

于 2020-04-24T18:28:19.457 回答
0

我既没有使用 pg_repack 也没有使用逻辑复制,但根据 pg_repack Github 存储库,使用 pg_repack 和逻辑复制可能存在问题:请参阅 https://github.com/reorg/pg_repack/issues/135

于 2020-04-24T09:26:29.987 回答