pg_wal 目录中存储的文件数是否有限制?

Is there a limit regarding the number of files that are stored in the pg_wal directory?

提问人:roussidis 提问时间:11/11/2023 更新时间:11/12/2023 访问量:38

问:

我正在尝试查找有关存储在我的 pg_wal 目录中的实际文件数的解释。

我在具有大量更新、插入和删除的大型数据库上使用 postgres v13,因此我希望 pg_wal 目录中有很多文件。

根据我到目前为止的理解,pg_wal 目录上的文件数取决于 和 值。因此,无论哪一个先命中,pg_wal目录都会轮换checkpoint_timeoutmax_wal_size

我在我的环境中遇到了一种奇怪的行为,我经常看到 7 pg_wal段文件。这意味着我经常有 7*16MB = 112MB 的文件。

然后我查看了文件的时间戳,找出最旧和最早的时间戳,下面的示例显示它们的时间戳超过 5 分钟。最早的是 19:54,最新的是 20:05

-rw-------  1 postgres postgres 16777216 Nov 10 20:04 000000010000E76A00000097
-rw-------  1 postgres postgres 16777216 Nov 10 20:05 000000010000E76A00000098
-rw-------  1 postgres postgres 16777216 Nov 10 20:10 000000010000E76A00000099
-rw-------  1 postgres postgres 16777216 Nov 10 19:54 000000010000E76A0000009A
-rw-------  1 postgres postgres 16777216 Nov 10 19:56 000000010000E76A0000009B
-rw-------  1 postgres postgres 16777216 Nov 10 20:02 000000010000E76A0000009C
-rw-------  1 postgres postgres 16777216 Nov 10 20:03 000000010000E76A0000009D
-rw-------  1 postgres postgres 16777216 Nov 10 20:01 000000010000E76A0000009E

试图弄清楚为什么我总是有 7 个pg_wal段文件。 我的 conf 值是

checkpoint_timeout = 5min
max_wal_size = 2GB

我算了一下,在那个特定时间,有 112MB 的数据发生了变化,因为有多个脚本在不同的时刻运行,并且文件的数量从未或多或少地改变过。

我正在研究创建复制品的方法,并坚持这些值,并试图理解更多的东西。

试图确定问题是否仅在一天中的特定时间存在,但事实并非如此。实际上,无论我在哪里检查pg_wal目录,我都会看到 7 个文件。

变化的是最旧文件和最新文件之间的时间。有时可能是 10 分钟,有时可能是 30 分钟或更长时间(但这取决于数据库中正在写入或更改的实际数据)

PostgreSQL 配置 postgresql-13 wal

评论

0赞 Adrian Klaver 11/11/2023
阅读 WAL 配置。特别是:服务器的检查点进程每隔一段时间就会自动执行一次检查点。每 checkpoint_timeout 秒开始一个检查点,或者如果即将超过max_wal_size检查点,则以先到者为准。这导致 因此,在检查点之后,不再需要包含重做记录的 WAL 段,并且可以回收或删除。(完成 WAL 存档时,必须先对 WAL 段进行存档,然后才能回收或删除。
1赞 Laurenz Albe 11/11/2023
看起来这更多地受 .你为什么担心?在 SO 答案中解释 WAL 的整个生命周期并不容易......min_wal_size
0赞 roussidis 11/12/2023
我询问和调查该问题主要是为了确保我的系统有足够的wal_segments用于复制过程,并且不会不同步。我知道我可以出于这个原因使用该变量,但想更多地了解我目前的情况。@AdrianKlaver感谢您的评论。我已经阅读了 WAL 配置文档和那句话,但我仍然不明白为什么总是有 7 个文件。不多也不少wal_keep_size
0赞 Adrian Klaver 11/12/2023
1)因为这是服务器所看到的负载的正确平衡。正如@LaurenzAlbe所说,涉及WAL尺寸。基本上,这是一个循环过程,旧的WAL文件被回收到新的文件中。如果存在稳定的更改状态,则文件也将达到稳定状态。2) 您想看一下 {复制槽](postgresql.org/docs/13/...)。
0赞 roussidis 11/12/2023
我还将研究复制槽。感谢您的帮助!

答:

0赞 Laurenz Albe 11/12/2023 #1

如果您计划构建备用服务器,则不必担心 WAL 段的数量。您所要做的就是配置 PostgreSQL,以便它为备用服务器保留足够的 WAL。有三种方法可以做到这一点:pg_wal

  1. 设置在主服务器上,以便它始终保留一定量的旧 WAL。wal_keep_size

  2. 设置和配置,以便 PostgreSQL 创建 WAL 存档。然后设置为待机状态,以便它可以从存档中恢复。您可以在备用数据库上使用删除不再需要的已存档 WAL 段。archive_mode = onarchive_commandrestore_commandarchive_cleanup_command

  3. 使用复制槽,使主服务器保留适量的 WAL。

我推荐选项 2 或 3。

评论

0赞 roussidis 11/12/2023
谢谢@laurenz-albe的帮助。例如,我什至在那个问题中看到了您的其他回答,这真的很有帮助。我打算使用第一个选项,因为我发现它是要完成的配置较少的选项。我要求更深入地了解这个问题
0赞 Laurenz Albe 11/12/2023
正如我所说,这超出了 Stackoverflow 答案的范围。WAL段管理不能用一两段话来解释。