Antworten:
Postgres ermöglicht die Verwendung einer auf dem Server vorhandenen Datenbank als Vorlage beim Erstellen einer neuen Datenbank. Ich bin nicht sicher, ob pgAdmin Ihnen die Option im Dialogfeld "Datenbank erstellen" bietet, aber Sie sollten in der Lage sein, Folgendes in einem Abfragefenster auszuführen, wenn dies nicht der Fall ist:
CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;
Dennoch können Sie erhalten:
ERROR: source database "originaldb" is being accessed by other users
Um alle anderen Benutzer von der Datenbank zu trennen, können Sie folgende Abfrage verwenden:
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'originaldb' AND pid <> pg_backend_pid();
Servers
-> (mein Server) -> Databases
auswählen, mit der rechten Maustaste auf Datenbanken klicken und "Neue Datenbank" auswählen. Eine der Optionen ist die Vorlage, und das zum Erstellen der Datenbank verwendete SQL ist äquivalent. Es ist so viel schneller als ein Dump / Restore auf demselben Server.
Eine Befehlszeilenversion von Bells Antwort :
createdb -O ownername -T originaldb newdb
Dies sollte unter den Berechtigungen des Datenbankmasters ausgeführt werden, normalerweise postgres.
createdb: database creation failed: ERROR: source database "conf" is being accessed by other users
wenn Sie versuchen, ihn in einer Produktionsdatenbank auszuführen, und Sie ihn erwartungsgemäß nicht herunterfahren möchten, um eine Kopie zu erstellen.
Um eine vorhandene Datenbank mit Postgres zu klonen, können Sie dies tun
/* KILL ALL EXISTING CONNECTION FROM ORIGINAL DB (sourcedb)*/
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'SOURCE_DB' AND pid <> pg_backend_pid();
/* CLONE DATABASE TO NEW ONE(TARGET_DB) */
CREATE DATABASE TARGET_DB WITH TEMPLATE SOURCE_DB OWNER USER_DB;
Die IT beendet die gesamte Verbindung zur Quelldatenbank, um den Fehler zu vermeiden
ERROR: source database "SOURCE_DB" is being accessed by other users
procpid
mit pid
für diese Arbeit
In einer Produktionsumgebung, in der die ursprüngliche Datenbank unter Datenverkehr steht, verwende ich einfach:
pg_dump production-db | psql test-db
pg_dump -s
? postgresql.org/docs/current/static/app-pgdump.html
$ createdb newdb
Sie kennen pgAdmin nicht, pgdump
geben Ihnen jedoch einen Speicherauszug der Datenbank in SQL. Sie müssen nur eine Datenbank mit demselben Namen erstellen und dies tun
psql mydatabase < my dump
um alle Tabellen und ihre Daten sowie alle Zugriffsrechte wiederherzustellen.
pg_dump -U postgres sourcedb | psql -U postgres newdb
obwohl die Effizienz dieser Technik fraglich sein kann (da Sie wahrscheinlich den Kontext zwischen Lesen und Schreiben wechseln)
ssh dbserver pg_dump DBNAME | psql NEWDB
... oder pg_dump DBNAME | ssh otherserver pgsql NEWDB
... Berechtigungen und Authentifizierung müssen natürlich behandelt werden, wie Sie möchten.
Erstens sudo
als Datenbankbenutzer:
sudo su postgres
Gehen Sie zur PostgreSQL-Befehlszeile:
psql
Erstellen Sie die neue Datenbank, geben Sie die Rechte ein und beenden Sie:
CREATE DATABASE new_database_name;
GRANT ALL PRIVILEGES ON DATABASE new_database_name TO my_user;
\d
Kopieren Sie Struktur und Daten aus der alten Datenbank in die neue:
pg_dump old_database_name | psql new_database_name
\l+
. Warum der Größenunterschied?
Ich habe diesen Ansatz mit den Beispielen von oben zusammengesetzt. Ich arbeite an einem "unter Last" -Server und habe den Fehler erhalten, als ich den Ansatz von @zbyszek aus versuchte. Ich war auch nach einer "Kommandozeilen" -Lösung.
createdb: database creation failed: ERROR: source database "exampledb" is being accessed by other users
.
Folgendes hat beinohup
mir funktioniert ( Befehle, denen vorangestellt wurde , um die Ausgabe in eine Datei zu verschieben und vor einer Server-Trennung zu schützen ):
nohup pg_dump exampledb > example-01.sql
createdb -O postgres exampledbclone_01
Mein Benutzer ist "postgres"
nohup psql exampledbclone_01 < example-01.sql
In pgAdmin können Sie eine Sicherungskopie von Ihrer ursprünglichen Datenbank erstellen und dann einfach eine neue Datenbank erstellen und aus der soeben erstellten Sicherung wiederherstellen:
Was ist der richtige Weg, um die gesamte Datenbank (ihre Struktur und Daten) in eine neue in pgAdmin zu kopieren?
Antworten:
CREATE DATABASE newdb WITH TEMPLATE originaldb;
Ausprobiert und getestet.
Aus der Dokumentation geht hervor , dass die Verwendung von createdb
oder CREATE DATABASE
mit Vorlagen nicht empfohlen wird:
Obwohl es möglich ist, eine andere Datenbank als template1 zu kopieren, indem der Name als Vorlage angegeben wird, ist dies (noch) nicht als allgemeine Funktion zum Kopieren von Datenbanken gedacht. Die Hauptbeschränkung besteht darin, dass während des Kopierens keine anderen Sitzungen mit der Vorlagendatenbank verbunden werden können. CREATE DATABASE schlägt fehl, wenn beim Start eine andere Verbindung besteht. Andernfalls werden neue Verbindungen zur Vorlagendatenbank gesperrt, bis CREATE DATABASE abgeschlossen ist.
pg_dump
oder pg_dumpall
ist ein guter Weg, um die Datenbank und alle Daten zu kopieren. Wenn Sie eine GUI wie pgAdmin verwenden, werden diese Befehle hinter den Kulissen aufgerufen, wenn Sie einen Sicherungsbefehl ausführen. Das Kopieren in eine neue Datenbank erfolgt in zwei Phasen: Sichern und Wiederherstellen
pg_dumpall
speichert alle Datenbanken im PostgreSQL-Cluster. Der Nachteil dieses Ansatzes besteht darin, dass Sie eine möglicherweise sehr große Textdatei mit SQL erhalten, die zum Erstellen der Datenbank und zum Auffüllen der Daten erforderlich ist. Der Vorteil dieses Ansatzes besteht darin, dass Sie alle Rollen (Berechtigungen) für den Cluster kostenlos erhalten. Um alle Datenbanken zu sichern, führen Sie dies über das Superuser-Konto aus
pg_dumpall > db.out
und wiederherzustellen
psql -f db.out postgres
pg_dump
hat einige Komprimierungsoptionen, die Ihnen viel kleinere Dateien geben. Ich habe eine Produktionsdatenbank, die ich zweimal täglich mit einem Cron-Job sichere
pg_dump --create --format=custom --compress=5 --file=db.dump mydatabase
Wo compress
ist die Komprimierungsstufe (0 bis 9) und create
sagtpg_dump
an, Befehle zum Erstellen der Datenbank hinzuzufügen. Wiederherstellen (oder Verschieben in einen neuen Cluster) mithilfe von
pg_restore -d newdb db.dump
Dabei ist newdb der Name der Datenbank, die Sie verwenden möchten.
PostgreSQL verwendet ROLES zum Verwalten von Berechtigungen. Diese werden nicht von kopiert pg_dump
. Außerdem haben wir uns nicht mit den Einstellungen in postgresql.conf und pg_hba.conf befasst (wenn Sie die Datenbank auf einen anderen Server verschieben). Sie müssen die conf-Einstellungen selbst herausfinden. Aber es gibt einen Trick, den ich gerade entdeckt habe, um Rollen zu sichern. Rollen werden auf Clusterebene verwaltet, und Sie können pg_dumpall
mit dem --roles-only
Befehlszeilenschalter die Sicherung nur der Rollen anfordern.
PostgreSQL 9.1.2:
$ CREATEDB new_db_name -T orig_db_name -O db_user;
CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;
die ursprüngliche Datenbank inaktiv sein muss (keine Verbindungen mit Schreibzugriff) und neue Verbindungen zur ursprünglichen Datenbank während des Kopiervorgangs verhindert werden. Wenn Sie damit zufrieden sind, funktioniert dies.
Für diejenigen, die noch interessiert sind, habe ich ein Bash-Skript entwickelt, das (mehr oder weniger) das tut, was der Autor wollte. Ich musste eine tägliche Kopie der Geschäftsdatenbank auf einem Produktionssystem erstellen, dieses Skript scheint den Trick zu tun. Denken Sie daran, die Werte für Datenbankname / Benutzer / pw zu ändern.
#!/bin/bash
if [ 1 -ne $# ]
then
echo "Usage `basename $0` {tar.gz database file}"
exit 65;
fi
if [ -f "$1" ]
then
EXTRACTED=`tar -xzvf $1`
echo "using database archive: $EXTRACTED";
else
echo "file $1 does not exist"
exit 1
fi
PGUSER=dbuser
PGPASSWORD=dbpw
export PGUSER PGPASSWORD
datestr=`date +%Y%m%d`
dbname="dbcpy_$datestr"
createdbcmd="CREATE DATABASE $dbname WITH OWNER = postgres ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' CONNECTION LIMIT = -1;"
dropdbcmp="DROP DATABASE $dbname"
echo "creating database $dbname"
psql -c "$createdbcmd"
rc=$?
if [[ $rc != 0 ]] ; then
rm -rf "$EXTRACTED"
echo "error occured while creating database $dbname ($rc)"
exit $rc
fi
echo "loading data into database"
psql $dbname < $EXTRACTED > /dev/null
rc=$?
rm -rf "$EXTRACTED"
if [[ $rc != 0 ]] ; then
psql -c "$dropdbcmd"
echo "error occured while loading data to database $dbname ($rc)"
exit $rc
fi
echo "finished OK"
So erstellen Sie einen Datenbankspeicherauszug
cd /var/lib/pgsql/
pg_dump database_name> database_name.out
So setzen Sie den Datenbankspeicherauszug zurück
psql -d template1
CREATE DATABASE database_name WITH ENCODING 'UTF8' LC_CTYPE 'en_US.UTF-8' LC_COLLATE 'en_US.UTF-8' TEMPLATE template0;
CREATE USER role_name WITH PASSWORD 'password';
ALTER DATABASE database_name OWNER TO role_name;
ALTER USER role_name CREATEDB;
GRANT ALL PRIVILEGES ON DATABASE database_name to role_name;
CTR+D(logout from pgsql console)
cd /var/lib/pgsql/
psql -d database_name -f database_name.out
Hier ist der gesamte Vorgang zum Erstellen eines Kopierens über eine Datenbank nur mit der pgadmin4-GUI (über Sicherung und Wiederherstellung).
Postgres wird mit Pgadmin4 geliefert. Wenn Sie macOS verwenden, können Sie CMD
+ drücken SPACE
und eingeben pgadmin4
, um es auszuführen. Dadurch wird eine Browser-Registerkarte in Chrome geöffnet.
Klicken Sie dazu mit der rechten Maustaste auf die Datenbank -> "Backup"
Wie test12345
. Klicken Sie auf Sichern. Dadurch wird ein Binärdateidump erstellt, der nicht in einem .sql
Format vorliegt
Unten rechts auf Ihrem Bildschirm sollte sich ein Popup befinden. Klicken Sie auf die Seite "Weitere Details", um zu sehen, wohin Ihr Backup heruntergeladen wurde
In diesem Fall ist es /users/vincenttang
Angenommen, Sie haben die Schritte 1 bis 4 korrekt ausgeführt, haben Sie eine Wiederherstellungs-Binärdatei. Es kann vorkommen, dass Ihr Mitarbeiter Ihre Wiederherstellungsdatei auf seinem lokalen Computer verwenden möchte. Habe gesagt, Person gehe zu pgadmin und stelle wieder her
Klicken Sie dazu mit der rechten Maustaste auf die Datenbank -> "Wiederherstellen"
Stellen Sie sicher, dass Sie den Speicherort der Datei manuell auswählen. Ziehen Sie eine Datei NICHT per Drag & Drop auf die Uploader-Felder in pgadmin. Weil Sie auf Fehlerberechtigungen stoßen. Suchen Sie stattdessen die gerade erstellte Datei:
Möglicherweise müssen Sie den Filter unten rechts auf "Alle Dateien" ändern. Suchen Sie die Datei danach ab Schritt 4. Klicken Sie nun zur Bestätigung auf die untere rechte Schaltfläche "Auswählen"
Diese Seite wird erneut mit dem Speicherort der ausgewählten Datei angezeigt. Fahren Sie fort und stellen Sie es wieder her
Wenn alles in Ordnung ist, sollte unten rechts ein Indikator für eine erfolgreiche Wiederherstellung angezeigt werden. Sie können zu Ihren Tabellen navigieren, um festzustellen, ob die Daten für jede Tabelle ordnungsgemäß wiederhergestellt wurden.
Sollte Schritt 9 fehlschlagen, löschen Sie Ihr altes öffentliches Schema in Ihrer Datenbank. Gehen Sie zu "Abfrage-Tool"
Führen Sie diesen Codeblock aus:
DROP SCHEMA public CASCADE; CREATE SCHEMA public;
Versuchen Sie nun die Schritte 5 bis 9 erneut, es sollte funktionieren
BEARBEITEN - Einige zusätzliche Hinweise. Aktualisieren Sie PGADMIN4, wenn beim Hochladen eine Fehlermeldung angezeigt wird, die der Wiederherstellung entspricht
Wenn die Datenbank offene Verbindungen hat, kann dieses Skript helfen. Ich verwende dies, um jede Nacht eine Testdatenbank aus einer Sicherung der Live-Produktionsdatenbank zu erstellen. Dies setzt voraus, dass Sie eine .SQL-Sicherungsdatei aus der Produktionsdatenbank haben (ich mache das in webmin).
#!/bin/sh
dbname="desired_db_name_of_test_enviroment"
username="user_name"
fname="/path to /ExistingBackupFileOfLive.sql"
dropdbcmp="DROP DATABASE $dbname"
createdbcmd="CREATE DATABASE $dbname WITH OWNER = $username "
export PGPASSWORD=MyPassword
echo "**********"
echo "** Dropping $dbname"
psql -d postgres -h localhost -U "$username" -c "$dropdbcmp"
echo "**********"
echo "** Creating database $dbname"
psql -d postgres -h localhost -U "$username" -c "$createdbcmd"
echo "**********"
echo "** Loading data into database"
psql -d postgres -h localhost -U "$username" -d "$dbname" -a -f "$fname"
Trennen Sie mit pgAdmin die Datenbank, die Sie als Vorlage verwenden möchten. Anschließend wählen Sie es als Vorlage zum Erstellen der neuen Datenbank aus. Dadurch wird vermieden, dass der bereits verwendete Fehler angezeigt wird.
Wenn Sie das gesamte Schema kopieren möchten, können Sie mit dem folgenden Befehl einen pg_dump erstellen:
pg_dump -h database.host.com -d database_name -n schema_name -U database_user --password
Und wenn Sie diesen Speicherauszug importieren möchten, können Sie Folgendes verwenden:
psql "host=database.host.com user=database_user password=database_password dbname=database_name options=--search_path=schema_name" -f sql_dump_to_import.sql
Weitere Informationen zu Verbindungszeichenfolgen: https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING
Oder kombinieren Sie es einfach in einem Liner:
pg_dump -h database.host.com -d postgres -n schema_name -U database_user --password | psql "host=database.host.com user=database_user password=database_password dbname=database_name options=--search_path=schema_name”
Trennen Sie die Datenbank mit Vorlagen, die Sie als Vorlage verwenden möchten.
Führen Sie 2 Abfragen wie folgt aus
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TemplateDB' AND pid <> pg_backend_pid();
(Die obige SQL-Anweisung beendet alle aktiven Sitzungen mit TemplateDB. Anschließend können Sie sie als Vorlage zum Erstellen der neuen TargetDB-Datenbank auswählen. Dadurch wird vermieden, dass der bereits verwendete Fehler angezeigt wird.)
CREATE DATABASE 'TargetDB'
WITH TEMPLATE='TemplateDB'
CONNECTION LIMIT=-1;
Versuche dies:
CREATE DATABASE newdb WITH ENCODING='UTF8' OWNER=owner TEMPLATE=templatedb LC_COLLATE='en_US.UTF-8' LC_CTYPE='en_US.UTF-8' CONNECTION LIMIT=-1;
gl XD