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?


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.


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 ).


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.