PostgreSQL参数archive_timeout

PostgreSQL 开启归档功能后只有当一个 WAL 文件被写满才会触发 archive_command 命令被调用,进行归档。如果数据库的写入负载很低,很长时间才能写满一个 WAL 文件,那么就会导致这个 WAL 文件要等待很久才能被归档。

archive_timeout 参数设置后,能够在一定周期内强制切换 WAL 文件,即强制生成一个新的 WAL 文件,以便让上一个 WAL 文件能够被归档,虽然上一个 WAL 文件可能没有被写满,但是它能够保证已写入的数据能够及时被归档。未写满的 WAL 文件其占用的空间与一个写满的 WAL 文件一致,所以它存在浪费空间的问题。因此,如果 archive_timeout 参数设置过小,并且数据库写入负载低时,将会严重浪费存储空间。

如果数据库没有任何写入,即 WAL LSN 没有变化,那么超过 archive_timeout 时间间隔也不会生成新的 WAL 文件。

archive_timeout 参数可选值:

  • 默认值:0,即关闭归档超时功能
  • 最大值:INT_MAX / 2
  • 默认单位:秒

举个例子,以下参数设置下,即使数据库写入负载很低,也会 60 秒生成一个新的 WAL 文件,并对老的 WAL 文件进行归档。

archive_mode='on'
archive_command='/bin/true'
archive_timeout='60'

在内核实现上,archive_timeout 参数所涉及的功能是在 checkpoint 进程中实现的,checkpoint 每隔 300 秒触发一次 checkpoint(参数 checkpoint_timeout),在 checkpoint 进程的主函数循环中检查是否需要切换到新的 WAL 文件。

文章评论

0条评论