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?
postgresql
upgrade
Clodoaldo
fonte
fonte
unix_socket_directories
: postgresql.org/docs/current/static/release-9-3.html#AEN114343postgres --describe-config | grep -o 'unix_socket_director\w*'
Respostas:
Eu hackeei o problema executando (como root):
Execute
pg_upgrade
como pretendido e, em seguida, desfaça o hack: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_ctl
para/usr/bin/pg_ctl-orig
e 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
bar
parabaz
em 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.fonte
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_directory
paraunix_socket_directories
(veja https://bugzilla.redhat.com/show_bug.cgi?id=853353 ).Minha solução é reconstruir as
pg_upgrade
fontes, com atualização para o arquivocontrib/pg_upgrade/server.c:199
ondepg_upgrade
verifica a versão do servidor:, no meu caso, eu altero para:
(veja meu arquivo de correção aqui ).
fonte
unix_socket_directory
paraunix_socket_directories
na versão 9.3. Mas o mantenedor do Fedora o suporta para a versão inferior. Portanto,pg_upgrade
do repositório YUM do PGDG (Grupo de Desenvolvimento Global do PostgreSQL) espera que a versão 9.2.4 aceiteunix_socket_directory
, mas na verdade o 9.2.4 do Repositório YUM do Fedora aceitaunix_socket_directories
. Nesse caso, como o Fedora o reporta para a versão 9.0 em diante, eu mudei para usarunix_socket_directories
na versão> = 9.0.