Arquivamento contínuo do PostgreSQL não executando archive_command

3

Eu tenho tentado configurar o arquivamento contínuo para um banco de dados PostgreSQL 9.0 simples e de teste, conforme a documentação . No postgres.conf eu configurei:

wal_level = archive
archive_mode = on
archive_command = 'touch /home/myusername/backup/testtouch'
archive_timeout = 30s

... e reiniciou o PostgreSQL. O arquivo listado por toque nunca aparece. Posso executar manualmente o comando touch e ele funciona como esperado.
Se eu tentar criar um backup, ele esperará para sempre o archive_command. No psql;

postgres=# SELECT pg_start_backup('touchtest');
pg_start_backup
-----------------
0/14000020 (1 row)

postgres=# SELECT pg_stop_backup();
NOTICE: pg_stop_backup cleanup done, waiting for required WAL segments to be archived > WARNING: pg_stop_backup still waiting for all required WAL segments to be archived (60 seconds elapsed)
HINT: Check that your archive_command is executing properly. pg_stop_backup can be cancelled safely, but the database backup will not be usable without all the WAL segments.

O que causaria isso? Como posso resolver isso?

Informações adicionais: Executando no CentOS 5.4. PostgreSQL 9.0.2 instalado como root.

Atualização: primeiro tentei arquivar com cp -i %p /home/myusername/backup/%f </dev/null e test ! -f /home/myusername/backup/%f && cp %p /home/myusername/backup/%f para corresponder ao manual. Reduzi para a chamada de toque mais simples para solução de problemas.

    
por Whatsit 12.01.2011 / 23:50

2 respostas

5

Essa configuração do Postgres parece correta

Por padrão, o CentOS define o modo de diretório do usuário como 700, portanto, verifique se esse é realmente o caso e se você pode tocar nesse arquivo usando su como o usuário root

su - postgres -c "touch /home/myusername/backup/testtouch"

Se isso funcionar, tente usar a criação de log detalhado no postgres e verifique se há mais erros no log do postgres.

    
por 13.01.2011 / 00:30
0

Seu comando de arquivamento precisa conter mais informações.

De o documento do PostgreSQL

Em archive_command,% p é substituído pelo nome do caminho do arquivo a ser arquivado, enquanto% f é substituído apenas pelo nome do arquivo. (O nome do caminho é relativo ao diretório de trabalho atual, ou seja, o diretório de dados do cluster.)

archive_command = 'copy "% p" "C: \ servidor \ archivedir \% f"' # Windows

Em resumo, não me parece (não estou familiarizado com o comando touch do CentOS) como se você estivesse incluindo variáveis em seu script de comando de arquivo. Tenha em mente que o nome do arquivo de log que será arquivado está sempre mudando. O comando archive também precisa saber para onde você está arquivando o arquivo.

    
por 13.01.2011 / 00:58