PostgreSQL:即使读取访问权限也会更改数据文件磁盘,导致使用 pgbackrest 进行大量增量备份

PostgreSQL: even read access changes data files disk leading to large incremental backups using pgbackrest

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

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

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

在更新时,我们看到一个或多个文件发生变化 - 索引可能与 table 中行的存在时间相关联。

更多事实:

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

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

这是正常的。我马上能想到的一些情况是:

  • a SELECT 或其他 SQL 语句设置 提示位

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

  • a SELECT ... FOR UPDATE写行锁

  • autovacuum 删除死行版本

    这些是 DELETEUPDATE 的剩菜。

  • autovacuum 冻结旧的可见行版本

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

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

  • 切勿对其执行 INSERTUPDATEDELETE

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