【问题标题】:Postgres archiving is not functioning as intended, anyone have any suggestions?Postgres 归档没有按预期运行,有人有什么建议吗?
【发布时间】:2019-12-31 02:57:24
【问题描述】:

我在两台主/从服务器之间进行了流式传输设置,并且工作正常。存档部分工作了一半。它只是不断创建存档,不会删除旧存档。任何人都可以提出解决方案吗?

我已经尝试了全新的基本备份并重新启动流媒体等。但我在日志中不断收到以下错误:

2019-08-27 07:13:14 +08  DETAIL:  The failed archive command was: test ! -f /var/lib/pgsql/data/pg_xlog/000000010000028000000068 && cp pg_xlog/000000010000028000000068 /var/lib/pgsql/data/pg_xlog/000000010000028000000068
2019-08-27 07:13:15 +08  LOG:  archive command failed with exit code 1
2019-08-27 07:13:15 +08  DETAIL:  The failed archive command was: test ! -f /var/lib/pgsql/data/pg_xlog/000000010000028000000068 && cp pg_xlog/000000010000028000000068 /var/lib/pgsql/data/pg_xlog/000000010000028000000068
2019-08-27 07:13:15 +08  WARNING:  transaction log file "000000010000028000000068" could not be archived: too many failures

我已经检查过了,文件在那里:

-rw------- 1 postgres postgres 16777216 Aug 27 06:44 000000010000028000000068

存档状态:

-rw------- 1 postgres postgres 0 Aug 27 06:44 000000010000028000000068.ready

Postgres 版本是 9.2.23。不幸的是,升级不是一种选择。

这是 Master 中配置的存档部分:

# - Archiving -

archive_mode = on       # allows archiving to be done
                                # (change requires restart)
#archive_command = '/bin/true'          # Used for trouble shooting archiving to temporarily start postgres.
archive_command = 'test ! -f /var/lib/pgsql/data/pg_xlog/%f && cp %p /var/lib/pgsql/data/pg_xlog/%f'            # command to use to archive a logfile segment
                                # placeholders: %p = path of file to archive
                                #               %f = file name only
                                # e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
#archive_timeout = 0            # force a logfile segment switch after this
                                # number of seconds; 0 disables

这是从机上recovery.conf 的一部分:

restore_command = 'cp -p /var/lib/pgsql/data/pg_xlog/%f %p'
trigger_file = '/var/lib/pgsql/i_am_master.pg.trigger'
recovery_target_timeline = 'latest'
archive_cleanup_command = 'pg_archivecleanup /var/lib/pgsql/data/pg_xlog %r'

我还有什么需要检查的吗?

【问题讨论】:

    标签: postgresql database-replication transaction-log


    【解决方案1】:

    由于您没有收到来自 cp 的错误消息,因此失败的 archive_command 部分可能是

    test ! -f /var/lib/pgsql/data/pg_xlog/%f
    

    这意味着存档中已经有一个同名的文件。

    调查文件是如何到达那里的,如果安全则将其删除,然后 WAL 归档将恢复工作。

    测试是为了避免意外覆盖其他人存档的 WAL 文件。


    您的存档目录的名称听起来像是您试图直接存档到另一个集群的pg_xlog 目录。那不行。你需要一个共享目录——一个集群存档到它,另一个从它恢复。

    【讨论】:

    • 好的,所以根据您的评论,我推断归档是在与流式传输 (pg_xlog) 相同的文件夹中完成的。将归档命令更改为另一个目录:archive_command = 'test ! -f /var/lib/pgsql/archive/%f && cp %p /var/lib/pgsql/archive/%f' 一切正常! tks!
    • 我刚刚写了关于错误信息的含义。也许您的设置存在更根本的问题 - 请参阅扩展答案。
    • 正确。它试图写入它自己的 pg_xlog。因此,为什么当它试图将文件存档到“pg_xlog”时,该文件确实已经存在,然后生成错误。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多