pg_upgrade nicht erkannter Konfigurationsparameter "unix_socket_directory"

13

Ich versuche, Postgresql von 9.2 auf 9.3 in Fedora 18 zu aktualisieren, indem ich diesen Befehl als postgres-Benutzer verwende

$ 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

Der Fehler im Protokoll

Befehl: "/ 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 Warten auf den Start des Servers .... FATAL: Unbekannter Konfigurationsparameter" unix_socket_directory ".... Warten gestoppt pg_ctl: Konnte nicht starten Server

Wie durch a_horse in den Kommentaren gezeigt, wurde dieser Parameter unix_socket_directoriesin 9.3 durch (plural) ersetzt. Die gestartete Serverversion ist jedoch die alte Version 9.2:

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

Irgendwelche Ideen?

Clodoaldo
quelle
2
Dieser Parameter wurde umbenannt in unix_socket_directories: postgresql.org/docs/current/static/release-9-3.html#AEN114343
a_horse_with_no_name
@a_horse Dieser Befehl versucht, Version 9.2 zu starten. Überprüfen Sie die aktualisierte Frage
Clodoaldo
Um explizit zu sehen , welche Parameter in Ihrer Distribution verwendet werden, können Sie laufenpostgres --describe-config | grep -o 'unix_socket_director\w*'
Randall

Antworten:

25

Ich habe das Problem gehackt, indem ich (als root) ausgeführt habe:

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

Führen Sie pg_upgradedas Programm wie vorgesehen aus und machen Sie den Hack rückgängig:

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

Das Problem ist, dass pg_upgrade das Programm pg_ctrl mit Argumenten ausführt, die Dateien im alten "unix_socket_directory" und nicht im neuen "unix_socket_directories" angeben (beachten Sie, dass das zweite im Plural steht). Dieser Hack benennt das Original /usr/bin/pg_ctlin um /usr/bin/pg_ctl-origund erstellt an seiner Stelle ein Shell-Skript, das einfach das ursprüngliche Programm pg_ctl aufruft und alle Argumente mit den Zeichenfolgen "unix_socket_directory" übergibt, die in "unix_socket_directories" geändert wurden.

In der bash man einen Teil einer Zeichenkette ändern kann, etwa von barzu bazin einer Variablen $foo, unter Verwendung von ${foo/bar/baz}( man beachte dies die Variable ändert sich nicht, sondern gibt den modifizierten Inhalt der Variable). Arrays können auch verwendet werden ${x/y/z}, um ein Array abzurufen, dessen gesamter Inhalt auf einmal ersetzt wurde. Die Variable $@ist ein Array, das alle an das Programm / Skript / die Funktion übergebenen Argumente enthält. Das neue Skript pg_ctl führt das alte aus, wobei alle Argumente vom alten in das neue Verzeichnis geändert werden.

Ziggy Crueltyfree Zeitgeister
quelle
3
dies erlaubte mir wirklich, postgres 9.2 auf Centos 7 auf 9.6 zu aktualisieren! Vielen Dank!
sunsetjunks
2
Arbeitete großartig für mich von 9.2 bis 9.6. Vielen Dank! Keine Ahnung, was ich ohne diese Antwort getan hätte!
15.
Arbeitete auch für mich, von 9,2 auf 9,6 auf Centos 7
Gabriel Theron
1
Vielleicht könnte die Erklärung des Tricks des Bash-Hack anderen helfen, ähnliche Probleme in Zukunft zu bewältigen. Dies ist eine ernsthafte Bash-
Drehung
Ausgezeichnete und elegante Lösung, die einwandfrei funktioniert hat, um von PostgreSQL 9.2 auf 10.7 unter CentOS 7 zu
wechseln
5

Ich habe das gleiche Problem. Ich habe ein Upgrade von Fedora Repo 9.2.4 auf PGDG 9.3 durchgeführt. Die Ursache des Problems liegt darin, dass Fedora Änderungen von Parametern unix_socket_directoryin unix_socket_directories(siehe https://bugzilla.redhat.com/show_bug.cgi?id=853353 ) zurückportiert .

Meine Lösung besteht darin, den pg_upgradeQuellcode mit dem Update auf eine Datei neu zu erstellen, contrib/pg_upgrade/server.c:199in der pg_upgradenach der Serverversion gesucht wird:

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

in meinem Fall ändere ich es auf:

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

(siehe meine Patch-Datei hier ).

Ali Akbar
quelle
Könnten Sie bitte erklären, warum dies das Problem behebt (für mich selbst, die mit den Quellen nicht allzu vertraut sind (Vorsicht vor der Untertreibung!))?
29.
4
Wie pro @a_horse Kommentar oben hat Upstream PostgreSQL die Parameter geändert unix_socket_directoryzu unix_socket_directoriesin der Version 9.3. Der Fedora-Betreuer exportiert es jedoch in eine niedrigere Version. Also, pg_upgradevon PGDG (PostgreSQL Global Development Group) erwartet YUM Repository, dass die Version 9.2.4 akzeptiert unix_socket_directory, aber tatsächlich die Version 9.2.4 von Fedora YUM Repository akzeptiert unix_socket_directories. In diesem Fall habe ich es geändert, um es unix_socket_directoriesfür Version> = 9.0 zu verwenden, da Fedora es ab Version 9.0 zurückportiert.
Ali Akbar