PostgreSQL: Wie erstelle ich eine vollständige Kopie des Datenbankschemas in derselben Datenbank?

26

Wie kann ich mein publicSchema mit vollständiger Tabellenstruktur, Daten, Funktionen, fk, pk usw. in dieselbe Datenbank kopieren?
Meine Version von Postgres ist 8,4
PS. Ich muss das Schema NICHT Datenbank kopieren

Sigra
quelle
Haben Sie mehr oder nur mehr Schemata public?
a_horse_with_no_name
Ich habe öffentliche und Demo-Schemata. Und ich muss Demo kopieren, um ein Demo-Konto zu erstellen ...
Dies wäre eine praktische Sache zu können.
Kuberchaun

Antworten:

19

Es gibt keine einfache Möglichkeit, dies in pg_dump / pg_restore selbst zu tun. Sie können Folgendes versuchen, wenn Sie die Datenbank vorübergehend entfernen können.

  1. Erstellen Sie mit pg_dump einen Speicherauszug Ihres öffentlichen Schemas
  2. führe "ALTER SCHEMA public RENAME TO public_copy" aus
  3. Stellen Sie mit pg_restore den Speicherauszug Ihres öffentlichen Schemas aus Schritt 1 wieder her
user1113185
quelle
Wie kann ich über PHP auf pg_dump und pg_restore zugreifen?
Das hängt davon ab, wo Sie die Datenbank ausführen. Sie können über die Shell auf Ihrem Server auf pg_dump und pg_restore zugreifen. Wenn Sie keinen Shell-Zugriff haben, können Sie versuchen, PHPs shell_exec zu verwenden . Andernfalls müssen Sie eine alternative Sicherungsmethode untersuchen, möglicherweise mithilfe eines PostgreSQL-GUI-Tools
1
+1 Das ist die bisher intelligenteste Lösung. Shell - Befehl würde wie folgt (sehen Sie mehr in der im Handbuch ): pg_dump -n my_schema -f '/path/to/file.pgsql' my_db. Am einfachsten als Superuser ( postgres) mit pw-weniger peerBerechtigung in pg_haba.conf. Wiederherstellen nach dem ursprünglichen Schema umbenannt: psql my_db -f '/path/to/file.pgsql'. Wenn Sie einen einfachen SQL-Speicherauszug haben, brauchen Sie nichtpg_restore .
Erwin Brandstetter
Es gibt einen einfachen Weg, siehe meine Antwort. pg_dump unterstützt die Option -n zur Auswahl eines Schemas. Bearbeiten Sie dann einfach den Schemanamen im Speicherauszug und laden Sie ihn erneut.
Scott Marlowe
2
Durch einfaches Umbenennen des Schemas werden Verweise in Funktionen nicht aktualisiert: gist.github.com/pschultz/5387172 . Das Ersetzen des Namens ist der Speicherauszug ist viel zuverlässiger, wenn Sie Ihre Suche und Ersetzung richtig machen.
Peter
9
pg_dump -n schema_name > dump.sql
vi dump.sql # edit the schema name
psql: psql -f dump.sql

Wenn du mit PHP nicht weiterkommst, dann benutze entweder Back Tics

`/usr/bin/pg_dump-n myschema mydb -U username > /tmp/dump.sql`

oder der exec () Befehl. Für die Änderung können Sie sed auf die gleiche Weise verwenden.

Hier sind noch 6 Zeichen

Scott Marlowe
quelle
1
Es ist sicherer, das Schema umzubenennen und das gesicherte Originalschema erneut zu laden, insbesondere wenn der Schemaname möglicherweise als Inhalt angezeigt wird (z public. B. ).
Artm
7

