pg_upgrade parâmetro de configuração não reconhecido “unix_socket_directory”

13

Estou tentando atualizar o Postgresql de 9.2 para 9.3 no Fedora 18 usando este comando como usuário do postgres

$ pg_upgrade -b /bin -B /usr/pgsql-9.3/bin -d /var/lib/pgsql/data -D /var/lib/pgsql/9.3/data/ -j 2 -u postgres

O erro no log

comando: "/ bin / pg_ctl" -w -l "pg_upgrade_server.log" -D "/ var / lib / pgsql / data" -o "-p 50432 -b -c listen_addresses = '' -c unix_socket_permissions = 0700 -c unix_socket_directory = '/ var / lib / pgsql' "start >>" pg_upgrade_server.log "2> & 1 aguardando o servidor iniciar .... FATAL: parâmetro de configuração não reconhecido" unix_socket_directory ".... parou de aguardar pg_ctl: não pôde ser iniciado servidor

Conforme apontado por a_horse nos comentários, esse parâmetro foi substituído por unix_socket_directories(plural) em 9.3. Mas a versão do servidor iniciada é a antiga 9.2:

$ /bin/pg_ctl --version
pg_ctl (PostgreSQL) 9.2.4

Alguma ideia?

Clodoaldo
fonte
2
Esse parâmetro foi renomeado para unix_socket_directories: postgresql.org/docs/current/static/release-9-3.html#AEN114343
a_horse_with_no_name
@a_horse Esse comando tenta iniciar a versão 9.2. Verifique a pergunta atualizada
Clodoaldo
Para ver explicitamente qual parâmetro está sendo usado em sua distribuição, você pode executarpostgres --describe-config | grep -o 'unix_socket_director\w*'
Randall

Respostas:

25

Eu hackeei o problema executando (como root):

mv /usr/bin/pg_ctl{,-orig}
echo '#!/bin/bash' > /usr/bin/pg_ctl
echo '"$0"-orig "${@/unix_socket_directory/unix_socket_directories}"' >> 
     /usr/bin/pg_ctl
chmod +x /usr/bin/pg_ctl

Execute pg_upgradecomo pretendido e, em seguida, desfaça o hack:

mv -f /usr/bin/pg_ctl{-orig,}

O problema é que pg_upgrade executa o programa pg_ctrl com argumentos que especificam arquivos no antigo "diretório_do_Socket_Socket" em vez dos novos "diretórios_do_Socket_do_Socket" (observe que o segundo é plural). Esse truque renomeia o original /usr/bin/pg_ctlpara /usr/bin/pg_ctl-orige cria um script de shell em seu lugar que simplesmente chama o programa pg_ctl original, transmitindo todos os argumentos com as cadeias "unix_socket_directory" alteradas para "unix_socket_directories".

No bash, é possível alterar uma parte de uma string, digamos de barpara bazem uma variável $foo, usando ${foo/bar/baz}(observe que isso não altera a variável, mas retorna o conteúdo modificado da variável). As matrizes também podem ser usadas ${x/y/z}para recuperar uma matriz com todo o seu conteúdo substituído, tudo de uma vez. A variável $@é uma matriz que contém todos os argumentos passados ​​para o programa / script / função; portanto, o novo script pg_ctl executa o antigo, com todos os argumentos alterados do nome do diretório antigo para o novo.

Ziggy Crueltyfree Zeitgeister
fonte
3
isso realmente me permitiu atualizar o postgres 9.2 para 9.6 no Centos 7! Obrigado!
sunsetjunks
2
Funcionou muito bem para mim, passando de 9,2 para 9,6. Muito obrigado! Não faço ideia do que eu teria feito sem essa resposta!
SebK 15/05
Trabalhou para mim também, indo 9,2-9,6 no CentOS 7
Gabriel Theron
1
Talvez a explicação dos truques do hack do bash possa ajudar outras pessoas a lidar com problemas semelhantes no futuro. Esta é uma torção festa séria :-)
xor007
Solução excelente e elegante, funcionou perfeitamente para passar do PostgreSQL 9.2 para 10.7 no CentOS 7 #
wfgeo 15/02/19
5

Eu tenho o mesmo problema. Eu estava atualizando do 9.2.4 do Fedora Repo para o PGDG 9.3. A origem do problema é que o Fedora suporta mudanças de parâmetro unix_socket_directorypara unix_socket_directories(veja https://bugzilla.redhat.com/show_bug.cgi?id=853353 ).

Minha solução é reconstruir as pg_upgradefontes, com atualização para o arquivo contrib/pg_upgrade/server.c:199onde pg_upgradeverifica a versão do servidor:

199:       (GET_MAJOR_VERSION(cluster->major_version) < 903) ?

, no meu caso, eu altero para:

199:       (GET_MAJOR_VERSION(cluster->major_version) < 900) ?

(veja meu arquivo de correção aqui ).

Ali Akbar
fonte
Você poderia, por favor, explicar por que isso corrige o problema (para pessoas como eu, que não estão muito familiarizadas com as fontes (cuidado com o eufemismo!))?
Dez29
4
Conforme o comentário de @a_horse acima, o PostgreSQL upstream mudou o parâmetro unix_socket_directorypara unix_socket_directoriesna versão 9.3. Mas o mantenedor do Fedora o suporta para a versão inferior. Portanto, pg_upgradedo repositório YUM do PGDG (Grupo de Desenvolvimento Global do PostgreSQL) espera que a versão 9.2.4 aceite unix_socket_directory, mas na verdade o 9.2.4 do Repositório YUM do Fedora aceita unix_socket_directories. Nesse caso, como o Fedora o reporta para a versão 9.0 em diante, eu mudei para usar unix_socket_directoriesna versão> = 9.0.
Ali Akbar