2

我们正在使用 pgbackrest 将我们的数据库备份到 Amazon S3。我们每周进行一次完整备份,每隔一天进行一次增量备份。我们的数据库大小约为 1TB,完整备份约为 600GB,增量备份也约为 400GB!

我们发现即使是对数据库的读访问(纯选择语句)也会影响底层数据文件(在 /usr/local/pgsql/data/base/xxxxxx 中)的变化。这会导致大量增量备份以及 Amazon S3 上的非常大的存储(成本)。

通常具有低索引名称的文件(例如 391089.1)在读取访问时会发生变化。

在更新时,我们会看到一个或多个文件的变化——索引可能与表中行的年龄相关。

更多事实:

  • Postgres 版本 13.1
  • 数据库在 docker 容器中运行(docker 版本 20.10.0)
  • 操作系统是 CentOS 7

我们在多台服务器上看到了这种现象。

有人可以解释一下,为什么 postgresql 会更改纯读访问的数据文件?我们在没有任何其他资源访问数据库的情况下在纯数据库上进行了测试。

4

1 回答 1

0

这个是正常的。我能马上想到的一些案例是:

  • 设置提示位的一条SELECT或其他 SQL 语句

    这是后续语句访问数据的快捷方式,因此它们不再需要查阅提交日志

  • 写行SELECT ... FOR UPDATE

  • autovacuum 删除死行版本

    这些是DELETE或的剩菜UPDATE

  • autovacuum 冻结旧的可见行版本

    如果事务 ID 计数器回绕,这对于防止数据损坏是必要的。

相当可靠地防止 PostgreSQL 将来修改表的唯一方法是:

  • 永远不要在它上面执行INSERT,UPDATEDELETE

  • 在表上运行VACUUM (FREEZE)并确保没有并发事务

于 2021-02-16T16:34:24.237 回答