当使用gzip时,WAL Archive会在postgres中挂起

时间:2015-08-20 08:50:24

标签: database postgresql

我已使用以下存档命令启用了WAL存档:

wal_keep_segments = 32
archive_mode = on
archive_command = 'gzip < %p > /mnt/nfs/archive/%f'

并且在Slave上我将恢复命令作为:

restore_command = 'gunzip < /mnt/nfs/archive/%f > %p'
archive_cleanup_command = '/opt/PostgreSQL/9.4/bin/pg_archivecleanup -d /mnt/nfs/archive %r'

在Master上我可以看到许多文件被卡住了。大约327个文件尚未归档。理想情况下,它应该只有32。

px命令显示:

-bash-4.1$ ps x
  PID TTY      STAT   TIME COMMAND
 3302 ?        S      0:00 /opt/PostgreSQL/9.4/bin/postgres -D /opt/PostgreSQL/9.4/data
 3304 ?        Ss     0:00 postgres: logger process
 3306 ?        Ss     0:09 postgres: checkpointer process
 3307 ?        Ss     0:00 postgres: writer process
 3308 ?        Ss     0:06 postgres: wal writer process
 3309 ?        Ss     0:00 postgres: autovacuum launcher process
 3311 ?        Ss     0:00 postgres: stats collector process
 3582 ?        S      0:00 sshd: postgres@pts/1
 3583 pts/1    Ss     0:00 -bash
 3628 ?        Ss     0:00 postgres: archiver process   archiving 000000010000002D000000CB
 3673 ?        S      0:00 sh -c gzip < pg_xlog/000000010000002D000000CB > /mnt/nfs/archive/000000010000002D000000CB
 3674 ?        D      0:00 gzip
 3682 ?        S      0:00 sshd: postgres@pts/0
 3683 pts/0    Ss     0:00 -bash
 4070 ?        Ss     0:00 postgres: postgres postgres ::1(34561) idle
 4074 ?        Ss     0:00 postgres: postgres sorriso ::1(34562) idle
 4172 pts/0    S+     0:00 vi postgresql.conf
 4192 pts/1    R+     0:00 ps x
-bash-4.1$ ls | wc -l
327
-bash-4.1$

1 个答案:

答案 0 :(得分:0)

没有标记的

gzipgunzip期望使用文件,就地压缩或解压缩它们。您正在尝试将它们用作流处理器。那不行。

您想使用gzip -czcat(或gunzip -c)告诉他们使用stdio。

此外,您应该使用一个简单的脚本作为archive_command

  • 使用gzip -c写入临时文件
  • 使用mv
  • 将临时文件移至最终位置

这确保副本不会读取文件,直到主文件完全写入该文件。

此外,除非主服务器和副本服务器共享相同的网络文件系统(或者两者都在同一主机上),否则实际上可能需要使用scp或类似工具来传输存档文件。 restore_command使用副本上的路径,而不是主服务器上的路径,因此除非副本服务器可以通过NFS / CIFS / etc访问WAL存档,否则您将需要复制文件。