Mit pgAdmin können Sie Folgendes tun. Es ist ziemlich manuell, könnte aber alles sein, was Sie brauchen. Ein skriptbasierter Ansatz wäre viel wünschenswerter. Sie sind sich nicht sicher, wie gut dies funktioniert, wenn Sie keinen Administratorzugriff haben und Ihre Datenbank groß ist, aber für eine Entwicklungsdatenbank, die Sie gerade auf Ihrem lokalen Computer haben, problemlos funktionieren sollte.

  1. Klicken Sie mit der rechten Maustaste auf den Schemanamen, den Sie kopieren möchten, und klicken Sie auf Sichern. (Sie können tiefer gehen und wählen, nur die Struktur anstelle von beiden zu sichern).

  2. Geben Sie der Sicherungsdatei einen Namen und wählen Sie ein Format. (Ich benutze normalerweise Tar.)

  3. Klicken Sie auf Backup.

  4. Klicken Sie mit der rechten Maustaste auf das Schema, von dem Sie eine Sicherungskopie erstellt haben, und klicken Sie auf Eigenschaften. Benennen Sie es vorübergehend in ein anderes Schema um. (zB tempprename )

  5. Klicken Sie auf das Stammverzeichnis des Schemas und klicken Sie mit der rechten Maustaste darauf im Objektbrowser. Klicken Sie dann auf Neues Schema erstellen und geben Sie dem Schema den Namen public . Dies ist das Schema, in das Sie von Ihrer Sicherung kopieren.

  6. Klicken Sie mit der rechten Maustaste auf das neue Schema public aus Schritt 5. und klicken Sie auf Wiederherstellen. Stellen Sie aus der Sicherungsdatei in Schritt 3 wieder her.

  7. Benennen Sie das neue Schema public in einen anderen Namen um (z . B. newschema ).

  8. Rename Schema temprename Wechsel von Schritt 4 zurück in den ursprünglichen Namen.

Kuberchaun
quelle
Das in Schritt 5 erstellte neue Schema muss denselben Namen wie das von Ihnen gesicherte Schema haben, da pgAdmin sonst nichts wiederherstellen kann.
Cao Minh Tu
5

Du könntest benutzen

CREATE DATABASE new_db TEMPLATE = old_db;

Löschen Sie dann alle nicht benötigten Schemata:

DROP SCHEMA public CASCADE;
DROP SCHEMA other CASCADE;

Der einzige Nachteil ist , alle Verbindungen zu old_db muss bestimmt werden , bevor Sie die Kopie erstellen können (so dass der Prozess, der die läuft CREATE DATABASEAnweisung muss eine Verbindung zum Beispiel zu template1)

Wenn dies keine Option ist, ist pg_dump / pg_restore die einzige Möglichkeit, dies zu tun.

ein Pferd ohne Name
quelle
1
Bevor ich diese Frage gestellt habe, habe ich eine ähnliche Methode zum Klonen einer Datenbank verwendet. Aber es verbringt viel Zeit und ich denke, dass das Klonen von nur Schema viel schneller ist ...
@sigra: Das Klonen von a_horse ist die schnellste Methode, die für Datenbanken verfügbar ist, da die tatsächlichen Dateien nur kopiert werden können, was viel Aufwand spart. Ich bezweifle, dass ein Speicherauszug und ein erneutes Laden des Schemas schneller sein werden, es sei denn, das Schema ist nur ein kleiner Teil der gesamten Datenbank. Also, +1 für diese Antwort, auch wenn sie die tatsächlich gestellte Frage nicht beantwortet.
Erwin Brandstetter
Das Klonen eines einzelnen Schemas ist sehr aufwändig. Das Speichern des Schemas, das Umbenennen im Speicherauszug und das erneute Laden sind viel schneller.
Scott Marlowe
@ScottMarlowe: hängt davon ab, welches Schema das größte ist. Wenn der Größte einer der Abgeworfenen ist, dann stimme ich zu.
a_horse_with_no_name
2

Erweitere die Antwort auf user1113185 , hier ist ein vollständiger Workflow unter Verwendung von psql / pg_dump.

Der folgende Befehl exportiert alle Objekte von old_schemaund importiert sie in ein neues new_schemaSchema wie userin der dbnameDatenbank:

psql -U user -d dbname -c 'ALTER SCHEMA old_schema RENAME TO new_schema'
pg_dump -U user -n new_schema -f new_schema.sql dbname
psql -U user -d dbname -c 'ALTER SCHEMA new_schema RENAME TO old_schema'
psql -U user -d dbname -c 'CREATE SCHEMA new_schema'
psql -U user -q -d dbname -f new_schema.sql
rm new_schema.sql
dwelle
quelle