我正在准备一个基于官方形象的Postgres码头形象。我有一个应用程序,它用初始数据填充数据库(对于大约300 of的数据,这大约需要一个小时)。我希望从Postgres数据库中生成一个图像,以便数据已经初始化。这很好,但是由于WAL的性质,PG_DATA目录比必需的要大。对于码头的图像分布,缩小PG_DATA是非常重要的。如果我稍后考虑再添加几个数据层,这些数据都会添加自己的一组WAL文件,而这些文件并不是绝对必要的。
我有什么选择来最小化PG_DATA?我的主要问题是最小化WAL,最后我将讨论最小化PG_DATA的其他领域。
什么时候我才能安全地删除WAL?
要明确的是,这是一个被丢弃的容器,里面装满了一些初始数据。这并不是为了成为一个高效的系统。archive_mode = off,wal_level = minimal,没有复制。
我试图通过以下配置来保持WAL的小:
wal_keep_size = 0
wal_recycle = off
min_wal_size = 32MB
max_wal_senders = 0 # necessary due to wal_level = minimal但是,即使在发出CHECKPOINT;之后,pg_wal目录仍然大到200 is。为什么Postgres不删除这些文件?根据设置,我假设只保留32 be。在CHECKPOINT;和停止服务器之后,从pg_wal中删除所有文件安全吗?
从其他问题和答案中我可以看出,Postgres应该自动删除WAL文件。有些问题我已经知道了,但不要谈论我的具体问题和用例:
这些问题主要涉及归档、备份、复制、PITR。但这不适用于我的用例。
我的想法是,在执行CHECKPOINT;并清除WAL之后,我还可以执行一个VACUUM FULL;来向文件系统释放任何空间。这看起来像预期的那样工作,我看到base目录越来越小了。当然,我希望这在删除/更新数据之后会产生最大的效果,而不是在初始化时大多数情况下插入行之后。
还有更多的选项来最小化PG_DATA吗?
发布于 2022-02-08 20:23:16
填充数据库后,干净地关闭它(重要!)然后跑
pg_resetwal -D /path/to/data/directory会截断你的沃尔。永远不要手动删除WAL文件。
发布于 2022-02-08 21:51:28
在检查点的末尾,Check指针查看最近使用了多少WAL,并回收过时的WAL文件(通过将它们重命名为“来自未来”的名称),以供重用。它删除超出它想要回收的数量的任何额外的过时的WAL文件。问题是,在批量装载期间,WAL编写得非常快,因此许多文件被回收。但是,当大容量加载突然完成,WAL不再得到快速编写时,这些可回收的文件仍然存在。下一个检查点,当事情变得更安静时,看到它不再需要那么多回收的WAL文件,但是它不愿意删除现有的预先回收的文件,它只是拒绝通过删除现在已经过时的(过去的)文件来回收更多的资源。但是,既然情况很好,就会有很少的,如果有的话。
最终,提前回收文件的过度供应将被耗尽和删除,但如果服务器现在非常安静,则需要很长时间才能使用完这些文件。
正如Laurenz所说,您可以使用pg_resetwal为您删除额外的文件(过去和将来)。你可以手动删除它们,但如果你搞砸了,你的数据可能是烤面包。您还可以在批量加载时关闭wal_recycle。这意味着每个WAL文件都将在需要时创建,因此没有一个文件会被回收。这将减慢(或可能加快)批量装载的数量,这取决于您的操作系统和FS。
https://dba.stackexchange.com/questions/307161
复制相似问题