Odpowiedzi:
Postgres pozwala na użycie dowolnej istniejącej bazy danych na serwerze jako szablonu podczas tworzenia nowej bazy danych. Nie jestem pewien, czy pgAdmin daje ci opcję w oknie dialogowym tworzenia bazy danych, ale jeśli nie, powinieneś być w stanie wykonać następujące czynności w oknie zapytania:
CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;
Mimo to możesz uzyskać:
ERROR: source database "originaldb" is being accessed by other users
Aby odłączyć wszystkich innych użytkowników od bazy danych, możesz użyć tego zapytania:
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'originaldb' AND pid <> pg_backend_pid();
Servers
-> (mój serwer) -> Databases
, kliknąć prawym przyciskiem myszy Bazy danych i wybrać „Nowa baza danych”. Jedną z opcji jest szablon, a SQL użyty do utworzenia bazy danych jest równoważny. Jest o wiele szybszy niż zrzut / przywracanie na tym samym serwerze.
Wersja odpowiedzi Bell'a z wiersza poleceń :
createdb -O ownername -T originaldb newdb
Powinno to być uruchamiane z uprawnieniami administratora bazy danych, zwykle postgres.
createdb: database creation failed: ERROR: source database "conf" is being accessed by other users
jeśli spróbujesz to zrobić na produkcyjnej bazie danych i zgodnie z oczekiwaniami nie chcesz go wyłączać, aby utworzyć kopię.
Aby sklonować istniejącą bazę danych z postgres, możesz to zrobić
/* 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;
IT zabije wszystkie połączenia ze źródłową bazą danych, unikając błędu
ERROR: source database "SOURCE_DB" is being accessed by other users
procpid
ze pid
to zadziałało
W środowisku produkcyjnym, w którym oryginalna baza danych jest obciążona ruchem, po prostu używam:
pg_dump production-db | psql test-db
pg_dump -s
? postgresql.org/docs/current/static/app-pgdump.html
$ createdb newdb
Nie wiem o pgAdmin, ale pgdump
daje zrzut bazy danych w SQL. Musisz tylko utworzyć bazę danych o tej samej nazwie i zrobić
psql mydatabase < my dump
aby przywrócić wszystkie tabele i ich dane oraz wszystkie uprawnienia dostępu.
pg_dump -U postgres sourcedb | psql -U postgres newdb
chociaż skuteczność tej techniki może być wątpliwa (ponieważ prawdopodobnie kończysz się przełączaniem kontekstu między odczytami i zapisami)
ssh dbserver pg_dump DBNAME | psql NEWDB
... lub pg_dump DBNAME | ssh otherserver pgsql NEWDB
... Uprawnienia i uwierzytelnianie oczywiście muszą być obsługiwane bez względu na to, jak chcesz je obsłużyć.
Po pierwsze, sudo
jako użytkownik bazy danych:
sudo su postgres
Przejdź do wiersza polecenia PostgreSQL:
psql
Utwórz nową bazę danych, nadaj uprawnienia i wyjdź:
CREATE DATABASE new_database_name;
GRANT ALL PRIVILEGES ON DATABASE new_database_name TO my_user;
\d
Skopiuj strukturę i dane ze starej bazy danych do nowej:
pg_dump old_database_name | psql new_database_name
\l+
. Dlaczego różnica wielkości?
Połączyłem to podejście z przykładami z góry. Pracuję na serwerze „pod obciążeniem” i dostałem błąd, gdy spróbowałem podejść z @zbyszek. Ja też szukałem rozwiązania „tylko z linii poleceń”.
createdb: database creation failed: ERROR: source database "exampledb" is being accessed by other users
.
Oto, co zadziałało dla mnie ( Polecenia poprzedzone nohup
przeniesieniem danych wyjściowych do pliku i zabezpieczeniem przed rozłączeniem serwera ):
nohup pg_dump exampledb > example-01.sql
createdb -O postgres exampledbclone_01
mój użytkownik to „postgres”
nohup psql exampledbclone_01 < example-01.sql
W pgAdmin możesz wykonać kopię zapasową z oryginalnej bazy danych, a następnie po prostu utworzyć nową bazę danych i przywrócić z utworzonej kopii zapasowej:
Jaki jest prawidłowy sposób skopiowania całej bazy danych (jej struktury i danych) do nowej w pgAdmin?
Odpowiedź:
CREATE DATABASE newdb WITH TEMPLATE originaldb;
Wypróbowany i przetestowany.
Z dokumentacji nie zaleca się używania createdb
lub używania CREATE DATABASE
szablonów:
Chociaż możliwe jest skopiowanie bazy danych innej niż template1 poprzez określenie jej nazwy jako szablonu, nie jest to (jeszcze) przeznaczone do ogólnego zastosowania narzędzie „KOPIUJ BAZĘ DANYCH”. Głównym ograniczeniem jest to, że podczas kopiowania nie można połączyć żadnych innych sesji z bazą danych szablonów. UTWÓRZ BAZA DANYCH zakończy się niepowodzeniem, jeśli jakiekolwiek inne połączenie istnieje podczas uruchamiania; w przeciwnym razie nowe połączenia z bazą danych szablonów będą blokowane do momentu ukończenia operacji UTWÓRZ BAZA DANYCH.
pg_dump
lub pg_dumpall
jest dobrym sposobem na skopiowanie bazy danych i wszystkich danych. Jeśli używasz GUI, takiego jak pgAdmin, te polecenia są wywoływane za kulisami podczas wykonywania polecenia tworzenia kopii zapasowej. Kopiowanie do nowej bazy danych odbywa się w dwóch etapach: Kopia zapasowa i Przywracanie
pg_dumpall
zapisuje wszystkie bazy danych w klastrze PostgreSQL. Wadą tego podejścia jest to, że powstaje potencjalnie bardzo duży plik tekstowy pełen kodu SQL wymagany do utworzenia bazy danych i zapełnienia danych. Zaletą tego podejścia jest to, że otrzymujesz wszystkie role (uprawnienia) dla klastra za darmo. Aby zrzucić wszystkie bazy danych, zrób to z konta administratora
pg_dumpall > db.out
i przywrócić
psql -f db.out postgres
pg_dump
ma kilka opcji kompresji, które dają znacznie mniejsze pliki. Mam produkcyjną bazę danych, której kopię zapasową tworzę dwa razy dziennie przy użyciu zadania cron
pg_dump --create --format=custom --compress=5 --file=db.dump mydatabase
gdzie compress
jest poziomem kompresji (od 0 do 9) i create
każe pg_dump
dodawać polecenia, aby utworzyć bazę danych. Przywróć (lub przenieś do nowego klastra) za pomocą
pg_restore -d newdb db.dump
gdzie newdb to nazwa bazy danych, której chcesz użyć.
PostgreSQL używa ROLES do zarządzania uprawnieniami. Nie są one kopiowane przez pg_dump
. Ponadto nie zajmowaliśmy się ustawieniami w postgresql.conf i pg_hba.conf (jeśli przenosisz bazę danych na inny serwer). Musisz samodzielnie skonfigurować ustawienia conf. Ale właśnie odkryłem sztuczkę polegającą na tworzeniu kopii zapasowych ról. Role są zarządzane na poziomie klastra i można poprosić pg_dumpall
o wykonanie kopii zapasowej tylko ról za pomocą --roles-only
przełącznika wiersza polecenia.
PostgreSQL 9.1.2:
$ CREATEDB new_db_name -T orig_db_name -O db_user;
CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;
w rezultacie wymaga, aby oryginalna baza danych była bezczynna (brak połączeń z dostępem do zapisu), a wszelkie nowe połączenia z oryginalną bazą danych były blokowane podczas kopiowania. Jeśli jesteś z tego zadowolony, to działa.
Dla tych, którzy są nadal zainteresowani, opracowałem skrypt bash, który robi (mniej więcej) to, czego chciał autor. Musiałem wykonać codzienną kopię biznesowej bazy danych w systemie produkcyjnym, ten skrypt wydaje się załatwić sprawę. Pamiętaj o zmianie wartości nazwy bazy danych / użytkownika / pw.
#!/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"
Aby utworzyć zrzut bazy danych
cd /var/lib/pgsql/
pg_dump database_name> database_name.out
Aby ponownie zrzucić zrzut bazy danych
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
Oto cały proces tworzenia kopii w bazie danych przy użyciu tylko GUI pgadmin4 (poprzez tworzenie kopii zapasowych i przywracanie)
Postgres jest dostarczany z Pgadmin4. Jeśli używasz systemu macOS, możesz nacisnąć CMD
+ SPACE
i wpisać, pgadmin4
aby go uruchomić. Spowoduje to otwarcie karty przeglądarki w chrome.
Zrób to, klikając bazę danych prawym przyciskiem myszy -> „kopia zapasowa”
Jak test12345
. Kliknij kopię zapasową. Tworzy to zrzut pliku binarnego, nie ma .sql
formatu
W prawym dolnym rogu ekranu powinno być wyskakujące okienko. Kliknij stronę „więcej szczegółów”, aby zobaczyć, gdzie została pobrana kopia zapasowa
W tym przypadku tak jest /users/vincenttang
Zakładając, że poprawnie wykonałeś kroki od 1 do 4, będziesz mieć plik binarny przywracania. Może się zdarzyć, że Twój współpracownik będzie chciał użyć pliku przywracania na swoim komputerze lokalnym. Powiedz tej osobie, aby poszła do pgadmin i przywróciła
Zrób to, klikając bazę danych prawym przyciskiem myszy -> „przywróć”
Pamiętaj, aby ręcznie wybrać lokalizację pliku, NIE przeciągaj i nie upuszczaj pliku na pola programu przesyłającego w pgadmin. Ponieważ napotkasz uprawnienia do błędu. Zamiast tego znajdź właśnie utworzony plik:
Może być konieczna zmiana filtra u dołu na „Wszystkie pliki”. Znajdź plik od kroku 4. Teraz naciśnij prawy przycisk „Wybierz”, aby potwierdzić
Ponownie zobaczysz tę stronę z wybraną lokalizacją pliku. Śmiało i przywróć go
Jeśli wszystko jest w porządku, w prawym dolnym rogu powinien wyskoczyć wskaźnik pokazujący udane przywracanie. Możesz przejść do swoich tabel, aby sprawdzić, czy dane zostały przywrócone dla każdej tabeli.
Jeśli krok 9 nie powiedzie się, spróbuj usunąć stary schemat publiczny z bazy danych. Przejdź do „Narzędzia do wysyłania zapytań”
Wykonaj ten blok kodu:
DROP SCHEMA public CASCADE; CREATE SCHEMA public;
Teraz spróbuj ponownie wykonać kroki od 5 do 9, powinno się to udać
EDYCJA - Kilka dodatkowych uwag. Zaktualizuj PGADMIN4, jeśli podczas przesyłania wystąpi błąd z czymś podobnym do „nieobsługiwanej wersji archiwizatora nagłówka 1.14” podczas przywracania
Jeśli baza danych ma otwarte połączenia, ten skrypt może pomóc. Używam tego do tworzenia testowej bazy danych z kopii zapasowej bazy danych produkcji na żywo każdej nocy. Zakłada się, że masz plik kopii zapasowej .SQL z produkcyjnej bazy danych (robię to w 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"
Za pomocą pgAdmin odłącz bazę danych, której chcesz użyć jako szablonu. Następnie wybierasz go jako szablon do utworzenia nowej bazy danych, co pozwala uniknąć błędu już używanego.
Jeśli chcesz skopiować cały schemat, możesz wykonać zrzut pg za pomocą następującego polecenia:
pg_dump -h database.host.com -d database_name -n schema_name -U database_user --password
A kiedy chcesz zaimportować ten zrzut, możesz użyć:
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
Więcej informacji na temat parametrów połączenia: https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING
Lub po prostu łącząc go w jedną wkładkę:
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”
Odłącz „szablonową” bazę danych, której chcesz użyć jako szablonu.
Uruchom 2 zapytania, jak poniżej
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TemplateDB' AND pid <> pg_backend_pid();
(Powyższa instrukcja SQL zakończy wszystkie aktywne sesje z TemplateDB, a następnie możesz ją teraz wybrać jako szablon do utworzenia nowej bazy danych TargetDB, co pozwoli uniknąć błędu już używanego).
CREATE DATABASE 'TargetDB'
WITH TEMPLATE='TemplateDB'
CONNECTION LIMIT=-1;
Spróbuj tego:
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