Seitenanfang

Postgresql pg_upgradecluster: COPY failed for table

Dieser Post wurde aus meiner alten WordPress-Installation importiert. Sollte es Darstellungsprobleme, falsche Links oder fehlende Bilder geben, bitte einfach hier einen Kommentar hinterlassen. Danke.


Eigentlich wollte ich nur mal eben schnell eine neue Domain aufsetzen. Das Ende vom Lied war ein kompletter Serverumzug mit einigen Postgres Upgradeproblemen.Der Umzug war eigentlich überfällig: Von alter Hardware mit Ubuntu 10 auf neue Hardware mit Ubuntu 12. Apache war auch schnell konfiguriert (dank nfs und "cp"), aber PostgreSQL macht da nicht so einfach mit: Die Datendateien der unterschiedlichen Versionen sind inkompatibel. Warum kann ein neuer Server nicht einfach die alten Dateien konvertieren wenn er sie findet? Ich verstehe es nicht.

Glücklicherweise gibt es das pg_upgradecluster - Utility, dummerweise kann es allerdings nicht von einem auf den anderen Server upgraden und PostgreSQL 8.3 wollte auf dem Ubuntu 12 Server nicht laufen, also blieb mir nur ein Doppelupgrade: 8.3 auf 8.4 auf dem alten, rüberkopieren und dann 8.4 zu 9.1 auf dem neuen (wenigstens kann ich hoffentlich 9.0 überspringen).

Leider hat pg_upgradecluster einen kleinen Bug, denn bei Tabellen mit Fremdschlüsseln kommt die Meldung...

pg_restore: [Archivierer (DB)] COPY failed for table "tabellenname": FEHLER:  Einfügen oder Aktualisieren in Tabelle »tabellenname« verletzt Fremdschlüssel-Constraint »fremdschlüsselname«
Nach einiger Sucherei habe ich die Lösung gefunden: pg_upgradecluster ist ein einfaches Perl-Script. Der Bug kann ganz leicht in Zeile 422 beseitigt werden:
421-        my @restore_argv = ($pg_restore, '-h', $newsocket, '-p',422:	    $newinfo{'port'}, '--data-only', '--disable-triggers', '-d', $db);
Wird der fett markierte Teil eingesetzt, verarbeitet das Script problemlos auch Fremdschlüssel. Das Upgrade ist ganz einfach. Zunächst wird mit
sudo pg_stopcluster --stop 8.4 main
der bei der Installation erstellte leere Standard-Cluster entfernt (vorher drauf achten dass er wirklich leer ist!), dann mit
sudo pg_upgradecluster 8.3 main
das Upgrade durchgeführt.

Hat man bereits einen Upgradeversuch (mit der COPY failed for table - Fehlermeldung) hinter sich, muss man zunächst den 8.4er Server stoppen und dann in /etc/postgresql/8.4/main/start.conf das "manual" in "auto" ändern. Jetzt kann der 8.3er und dann ein neuer Upgradeversuch gestartet werden.

Danach habe ich /usr/lib/postgresql/8.4, /usr/lib/postgresql/8.4 und /etc/postgresql/8.4 vom alten auf den neuen Server kopiert und mit

sudo chown -R postgres.postgres /var/lib/postgresql/8.4/ /usr/lib/postgresql/8.4/
die Benutzerrechte wiederhergestellt, aber...
$ sudo /etc/init.d/postgresql start * Starting PostgreSQL 8.4 database server * Removed stale pid file.Error: could not exec /usr/lib/postgresql/8.4/bin/pg_ctl /usr/lib/postgresql/8.4/bin/pg_ctl start -D /var/lib/postgresql/8.4/main -l /var/log/postgresql/postgresql-8.4-main.log -s -o  -c config_file="/etc/postgresql/8.4/main/postgresql.conf" :                                                                                                             [fail]
Herzlichen Glückwunsch, der Server startet gar nicht - aber ohne laufenden Server ist kein Upgrade auf die bei Ubuntu 12.04 aktuelle Postgres Version 9.1 möglich.

Der direkte Aufruf von pg_ctl war auch nicht viel erfolgreicher:

/usr/lib/postgresql/8.4/bin/pg_ctl-bash: /usr/lib/postgresql/8.4/bin/pg_ctl: Datei oder Verzeichnis nicht gefunden
Die Datei ist allerdings vorhanden:
ls -l /usr/lib/postgresql/8.4/bin/pg_ctl-rwxr-xr-x 1 postgres postgres 34288 Aug 17 01:30 /usr/lib/postgresql/8.4/bin/pg_ctl
8.4 ist noch eine 32 Bit Version (zumindest in meinem Fall), der Server aber ein 64 Bit System. Da hilft nur die Installation der 32 Bit libs mit
sudo apt-get install ia32-libs
Auf diesem Server kam die freundliche Meldung:
0 aktualisiert, 351 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.Es müssen 104 MB an Archiven heruntergeladen werden.Nach dieser Operation werden 347 MB Plattenplatz zusätzlich benutzt.Möchten Sie fortfahren [J/n]?
Ich war wirklich versucht "nein, ich möchte nur das Postgres endlich wieder läuft" einzutippen, habe ich dann aber doch für das klassische "j" entschieden.

Leider brachte die Installation der i386 libs auch nicht den gewünschten Erfolg. Der alte Server läuft noch, also mache ich jetzt Feierabend - und probiere morgen weiter.

 

Noch keine Kommentare. Schreib was dazu

Schreib was dazu

Die folgenden HTML-Tags sind erlaubt:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>