Problem bei pg_dump

Hallo,

ich möchte von meinem PostgreSQL 7.3.2 auf PostgreSQL 8.1.9 umziehen.

Ich habe eine DB mit ca. 20.000 Tabellen.

Beim dump mit

pg_dump -U postgres journal | gzip > backup.gz

kommt folgende Fehlermeldung:

pg_dump: WARNING: ShmemAlloc: out of memory
pg_dump: Attempt to lock table “_001481vv” failed. ERROR: LockAcquire: lock table 1 is out of memory

Dies ist aber nicht die einzige Tabelle wo dieser Fehler auftritt. Es sind immer mal unterschiedliche.

Woran kann das liegen?

Habe schon max_locks_per_transaction auf 512 gesetzt.

Für Anregungen wäre ich dankbar.

7.3.2? Das schreit geradezu nach Problemen …

Es kann sein, das du in jedem Fall Daten verlierst.

Erster Schritt: Datenbank herunterfahren, vom Datenverzeichnis ein physikalisches Backup ziehen. Im Fall das irgendetwas nicht funktioniert, kannst du das Backup zurückspielen und das ganze noch mal probieren.

Zweiter Schritt: compilier/installier dir die letzte 7.3.x Version irgendwo in ein temporäres Verzeichnis. Installier eine Kopie des Backups dorthin und schau, ob die Datenbank damit startet.

Dritter Schritt: probiere, die Tabellen einzeln zu dumpen, ev. mit Hilfe eines Scriptes, das alle Tabellennamen ausliest und jede einzeln in eine Datei schreibt. Das hilft noch nicht als Backup, aber du kannst erst einmal feststellen, ob sich die Probleme auf bestimmte Tabellen eingrenzen lassen.

Vierter Schritt: wenn du bestimmte Tabelle(n) identifizieren kannst: schau mal, ob du per SELECT * alle Daten daraus lesen kannst.

So, wenn du damit durch bist, solltest du wissen, ob du die Daten alle erhalten kannst (ich hoffe, du hast ausser dem Backup Schritt, den ich oben empfohlhen habe, trotzdem noch Backups. Aber da pg_dump bei dir fehlschlägt, gehe ich eher nicht davon aus :frowning: ).

Wenn du eine Version updaten möchtest, sollte man das pg_dump Tool der höheren Version benutzen. Sprich, in dem Fall das von 8.1 oder vielleicht auch mal 7.4.x und 8.0.x als Zwischenschritte compilieren und benutzen.

Ach, und was ist das für eine Anwendung, die 20k Tabellen benötigt?

Neben dem, was ads sagte: Versionen vor 7.4 hatten Fehler im pg_dump. Du könntest versuchen, übers Netz mit einem pg_dump einer aktuellen Version den Dump zu ziehen.

Andreas

Hallo,

danke erstmal für eure Antworten.

@ads

Also Backups habe ich. Die Tabellen werden in jeweilige MDB Datenbanken gesichert. (Als Lösung, da der dump nicht funktioniert)

Die anderen Vorschläge sind wahrscheinlich meine letzte Rettung.

Ich werde die MDB DB`s wieder in die neue PG-SQL DB einpflegen.

Wir haben ein DB mit wir verschiedene Projekte bearbeiten. Pro Projekt sind 5 Tabellen und noch ein paar drumrum. Und bei etwas über 3000 projekten kommt man schnell auf knapp 20k tabellen.

Grüße

thohei

Das klingt a bissl nach einem kapotten Design. Firmen, die 5000 Kunden haben, legen da auch nicht für jeden eine neue Tabelle an.

Andreas

In Access Datenbanken? Oh je …
Und wie bekommt ihr die Daten dort hinein, über ODBC?

Nun, zurück zum Problem: immer einen Schritt nach dem anderen und immer darauf achten, das du ggf. den vorherigen Schritt wieder herstellen kannst.

setz den Wert NOCH höher und starte die DB auch neu (postmaster neustarten). das ist zumindest ein Tipp von Tom Lane, falls Dir der Name was sagt…

Andreas

Aber bei diesen Projekten ist es notwendig. Sonst hättest du wahrscheinlich eine Tabelle mit knapp 1.000.000 Datensätzen. Und ob das viel besser ist als 20.000 Tabellen???

Eine Million Datensätze? Das ist normalerweise kein Argument für eine vernünftig gestaltete Datenbank.

Definitiv ja.

Andreas

Hallo,

diesen Schritt würde ich gern mal probieren. Meine PGSQL Kenntnisse sind aber nicht die besten.

Wie kann ich mir die Tabellen via SQL anzeigen lassen?

Ich habe das ganze bis jetzt nur mit psql hinbekommen.

Möchte das ganze aber über ein perl Script laufen lassen.

Zwei Möglichkeiten:

psql hat diverse Commandline Optionen:

  -e              echo commands sent to server
  -E              display queries that internal commands generate

Das zeigt alle Queries an, die zum Server gesandt werden, auch die, die von psql selber generiert werden … z.B., wenn du mittels \dt dir die Tabellen anzeigen lässt.



Eine andere Möglichkeit wäre noch das information_schema:

PostgreSQL: Documentation: Manuals: PostgreSQL 8.2: The Information Schema

Das Vorgehen ist standardisiert und du kannst mittels einfacher SQL Abfragen Infos aus über deine Datenbank erhalten.

Du könntest Scripting with psql - Greg’s Postgres stuff dazu sinnentnehmend lesen. Schnellschuß:

\t
\o all_tables.copy
SELECT 'COPY ' || relname || ' TO ''' || relname || ''';' FROM pg_class WHERE relkind='r' AND NOT relname ~ '^pg_' ORDER BY relname;
\o

Das mit \i in psql laden, dann solltest Du eine Datei ‘all_tables.copy’ erhalten, die wiederum COPY-Befehle enthalten.
Die mußt Du u.U. noch a bissl editieren und kannst das dann ausführen. Ungetestet, aber das Prinzip sollte klar sein.


Andreas

Hallo ads und akretschmer,

also mit indormation_schema funktioniert nur bei der 8.1 DB bei der 7.3 hilft die Variante von akretschmer.

Viele Dank!