Ausführen einer bestimmten Version (8.4, 9.1) des Befehls postgresql pg_ * (z. B. pg_dump)

11

Ich habe Postgresql Versionen 8.4 und 9.1 installiert. Wie gebe ich für einen bestimmten Postgresql-Befehl eine bestimmte Version des auszuführenden Befehls an? (zB psql, pg_dump, pg_ctlcluster, pg_restore, ...)

Meine Frage ist motiviert, weil ich einen pg_dump ausführen möchte, um ein Upgrade von 8.4 auf 9.1 vorzubereiten, und ich möchte wissen, welche pg_dump-Version ich verwende.

Ich laufe auf Ubuntu 10.04 Natty.

Rob Bednark
quelle

Antworten:

15

Sie sind auf Ubuntu und haben offensichtlich Martin Pitts pg_wrapperinstalliert (gemessen an pg_ctlcluster), der vom Paket bereitgestellt wird postgresql-commonund mit den Standard-Debian-Paketen geliefert wird . Ich benutze das gleiche auf Debian .

Führen Sie auf einem Linux-System whichdie Shell aus, um festzustellen, welche ausführbare Datei tatsächlich ausgewählt wird:

postgres@db:~$ which pg_dump
/usr/bin/pg_dump
postgres@db:~$ ls -l /usr/bin/pg_dump
lrwxrwxrwx 1 root root 37  4. Jun 18:57 /usr/bin/pg_dump -> ../share/postgresql-common/pg_wrapper

pg_dumpist eigentlich ein Symlink zu pg_wrapper, der dynamisch die entsprechende Version des Client-Programms für den Datenbankcluster auswählt, mit dem Sie ausgeführt pg_dumpwerden. Ich zitiere die Manpage von pg_wrapper:

Dieses Programm wird nur als Link zu Namen ausgeführt, die PostgreSQL-Programmen in / usr / lib / postgresql / version / bin entsprechen. Es bestimmt den konfigurierten Cluster und die konfigurierte Datenbank für den Benutzer und ruft die entsprechende Version des gewünschten Programms auf, um eine Verbindung zu diesem Cluster und dieser Datenbank herzustellen, und stellt diesem Befehl alle angegebenen Optionen zur Verfügung.

   The target cluster is selected by the following means, in descending order of precedence:
   1.  explicit specification with the --cluster option
   2.  explicit specification with the PGCLUSTER environment variable
   3.  matching entry in ~/.postgresqlrc (see postgresqlrc(5)), if that file exists
   4.  matching entry in /etc/postgresql-common/user_clusters (see user_clusters(5)), if that file exists
   5.  If only one local cluster exists, that one will be selected.
   6.  If several local clusters exist, the one listening on the default port 5432 will be selected.

   If none of these rules match, pg_wrapper aborts with an error.

IOW, die richtige Version sollte automatisch ausgewählt werden - es sei denn, Sie haben Ihre Installation irgendwie vermasselt. Sie können die Option --clusterjederzeit spezifisch hinzufügen .

Erwin Brandstetter
quelle
1
Nur ein Hinweis: Dies hilft nicht bei Remoteverbindungen. Ich habe 8.3 und 9.1 Client-Tools installiert und es ist aus irgendeinem Grund standardmäßig 8.3. Ich muss den Pfad in / usr / lib manuell auswählen, um die richtige Version zu verwenden. Ich hätte gedacht, dass die neueste standardmäßig verwendet wird, scheint aber nicht.
Sami Kuhmonen
Sie benötigen nicht die neueste, sondern die zu Ihrer Datenbank passende. Für einige Zwecke ist die neue Version von pg_dump jedoch möglicherweise die bessere Option.
Erwin Brandstetter
Können Sie bitte klarstellen, was genau in der Datei ~ / .postgreslqrc enthalten sein muss? Meine Client-Ausgabe -> psql (8.4.21, Server 9.1.13) WARNUNG: psql Version 8.4, Server Version 9.1. Einige psql-Funktionen funktionieren möglicherweise nicht.
Croydon Dias
Das scheint bei mir nicht zu funktionieren. Ich habe einen Dump auf einem Server mit 9.1 erstellt. Als ich versuchte, auf einem anderen Server mit 9.1 und 8.4 wiederherzustellen, wurde mir mitgeteilt, dass das Dateiformat nicht erkannt werden kann. Es gibt auch keine --clusterBefehlszeilenoption.
Alexis Wilke
3

ich benutze

PGCLUSTER=8.4/main pg_dump ...
PGCLUSTER=9.1/main pg_dump ...
Gavriel
quelle