PostgreSQL:即使读取访问也会更改磁盘上的数据文件,从而导致使用PGR进行大型增量备份

PostgreSQL:即使读取访问也会更改磁盘上的数据文件,从而导致使用PGR进行大型增量备份,postgresql,postgresql-13,pgbackrest,Postgresql,Postgresql 13,Pgbackrest,我们正在使用PGbackback将数据库备份到AmazonS3。我们每周进行一次完整备份,每隔一天进行一次增量备份。 我们的数据库大小约为1TB,完整备份约为600GB,增量备份也约为400GB 我们发现,即使对数据库进行读取访问(纯select语句),也会导致底层数据文件(in/usr/local/pgsql/data/base/xxxxxx)发生更改。这会在AmazonS3上产生大量的增量备份和非常大的存储(成本) 通常,具有低索引名(例如391089.1)的文件在读访问时会发生更改 在更新

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

我们发现,即使对数据库进行读取访问(纯select语句),也会导致底层数据文件(in/usr/local/pgsql/data/base/xxxxxx)发生更改。这会在AmazonS3上产生大量的增量备份和非常大的存储(成本)

通常,具有低索引名(例如391089.1)的文件在读访问时会发生更改

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

还有一些事实:

  • Postgres 13.1版
  • 数据库正在docker容器中运行(docker版本20.10.0)
  • 操作系统是CentOS 7
我们在多台服务器上看到这种现象

有人能解释一下,为什么postgresql在纯读访问上更改数据文件?
我们在纯数据库上测试,没有任何其他资源访问数据库。

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

  • 选择
    或设置提示位的其他SQL语句

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

  • a
    选择。。。用于更新
    写入行锁

  • 自动真空清除死区版本

    这些是
    删除
    更新
    的剩余内容

  • 自动真空冻结旧的可见行版本

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

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

  • 切勿对其执行
    插入
    更新
    删除

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