PostgreSQL:甚至读取访问更改数据文件磁盘导致使用 pgbackrest 进行大型增量备份

Posted

技术标签:

【中文标题】PostgreSQL:甚至读取访问更改数据文件磁盘导致使用 pgbackrest 进行大型增量备份【英文标题】:PostgreSQL: even read access changes data files disk leading to large incremental backups using pgbackrest 【发布时间】:2021-05-19 12:06:54 【问题描述】:

我们正在使用 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 会在纯读访问时更改数据文件? 我们在没有任何其他资源访问数据库的情况下在纯数据库上进行了测试。

【问题讨论】:

【参考方案1】:

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

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

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

一个SELECT ... FOR UPDATE写一个行锁

autovacuum 删除死行版本

这些是DELETEUPDATE 的剩余部分。

autovacuum 冻结旧的可见行版本

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

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

永远不要对它执行INSERTUPDATEDELETE

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

【讨论】:

以上是关于PostgreSQL:甚至读取访问更改数据文件磁盘导致使用 pgbackrest 进行大型增量备份的主要内容,如果未能解决你的问题,请参考以下文章

使用 PostgreSQL 将 .sql 文件读入磁盘

PostgreSQL重新读取pg_hba.conf文件

PostgreSQL中的一些日志

持久化内存编程及其思考

硬盘无法访问磁盘结构损坏且无法读取,里面的数据怎么寻回

F盘提示无法访问磁盘结构损坏且无法读取的数据寻回法子