1

主要问题:
postgresql.conf 文件中的 archive_cleanup_command 不会清除归档的 wal 文件。我怎样才能让它清除存档的 wal 文件?

相关信息:

  • 我的操作系统是 Linux,Ubuntu v18.04 LTS。
  • 数据库是 Postgresql 版本 13

我当前的设置:
/etc/postgresql/13/main/postgresql.conf 文件:

wal_level = replica
wal_compression = on

wal_recycle = on
checkpoint_timeout = 5min

max_wal_size = 1GB
min_wal_size = 80MB

archive_mode = on
archive_command = 'pxz --compress --keep --force -6 --to-stdout --quiet %p > /datadrive/postgresql/13/wal_aerchives/%f.xz'

archive_timeout = 10min

restore_command = 'pxz --decompress --keep --force -6 --to-std-out --quiet /datadrive/postgresql/13/wal_archives/%f.xz > %p'

archive_cleanup_command = 'pg_archivecleanup -d -x .xz /datadrive/postgresql/13/wal_archives %r >> /datadrive/postgresql/13/wal_archives/archive_cleanup_command.log 2>&1'

archive_cleanup_command.log 有 777 权限。

我有一个主数据库与一个发布和一个订阅该发布的从属数据库进行逻辑复制。我打算在奴隶上做归档和恢复点。

我期待发生什么?
postgresql.conf 文件中的检查点超时设置意味着至少每 5 分钟创建一个重启点。并且 10 分钟的 archive_timeout 设置意味着 postgresql 每 10 分钟强制执行一次日志文件段切换。因此,至少每 10 分钟创建一个重启点。每当创建重新启动点时,就会运行归档清理命令。运行此命令时,它将清除所有早于此重新启动点的 .xz 文件。因此 wal_archives 目录不应该真的有 .xz 文件早于 20 分钟甚至 2 小时......

实际发生了什么?

  • /datadrive/postgresql/13/wal_archives目录堆积了许多永远不会被清除的 .xz 文件。

  • cat archive_cleanup_command.log显示一个空文件。什么都没有写给它。

  • 当我通过 bash 手动运行 pg_archivecleanup 命令时,它可以工作(即清除指定文件之前的所有存档文件,并且 cat archive_cleanup_command 显示已清除的文件。
    例如:

     pg_archivecleanup -d -x .xz /datadrive/postgresql/13/wal_archives 000000010000045E000000E5 >> /datadrive/postgresql/13/wal_archives/archive_cleanup_command.log 2>&1
    

    然后运行cat archive_cleanup_command.log给出了这个:

     pg_archivecleanup: keeping WAL file "/datadrive/postgresql/13/wal_archives/000000010000045E000000E5" and later
     pg_archivecleanup: removing file "/datadrive/postgresql/13/wal_archives/000000010000045E000000DE.xz"
     pg_archivecleanup: removing file "/datadrive/postgresql/13/wal_archives/000000010000045E000000DF.xz"
     pg_archivecleanup: removing file "/datadrive/postgresql/13/wal_archives/000000010000045E000000E0.xz"
     pg_archivecleanup: removing file "/datadrive/postgresql/13/wal_archives/000000010000045E000000E1.xz"
     pg_archivecleanup: removing file "/datadrive/postgresql/13/wal_archives/000000010000045E000000E2.xz"
     pg_archivecleanup: removing file "/datadrive/postgresql/13/wal_archives/000000010000045E000000E3.xz"
     pg_archivecleanup: removing file "/datadrive/postgresql/13/wal_archives/000000010000045E000000E4.xz"
    

我尝试了什么?

  • 我尝试了各种权限设置(例如:chmod 777 wal_archive 目录,将其他用户添加到 postgres 组等...)

  • 广泛而彻底地阅读了 postgresql 文档,并查看了至少 20 个不同的相关 stackoverflow 帖子。

  • 最初尝试使用 7zip 命令行工具来进行压缩而不是 pxz。

  • 使用以下命令多次成功重启数据库:

     sudo systemctl stop postgresql@13-main
     sudo systemctl start postgresql@13-main
    
  • 删除逻辑复制并在主服务器上重新创建发布并在从服务器上重新创建订阅。

  • 在主服务器上启用检查点。

  • 看着/var/log/postgresql/postgresql-13-main.log。不幸的是,此日志中没有显示相关错误。

4

1 回答 1

1

重新启动点,restore_commandarchive_cleanup_command适用于流式(“物理”)复制或一般恢复,不适用于逻辑复制。

逻辑复制备用不是在恢复中,它对读写是开放的。在该状态下,archive_cleanup_command将忽略恢复设置。

您将不得不找到另一种机制来删除旧的 WAL 存档,最好与您的备份解决方案结合使用。

于 2020-11-17T06:42:14.217 回答