Wie löse ich eine „Serverversions-Nichtübereinstimmung“ mit pg_dump, wenn ich BEIDE PostgreSQL-Server installiert haben muss?

Wie löse ich eine „Serverversions-Nichtübereinstimmung“ mit pg_dump, wenn ich BEIDE PostgreSQL-Server installiert haben muss?

Ich habe zwei PostgreSQL-Server auf meinem Computer installiert. Einer ist 9.1 und der andere ist 9.3. Ich muss beide Server installieren.

Wenn ich pg_dump ausführe, erhalte ich jedoch einen Versionskonfliktfehler:

server version: 9.3.6; pg_dump version: 9.1.15
pg_dump: aborting because of server version mismatch

Wie kann ich das Problem lösen? (Kann keine der Versionen deinstallieren - ich habe zuerst die Version 9.1 und dann viele Monate später die Version 9.3 installiert - ich brauchebeideDatenbankserver installiert).

Antwort1

Kurz zusammengefasst: Wenn beide PostgreSQL-Instanzen von den Ubuntu-Paketen verwaltet werden (wie es sein sollte), verwenden Sie einfach die --clusterOption, um die zu sichernde PostgreSQL-Instanz auszuwählen, und es wird automatisch die entsprechende Version von pg_dump ausgewählt:

pg_dump --cluster 9.1/main [other pg_dump options]

oder

pg_dump --cluster 9.3/main [other pg_dump options].

mainist nur ein Standardwert. Führen Sie es aus, um Ihre tatsächlichen Namen in der Spalte pg_lsclustersanzuzeigen .Cluster

Funktionsweise: Wie von den Ubuntu-Paketen installiert, /usr/bin/pg_dumphandelt es sich eigentlich um einen Softlink zu /usr/share/postgresql-common/pg_wrapper, dessen Zweck genau darin besteht, die richtige Instanz auszuwählen und die entsprechende Binärdatei auszuführen. --clusterexistiert nicht in den Standardbefehlen von PostgreSQL, es handelt sich um eine Debian-/Ubuntu-Ergänzung, die dieses Problem mit mehreren Versionen/mehreren Pfaden lösen soll.

Dies gilt auch für psql, createdb, createuser, usw. Ungefähr 18 Postgres-Befehle in /usr/binwerden tatsächlich von verwaltet pg_wrapper.

Sehenman pg_wrapperfür mehr.

Antwort2

Sie können verwenden:

sudo find / -name pg_dump

um Ihre Versionen zu finden, pg_dumpin meinem Fall:/usr/pgsql-9.6/bin/pg_dump

also können wir als nächstes tun:

sudo ln -sfn /usr/pgsql-9.6/bin/pg_dump /usr/bin/pg_dump

um auf die zu aktualisieren, die wir brauchen

Antwort3

Wenn Sie Docker verwenden, können Sie jede Version von pg_dump ausführen, ohne mehrere Installationen verwalten zu müssen. Dies schreibt eine Datei in /path/to/dump/to/myfilename.dumpPostgres 12.5:

docker run --rm --network=host -v "/path/to/dump/to:/tmp/dump" \
  postgres:12.5 pg_dump -Fc -v --dbname="my_db_bame" -f "/tmp/dump/myfilename.dump"
  • --rmentfernt den Container, wenn der Befehl ausgeführt wird
  • --network=hostverbindet den Container mit dem lokalen Netzwerk des Hosts
  • -v ...mountet Ihr Host-Verzeichnis ( /path/to/dump/to) in ein temporäres Verzeichnis innerhalb des Containers

Sie müssen nur sicherstellen, dass das Verzeichnis, in das Sie mounten ( /tmp/dump), dasselbe Verzeichnis ist, in das pg_dump schreibt.

Dann können Sie 12.5 in die gewünschte Version ändern.

verwandte Informationen