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 删除死行版本
这些是DELETE
或UPDATE
的剩余部分。
autovacuum 冻结旧的可见行版本
如果事务 ID 计数器回绕,这是防止数据损坏所必需的。
能够相当可靠地防止 PostgreSQL 将来修改表的唯一方法是:
永远不要对它执行INSERT
、UPDATE
或DELETE
在表上运行VACUUM (FREEZE)
,确保没有并发事务
【讨论】:
以上是关于PostgreSQL:甚至读取访问更改数据文件磁盘导致使用 pgbackrest 进行大型增量备份的主要内容,如果未能解决你的问题,请参考以下文章