
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 --cluster
Option, 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]
.
main
ist nur ein Standardwert. Führen Sie es aus, um Ihre tatsächlichen Namen in der Spalte pg_lsclusters
anzuzeigen .Cluster
Funktionsweise: Wie von den Ubuntu-Paketen installiert, /usr/bin/pg_dump
handelt 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. --cluster
existiert 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/bin
werden 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_dump
in 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.dump
Postgres 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"
--rm
entfernt den Container, wenn der Befehl ausgeführt wird--network=host
verbindet 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.