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 中行的存在时间相关联。
更多事实:
- Postgres 版本 13.1
- 数据库是 运行 在 docker 容器中(docker 版本 20.10.0)
- OS 是美分OS 7
我们在多台服务器上看到了这种现象。
有人可以解释一下,为什么 postgresql 在纯读访问时更改数据文件?
我们在没有任何其他资源访问数据库的情况下在纯数据库上进行了测试。
这是正常的。我马上能想到的一些情况是:
a SELECT
或其他 SQL 语句设置 提示位
这是访问数据的后续语句的快捷方式,因此它们不必再查阅提交日志。
a SELECT ... FOR UPDATE
写行锁
autovacuum 删除死行版本
这些是 DELETE
或 UPDATE
的剩菜。
autovacuum 冻结旧的可见行版本
如果事务 ID 计数器回绕,这是防止数据损坏所必需的。
唯一能相当可靠地防止 PostgreSQL 将来修改 table 的方法是:
切勿对其执行 INSERT
、UPDATE
或 DELETE
运行 VACUUM (FREEZE)
在 table 上并确保没有并发事务
我们正在使用 pgbackrest 将我们的数据库备份到 Amazon S3。我们每周进行一次完整备份,每隔一天进行一次增量备份。 我们的数据库大小约为 1TB,完整备份约为 600GB,增量备份也约为 400GB!
我们发现,即使是对数据库的读取访问(纯 select 语句)也会影响底层数据文件(在 /usr/local/pgsql/data/base/xxxxxx 中)发生变化。这会导致大量增量备份以及 Amazon S3 上的大量存储(成本)。
通常具有低索引名称的文件(例如 391089.1)在读取访问时发生变化。
在更新时,我们看到一个或多个文件发生变化 - 索引可能与 table 中行的存在时间相关联。
更多事实:
- Postgres 版本 13.1
- 数据库是 运行 在 docker 容器中(docker 版本 20.10.0)
- OS 是美分OS 7
我们在多台服务器上看到了这种现象。
有人可以解释一下,为什么 postgresql 在纯读访问时更改数据文件? 我们在没有任何其他资源访问数据库的情况下在纯数据库上进行了测试。
这是正常的。我马上能想到的一些情况是:
a
SELECT
或其他 SQL 语句设置 提示位这是访问数据的后续语句的快捷方式,因此它们不必再查阅提交日志。
a
SELECT ... FOR UPDATE
写行锁autovacuum 删除死行版本
这些是
DELETE
或UPDATE
的剩菜。autovacuum 冻结旧的可见行版本
如果事务 ID 计数器回绕,这是防止数据损坏所必需的。
唯一能相当可靠地防止 PostgreSQL 将来修改 table 的方法是:
切勿对其执行
INSERT
、UPDATE
或DELETE
运行
VACUUM (FREEZE)
在 table 上并确保没有并发事务