
Ich habe ein PostgreSQL 8.3-Datenverzeichnis-Backup. Ich muss eine Datenbank aus diesem Backup in eine neue PostgreSQL-Instanz kopieren. Aufgrund von Problemen mit dem alten Server kann ich keinen pg_dump der Datenbank durchführen.
Ich habe herausgefunden, welches Verzeichnis für die betreffende Datenbank ist. In MySQL beispielsweise müssen Sie normalerweise nur den Server herunterfahren, das Verzeichnis kopieren und neu starten, und schon ist die Datenbank verfügbar. Mit PostgreSQL funktioniert das jetzt nicht, und ich vermute, das liegt daran, dass die Datenbank nicht in der Datei global/pg_database aufgeführt ist. Diese Datei scheint automatisch generiert zu werden, wenn PostgreSQL gestartet wird. Wie kann ich dem System also mitteilen, dass die Datenbank dort ist?
Antwort1
Bitte beachten Sie, dass Ihr Cluster-Datenverzeichnis in PostgreSQL eine in sich geschlossene Einheit ist, die nicht zuverlässig in Teilen wiederhergestellt werden kann, gemäß der DokumentationHier.
Ihre beste Hoffnung besteht darin, das vollständige Datenverzeichnis des alten Servers zu verwenden und einen Server darauf zu starten. Anschließend können Sie die Wiederherstellung aus einem Dump der Datenbank durchführen, den Sie von dort erhalten:
- Bringe eine postgresql.conf die zur Konfiguration auf dem neuen Host passt zum Laufen (orientiere dich dabei an den Dateien im alten - die du hier änderst - und neuen Datenverzeichnis)
- Finden Sie den Benutzernamen des PostgreSQL-Superusers der alten Installation heraus – höchstwahrscheinlich postgres.
- Erstellen Sie diesen Benutzernamen (UNIX-Benutzer) auf dem neuen Host, sofern er dort nicht bereits vorhanden ist.
- Geben Sie (chown) diesem Benutzer das alte Datenverzeichnis, es sei denn, die UID stimmt mit der auf dem alten Server überein.
- Konfigurieren Sie pg_hba.conf im alten Datenverzeichnis, um Verbindungen von lokalen Benutzern mit demselben Postgres-Benutzernamen zuzulassen (dies ist normalerweise die Standardeinstellung, aber überprüfen Sie dies).
- Führen Sie den alten Datenbankcluster als UNIX-Benutzer mit demselben Namen wie der Superuser des alten Datenverzeichnisses aus, z. B. für den Benutzer postgres:
sudo -u postgres postgres -D old_data_directory # or with su: su postgres postgres -D old_data_directory
- Dumpen Sie die alte Datenbank, wieder mit dem üblichen Benutzernamen, postgres:
sudo -u postgres pg_dump -p /path/to/socket/for/old/directory database_name > dump_file.sql # becoming postgres with su analogous to above
- Passen Sie die dump_file.sql an die Benutzernamen usw. des neuen Servers an. Erstellen Sie dort die leere Datenbank mit den entsprechenden Eigentümern
- Scannen Sie die Datenbank in den neuen Server:
sudo -u postgres psql -p /path/to/socket/for/new/directory new_database_name # once again, getting postgres privileges using su analogous to above
Damit sollten Sie vorbereitet sein oder zumindest einen guten Weg dorthin finden.